• java 网络编程Socket


    1.概述

    计算机网络:
    把分布在不同地理区域的计算机与专门的外部设备用通信线路互连成一个规
    模大、功能强的网络系统,从而使众多的计算机可以方便地互相传递信息、
    共享硬件、软件、数据信息等资源。
    网络编程的目的:
    直接或间接地通过网络协议与其它计算机实现数据交换,进行通讯。
    网络编程中有两个主要的问题:
    如何准确地定位网络上一台或多台主机;定位主机上的特定的应用
    找到主机后如何可靠高效地进行数据传输

     2.InetAdress

    InetAddress 类没有提供公共的构造器,而是提供了如下几个静态方法来获取
    InetAddress 实例
            public static InetAddress getLocalHost()
            public static InetAddress getByName(String host)
    InetAddress 提供了如下几个常用的方法
            public String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。        
            public String getHostName() 获取此 IP 地址的主机名
            public boolean isReachable(int timeout) 测试是否可以达到该地址

     2.Socket

    Socket 类的常用构造器:
    public Socket(InetAddress address,int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
    public Socket(String host,int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
    Socket 类的常用方法:
    public InputStream getInputStream() 返回此套接字的输入流。可以用于接收网络消息
    public OutputStream getOutputStream() 返回此套接字的输出流。可以用于发送网络消息
    public InetAddress getInetAddress() 此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null
    public InetAddress getLocalAddress() 获取套接字绑定的本地地址。 即本端的 IP 地址
    public int getPort() 此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0
    public int getLocalPort() 返回此套接字绑定到的本地端口。 如果尚未绑定套接字,则返回 -1 。即本端的 端口号。
    public void close() 关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接 或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream 和 OutputStream。
    public void shutdownInput() 如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将 返回 EOF (文件结束符)。 即不能在从此套接字的输入流中接收任何数据。
    public void shutdownOutput() 禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发 送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流, 则该流将抛出 IOException 。 即不能通过此套接字的输出流发送任何数据。

    2.1基于SocketTCP编程

    服务器程序的工作过程包含以下四个基本的步骤:
    1、调用 ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口
    上。用于监听客户端的请求。
    2、调用 accept() 监听连接请求,如果客户端请求连接,则接受连接,返回通信
    套接字对象。
    3、调用 该 Socket 类对象的 getOutputStream() getInputStream () 获取输出
    流和输入流,开始网络数据的发送和接收。
    4、关闭 ServerSocket Socket 对象: 客户端访问结束,关闭通信套接字
    • 案例演示
    实现客户端发送消息给服务器
    1. /**
    2. * 模拟客户端
    3. */
    4. public class Client {
    5. public static void main(String[] args) throws UnknownHostException {
    6. Socket socket=null;
    7. OutputStream outputStream=null;
    8. try {
    9. //1、 创建socket对象 指明服务器ip地址和端口号
    10. InetAddress inet=InetAddress.getByName("localhost");//调用的地址
    11. socket=new Socket(inet,9999);//调用的端口
    12. //2、获取一个输入流 用于输出数据
    13. outputStream= socket.getOutputStream();
    14. //3、写入数据
    15. outputStream.write("客户端xxxx发送".getBytes(StandardCharsets.UTF_8));
    16. } catch (Exception e) {
    17. e.printStackTrace();
    18. } finally {
    19. //4、关闭资源
    20. try{
    21. if (outputStream!=null)
    22. outputStream.close();
    23. }catch (Exception e){
    24. e.printStackTrace();
    25. }
    26. try{
    27. if (socket!=null)
    28. socket.close();
    29. }catch (Exception e){
    30. e.printStackTrace();
    31. }
    32. }
    33. // System.out.println(InetAddress.getLocalHost());
    34. }
    35. }
    1. /**
    2. * 服务端(先开启)
    3. */
    4. public class Server {
    5. public static void main(String[] args) throws IOException {
    6. InputStream inputStream=null;
    7. ServerSocket socketServer=new ServerSocket(9999);//设置服务器端口
    8. Socket accept = socketServer.accept();//获取获取 客户端的消息 获取sicket对象
    9. inputStream = accept.getInputStream();//将消息写入流
    10. int len;
    11. byte [] buf=new byte[5];
    12. ByteArrayOutputStream arrayOutputStream=new ByteArrayOutputStream();
    13. //将网络传输的流读取下来
    14. while ((len=inputStream.read(buf))!=-1){
    15. arrayOutputStream.write(buf,0,len);
    16. }
    17. System.out.println(accept.getInetAddress());
    18. System.out.println(arrayOutputStream.toString("utf-8"));
    19. //关闭资源
    20. arrayOutputStream.close();
    21. inputStream.close();
    22. accept.close();
    23. socketServer.close();
    24. }
    25. }
    • 案例演示

    实现客户端服务器发送文件 并发通知

    1. /**
    2. * 网络 发送文件 将文件上传
    3. */
    4. public class ClentToFile {
    5. public static void main(String[] args) throws Exception {
    6. //创建网络通信
    7. Socket socket = null;
    8. //创建 输出流 写入网络通信
    9. OutputStream outputStream = null;
    10. //指定要传输的对象
    11. socket = new Socket("127.0.0.1", 9999);
    12. outputStream = socket.getOutputStream();
    13. //获取 要传输的 文件流
    14. FileInputStream fileInputStream = new FileInputStream(new File("E:\\springboot_dome\\IOdome\\dbcp.txt"));
    15. byte[] buf = new byte[5];
    16. int len;
    17. while ((len = fileInputStream.read(buf)) != -1) {
    18. //把输入流 写到 网络通信的输出流
    19. outputStream.write(buf, 0, len);
    20. }
    21. System.out.println("图片传输完成");
    22. //关闭数据流传输 告诉服务器我的数据流传输完成
    23. socket.shutdownOutput();
    24. //5.收到源自服务器的数据,打印纸控制台
    25. InputStream atServerStream= socket.getInputStream();
    26. ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
    27. byte[] bufc = new byte[5];
    28. int lenc;
    29. while ((lenc=atServerStream.read(bufc))!=-1){
    30. byteArrayOutputStream.write(bufc,0,lenc);
    31. }
    32. System.out.println(byteArrayOutputStream.toString());
    33. //建议用try catch
    34. outputStream.close();
    35. fileInputStream.close();
    36. socket.close();
    37. byteArrayOutputStream.close();
    38. atServerStream.close();
    39. }
    40. }
    1. /**
    2. * 网络 发送文件 将文件下载
    3. */
    4. public class ServerToFile {
    5. public static void main(String[] args)throws Exception {
    6. ServerSocket serverSocket=new ServerSocket(9999);
    7. InputStream inputStream=null;
    8. Socket accept = serverSocket.accept();
    9. inputStream = accept.getInputStream();
    10. // 文件写出的目标文件
    11. FileOutputStream fileOutputStream=new FileOutputStream("SocketFile1.txt");
    12. byte [] buf=new byte[1024];
    13. int len;
    14. while ((len=inputStream.read(buf))!=-1){
    15. fileOutputStream.write(buf,0,len);
    16. }
    17. //服务器反馈给客户端信息
    18. OutputStream osToClient= accept.getOutputStream();
    19. osToClient.write("服务器已收到".getBytes(StandardCharsets.UTF_8));
    20. fileOutputStream.close();
    21. inputStream.close();
    22. serverSocket.close();
    23. osToClient.close();
    24. accept.close();
    25. }
    26. }

  • 相关阅读:
    项目常遇到的问题
    C++语法基础知识面经汇总
    数据仓库与ETL
    ACM-BCB2019 | SMILES-BERT:基于大规模无监督预训练的分子属性预测模型
    基于javaWeb的毕业生论文管理系统——计算机毕业设计
    第46届ICPC东亚洲区域赛(昆明)补题题解 (B)
    程序人生:从小公司到一线大厂,薪资翻倍,我做到了...
    腾讯面试——自然语言处理
    王坚院士:云计算与 GPT 的关系,就是电和电动机的关系
    Online Schema Change(在线更新元数据)
  • 原文地址:https://blog.csdn.net/weixin_53472653/article/details/125415727