Java基于TCP/IP协议的Socket网络通信详解

TCP/IP

TCP/IP是一种可靠的网络协议,在通信两端个简历一个Socket,形成虚拟链路,进行通信。
通信端通过Socket产生I/O流来进行网络通信。

这里写图片描述

特点

  • IP协议负责传递消息,TCP提供可靠的无差错的通信服务。
  • TCP协议是一种端对端协议。链接两个通信端,建立用于发送和接收数据的虚拟链路。
  • TCP负责接收IP协议传送的信息包,按次序放好,接收端接收后正还原。保证了数据包在传送中准确无误。
  • TCP使用重发机制:当一个通信实体发送一个消息给另一个通信实体,收到消息的通信实体确认信息,如果没有收到确认信息,会再次重新发送刚才的消息。

使用ServerSocket创建TCP服务端

在两个通信实体没有建立虚拟链路之前,必须有一个通信实体主动接收来自其他通信实体的链接请求。
Java中类ServerSocket用于监听来自客户端的链接请求。

public class SocketServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(30000);//创建ServerSocket,指定端口号30000 
        int i = 0;
        while (true) {
            i++;
            Socket s = ss.accept();//接收Socket请求
            //向客户端发送输出流
            OutputStream os = s.getOutputStream();
            os.write((" 服务器的第" + i + "条数据!\n").getBytes("utf-8"));
            System.out.println("客户端请求" + i + "次!");
             //接收客户端发送输入流
            BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream(), "utf-8"));
            String string = br.readLine();
            System.out.println(string);

            os.close();//关闭流
            s.close();//关闭ServerSocket
            br.close();//关闭流

        }
    }
}

直接在Java IDE中编译运行以上程序,会在本机的IP地址3000端口号上创建一个服务端。

使用Socket创建TCP客户端进行通信

public class SocketClient {
    public static String line = null;

    public static void main(String[] args) throws IOException {
        //异步任务
        FutureTask task = new FutureTask(new Callable() {
            @Override
            public String call() throws Exception {
                Socket socket = null;
                try {
                   //Socket构造器链接指定服务器
                    socket = new Socket("192.168.199.100", 30000);//192.168.199.100本机IP地址
                    //向服务端发送数据流
                    OutputStream os = socket.getOutputStream();
                    os.write("客户端发送的数据".getBytes("utf-8"));

                    //接收服务端的数据流
                    InputStreamReader isr = new InputStreamReader(socket.getInputStream(), "utf-8");
                    BufferedReader br = new BufferedReader(isr);
                    line = br.readLine();
                    System.out.println(line);

                    os.close();//关闭流
                    isr.close();//关闭流
                    br.close();//关闭流
                    socket.close();//关闭Socket
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return line;
            }

        });
        new Thread(task).start();
    }
}

直接在Java IDE中编译,每执行一次便向服务端发送一次请求。服务端做出一次响应,并接收客户端发送的数据。

获取本机IP地址

直接命令行输入:ipconfig
当前连接网络的IPv4地址就是,如下体红框所示。

这里写图片描述

运行效果

PS:必须先执行服务端程序,再执行客户端程序,否则客户端会提示找不到服务端地址。

执行服务端后,连续执行3次客户端,效果如下:
这里写图片描述这里写图片描述

你可能感兴趣的:(#,Java笔记)