关于人工智能:62-Socket编程

2次阅读

共计 3912 个字符,预计需要花费 10 分钟才能阅读完成。

1. 什么是 Socket?

Socket(套接字)是计算机网络中实现应用程序之间数据通信的一种形式。它为应用程序提供了发送和接收数据的接口。在 Java 中,java.net包提供了 Socket 类和相干的类,用于实现网络编程。

2. 应用 Socket 建设 TCP 连贯

在 Java 中,咱们应用 java.net.Socket 类和 java.net.ServerSocket 类来实现基于 TCP 的客户端和服务器之间的通信。以下是一个简略的步骤:

  • 服务器端

    1. 创立一个 ServerSocket 对象,指定监听的端口号。
    2. 调用 accept 办法期待客户端连贯。
    3. 获取客户端的 Socket 对象,进行通信。
    4. 敞开资源。
  • 客户端

    1. 创立一个 Socket 对象,指定服务器的地址和端口号。
    2. 通过 Socket 对象的输出 / 输入流与服务器通信。
    3. 敞开资源。

3. Socket 编程实例

上面是一个简略的客户端和服务器之间通信的示例。这个示例中,客户端向服务器发送一个字符串,服务器将字符串转换为大写并返回给客户端。

服务器端代码

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {public static void main(String[] args) {
        int port = 8080;

        try (ServerSocket serverSocket = new ServerSocket(port)) {System.out.println("服务器启动,期待客户端连贯...");

            while (true) {Socket socket = serverSocket.accept();
                new Thread(new ClientHandler(socket)).start();}
        } catch (IOException e) {e.printStackTrace();
        }
    }
}

class ClientHandler implements Runnable {
    private Socket socket;

    public ClientHandler(Socket socket) {this.socket = socket;}

    @Override
    public void run() {try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true)) {

            String inputLine;
            while ((inputLine = in.readLine()) != null) {System.out.println("客户端发送音讯:" + inputLine);
                out.println(inputLine.toUpperCase());
            }
        } catch (IOException e) {e.printStackTrace();
        }
    }
}

客户端代码

import java.io.*;
import java.net.Socket;

public class TCPClient {public static void main(String[] args) {
        String host = "localhost";
        int port = 8080;

        try (Socket socket = new Socket(host, port);
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {

            String userInput;
            while ((userInput = stdIn.readLine()) != null) {out.println(userInput);
                System.out.println("服务器响应:" + in.readLine());
            }
        } catch (IOException e) {e.printStackTrace();
        }
    }
}

4. 应用 DatagramSocket 进行 UDP 编程

与基于 TCP 的 Socket 编程不同,UDP 编程应用 java.net.DatagramSocket 类和 java.net.DatagramPacket 类来实现数据报文的发送和接管。

以下是一个简略的 UDP 编程示例,客户端向服务器发送一个字符串,服务器将字符串转换为大写并返回给客户端。

服务器端代码

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPServer {public static void main(String[] args) {
        int port = 8080;

        try (DatagramSocket socket = new DatagramSocket(port)) {byte[] buf = new byte[256];
            DatagramPacket packet = new DatagramPacket(buf, buf.length);

            System.out.println("服务器启动,期待客户端发送数据...");

            while (true) {socket.receive(packet);
                String received = new String(packet.getData(), 0, packet.getLength());
                System.out.println("客户端发送音讯:" + received);

                String response = received.toUpperCase();
                byte[] responseBytes = response.getBytes();
                InetAddress address = packet.getAddress();
                int clientPort = packet.getPort();
                DatagramPacket responsePacket = new DatagramPacket(responseBytes, responseBytes.length, address, clientPort);
                socket.send(responsePacket);
            }
        } catch (IOException e) {e.printStackTrace();
        }
    }
}

客户端代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDPClient {public static void main(String[] args) {
        String host = "localhost";
        int port = 8080;

        try (DatagramSocket socket = new DatagramSocket();
             BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {InetAddress address = InetAddress.getByName(host);

            String userInput;
            while ((userInput = stdIn.readLine()) != null) {byte[] buf = userInput.getBytes();
                DatagramPacket requestPacket = new DatagramPacket(buf, buf.length, address, port);
                socket.send(requestPacket);

                byte[] responseBuf = new byte[256];
                DatagramPacket responsePacket = new DatagramPacket(responseBuf, responseBuf.length);
                socket.receive(responsePacket);

                String response = new String(responseBuf, 0, responsePacket.getLength());
                System.out.println("服务器响应:" + response);
            }
        } catch (IOException e) {e.printStackTrace();
        }
    }
}

通过上述示例,咱们实现了一个基于 TCP 和 UDP 的客户端和服务器之间的简略通信。心愿这些示例能够帮忙您更好地了解 Java Socket 编程。请留神,这些示例仅用于教学目标,在理论利用中,您可能须要思考诸如异样解决、超时管制、多线程和资源管理等其余因素。
举荐浏览:

https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA

https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g

正文完
 0