共计 3912 个字符,预计需要花费 10 分钟才能阅读完成。
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