1. 什么是 Socket?
Socket(套接字)是计算机网络中实现应用程序之间数据通信的一种形式。它为应用程序提供了发送和接收数据的接口。在 Java 中,java.net
包提供了 Socket 类和相干的类,用于实现网络编程。
2. 应用 Socket 建设 TCP 连贯
在 Java 中,咱们应用 java.net.Socket
类和 java.net.ServerSocket
类来实现基于 TCP 的客户端和服务器之间的通信。以下是一个简略的步骤:
-
服务器端:
- 创立一个
ServerSocket
对象,指定监听的端口号。 - 调用
accept
办法期待客户端连贯。 - 获取客户端的
Socket
对象,进行通信。 - 敞开资源。
- 创立一个
-
客户端:
- 创立一个
Socket
对象,指定服务器的地址和端口号。 - 通过
Socket
对象的输出 / 输入流与服务器通信。 - 敞开资源。
- 创立一个
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