一、Socket 概述
Java Socket 是网络编程中最基本的部分。Socket 类封装了一个套接字,它是一个 IP 地址和端口号的组合。通过 Socket,我们可以在不同的计算机之间建立连接通信。Socket 以 TCP 或 UDP 协议传输数据,它提供了一种简单而又强大的客户端/服务器编程方法。二、Socket 创建
Java Socket 类有两种构造函数,它们各自用于创建不同类型的套接字。- 创建 TCP Socket:
Socket socket = new Socket(String host, int port);
- 创建 UDP Socket:
DatagramSocket socket = new DatagramSocket(int port);
三、TCP Socket 通信
TCP 协议提供可靠的面向连接的服务,它使用三次握手建立连接,保证了数据的可靠传输。在 TCP Socket 通信中,客户端首先向服务器发起连接请求,服务器接受请求并返回确认信息,之后客户端和服务器之间可以进行数据的传输。 下面是一个使用 TCP Socket 客户端和服务器的示例代码:服务器端:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServer {
public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket(8888);
Socket socket = server.accept(); // 监听客户端连接
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
byte[] data = new byte[1024];
int len = in.read(data);
String request = new String(data, 0, len);
System.out.println("接收到客户端请求:" + request);
String response = "欢迎使用 Socket 编程!";
out.write(response.getBytes());
in.close();
out.close();
socket.close();
}
}
客户端:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("127.0.0.1", 8888);
InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();
String request = "Socket 编程示例";
out.write(request.getBytes());
byte[] data = new byte[1024];
int len = in.read(data);
String response = new String(data, 0, len);
System.out.println("接收到服务器响应:" + response);
in.close();
out.close();
socket.close();
}
}
四、UDP Socket 通信
UDP 协议提供不可靠的无连接服务,它没有建立连接的过程,并不保证数据传输的可靠性。在 UDP Socket 通信中,客户端和服务器之间通过数据报进行通信。 下面是一个使用 UDP Socket 的示例代码:服务器端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPServer {
public static void main(String[] args) throws IOException {
DatagramSocket server = new DatagramSocket(8888);
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
server.receive(packet);
String request = new String(packet.getData(), 0, packet.getLength());
System.out.println("接收到客户端请求:" + request);
String response = "欢迎使用 Socket 编程!";
DatagramPacket outPacket = new DatagramPacket(response.getBytes(), response.getBytes().length, packet.getAddress(), packet.getPort());
server.send(outPacket);
server.close();
}
}
客户端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
public static void main(String[] args) throws IOException {
DatagramSocket client = new DatagramSocket();
String request = "Socket 编程示例";
DatagramPacket outPacket = new DatagramPacket(request.getBytes(), request.getBytes().length, InetAddress.getByName("127.0.0.1"), 8888);
client.send(outPacket);
byte[] data = new byte[1024];
DatagramPacket inPacket = new DatagramPacket(data, data.length);
client.receive(inPacket);
String response = new String(inPacket.getData(), 0, inPacket.getLength());
System.out.println("接收到服务器响应:" + response);
client.close();
}
}