java如何使用socket
使用Socket进行Java网络通信
在Java中,Socket用于实现客户端与服务器之间的网络通信。以下是使用Socket进行通信的基本方法。
创建服务器端
服务器端通过ServerSocket监听指定端口,等待客户端连接。连接建立后,通过Socket进行通信。
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
int port = 12345;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器启动,等待客户端连接...");
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接");
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("收到客户端消息: " + inputLine);
out.println("服务器回复: " + inputLine);
}
in.close();
out.close();
clientSocket.close();
serverSocket.close();
}
}
创建客户端
客户端通过Socket连接到服务器,并发送和接收消息。
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
String host = "localhost";
int port = 12345;
Socket socket = new Socket(host, port);
System.out.println("已连接到服务器");
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());
}
in.close();
out.close();
socket.close();
}
}
处理多客户端连接
服务器端可以通过多线程处理多个客户端连接。
import java.io.*;
import java.net.*;
public class MultiThreadServer {
public static void main(String[] args) throws IOException {
int port = 12345;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器启动,等待客户端连接...");
while (true) {
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接");
new Thread(new ClientHandler(clientSocket)).start();
}
}
}
class ClientHandler implements Runnable {
private Socket clientSocket;
public ClientHandler(Socket socket) {
this.clientSocket = socket;
}
public void run() {
try {
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("收到客户端消息: " + inputLine);
out.println("服务器回复: " + inputLine);
}
in.close();
out.close();
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用Socket发送和接收文件
通过Socket可以实现文件传输功能。

import java.io.*;
import java.net.*;
public class FileServer {
public static void main(String[] args) throws IOException {
int port = 12345;
ServerSocket serverSocket = new ServerSocket(port);
System.out.println("服务器启动,等待客户端连接...");
Socket clientSocket = serverSocket.accept();
System.out.println("客户端已连接");
InputStream in = clientSocket.getInputStream();
FileOutputStream fileOut = new FileOutputStream("received_file.txt");
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
fileOut.write(buffer, 0, bytesRead);
}
fileOut.close();
in.close();
clientSocket.close();
serverSocket.close();
}
}
public class FileClient {
public static void main(String[] args) throws IOException {
String host = "localhost";
int port = 12345;
Socket socket = new Socket(host, port);
System.out.println("已连接到服务器");
FileInputStream fileIn = new FileInputStream("file_to_send.txt");
OutputStream out = socket.getOutputStream();
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = fileIn.read(buffer)) != -1) {
out.write(buffer, 0, bytesRead);
}
fileIn.close();
out.close();
socket.close();
}
}
注意事项
- 确保端口未被占用,避免
BindException。 - 处理异常情况,如连接中断或超时。
- 使用多线程或线程池处理多个客户端连接,避免阻塞主线程。
- 关闭所有资源(如Socket、流等),防止资源泄漏。






