欢迎访问宙启技术站
智能推送

使用Java函数构建基于TCP协议的网络通信程序

发布时间:2023-06-18 10:31:55

TCP 协议是一种面向连接的协议,通信双方在传送数据之前必须建立一条连接。连接建立后,在连接保持期间的所有数据传送都可靠地进行。TCP 是传输层协议,提供了验证和传输数据的可靠性。在一个 TCP 连接中,数据可以在任何一个方向上进行发送,因为在连接建立之前两端都已互相通知对方它们所能接受的数据和数据缓冲区大小。

1. 建立连接

Java 中使用 Socket 类与远程主机建立 TCP 连接。该类包含三个构造函数:

Socket(String host, int port)

Socket(InetAddress address, int port)

Socket(String host, int port, InetAddress localAddr, int localPort)

其中,host 是服务器主机名或 IP 地址,port 是端口号,localAddr 和 localPort 是客户机的 IP 地址和端口号。如果指定 localAddr 和 localPort,则在连接服务器时将使用指定的地址和端口号。

2. 发送和接收数据

在连接成功建立之后,可以使用输入和输出流进行数据的读取和写入。

OutputStream out = socket.getOutputStream();  

PrintWriter writer = new PrintWriter(out, true);  

writer.println(message);  // 发送数据  

InputStream in = socket.getInputStream();  

BufferedReader reader = new BufferedReader(new InputStreamReader(in));  

String response = reader.readLine();  // 接收数据  

3. 关闭连接

当通信完成后,应当关闭 Socket 连接。

socket.close();

完整代码示例:

import java.net.*;  

import java.io.*;  

public class TCPClient {  

    public static void main(String[] args) {  

        String serverName = args[0];  

        int port = Integer.parseInt(args[1]);  

        try {  

            System.out.println("连接到主机:" + serverName + " ,端口号:" + port);  

            Socket socket = new Socket(serverName, port);  

            System.out.println("远程主机地址:" + socket.getRemoteSocketAddress());  

            OutputStream out = socket.getOutputStream();  

            PrintWriter writer = new PrintWriter(out, true);  

            writer.println("Hello, World!");  

            InputStream in = socket.getInputStream();  

            BufferedReader reader = new BufferedReader(new InputStreamReader(in));  

            System.out.println("服务器响应:" + reader.readLine());  

            socket.close();  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

    }  

}  

import java.net.*;  

import java.io.*;  

public class TCPServer extends Thread {  

    private ServerSocket serverSocket;  

    public TCPServer(int port) throws IOException {  

        serverSocket = new ServerSocket(port);  

        serverSocket.setSoTimeout(10000);  

    }  

    public void run() {  

        while(true) {  

            try {  

                System.out.println("等待客户端连接,端口号为:" + serverSocket.getLocalPort() + " ...");  

                Socket server = serverSocket.accept();  

                System.out.println("远程主机地址:" + server.getRemoteSocketAddress());  

                BufferedReader reader = new BufferedReader(new InputStreamReader(server.getInputStream()));  

                String message = reader.readLine();  

                System.out.println("收到客户端消息:" + message);  

                OutputStream out = server.getOutputStream();  

                PrintWriter writer = new PrintWriter(out, true);  

                writer.println("已收到信息:" + message);  

            } catch (SocketTimeoutException e) {  

                System.out.println("Socket timed out!");  

                break;  

            } catch (IOException e) {  

                e.printStackTrace();  

                break;  

            }  

        }  

    }  

    public static void main(String[] args) {  

        int port = Integer.parseInt(args[0]);  

        try {  

            Thread t = new TCPServer(port);  

            t.start();  

        } catch (IOException e) {  

            e.printStackTrace();  

        }  

    }  

}  

以上示例为基于 Java 的 TCP 网络通信程序,通过 Socket 类进行连接建立和关闭、数据发送和接收,同时通过使用线程使得服务器能同时处理多个客户端。