全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-11 7 分钟 ✍️ juanwangdev

Java Socket编程

Socket是网络通信的端点,Java通过Socket类实现TCP网络编程。

核心类

作用
Socket客户端套接字,连接服务器
ServerSocket服务端套接字,监听客户端连接
InetAddressIP地址封装

服务端实现

基本服务端

Java
public class SimpleServer {
    public static void main(String[] args) throws IOException {
        // 创建服务端Socket,监听8888端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("服务端启动,等待连接...");

        // 等待客户端连接(阻塞)
        Socket clientSocket = serverSocket.accept();
        System.out.println("客户端连接: " + clientSocket.getInetAddress());

        // 获取输入输出流
        InputStream in = clientSocket.getInputStream();
        OutputStream out = clientSocket.getOutputStream();

        // 读取客户端数据
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String message = reader.readLine();
        System.out.println("收到: " + message);

        // 发送响应
        PrintWriter writer = new PrintWriter(out, true);
        writer.println("服务端已收到消息");

        // 关闭连接
        clientSocket.close();
        serverSocket.close();
    }
}

多线程服务端

Java
public class ThreadedServer {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            Socket clientSocket = serverSocket.accept();
            // 每个客户端一个线程
            new Thread(new ClientHandler(clientSocket)).start();
        }
    }

    static 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 line;
                while ((line = in.readLine()) != null) {
                    System.out.println("收到: " + line);
                    out.println("Echo: " + line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try { socket.close(); } catch (IOException e) {}
            }
        }
    }
}

客户端实现

Java
public class SimpleClient {
    public static void main(String[] args) throws IOException {
        // 连接服务端
        Socket socket = new Socket("localhost", 8888);
        System.out.println("已连接服务端");

        // 获取输入输出流
        OutputStream out = socket.getOutputStream();
        InputStream in = socket.getInputStream();

        // 发送数据
        PrintWriter writer = new PrintWriter(out, true);
        writer.println("Hello Server");

        // 接收响应
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        String response = reader.readLine();
        System.out.println("服务端响应: " + response);

        // 关闭连接
        socket.close();
    }
}

Socket常用方法

Java
Socket socket = new Socket();

// 连接设置
socket.connect(new InetSocketAddress("localhost", 8888), 5000);  // 超时5秒
socket.setSoTimeout(3000);           // 读操作超时
socket.setKeepAlive(true);           // 保持连接
socket.setTcpNoDelay(true);          // 禁用Nagle算法

// 连接信息
InetAddress address = socket.getInetAddress();   // 服务端地址
int port = socket.getPort();                     // 服务端端口
InetAddress localAddress = socket.getLocalAddress();  // 本地地址
int localPort = socket.getLocalPort();           // 本地端口

// 状态检查
socket.isConnected();    // 是否已连接
socket.isClosed();       // 是否已关闭

InetAddress使用

Java
// 获取本机地址
InetAddress localHost = InetAddress.getLocalHost();
String hostName = localHost.getHostName();      // 主机名
String hostAddress = localHost.getHostAddress(); // IP地址

// 根据主机名获取
InetAddress address = InetAddress.getByName("www.baidu.com");

// 根据IP获取
InetAddress address = InetAddress.getByName("192.168.1.1");

// 获取所有地址(多IP主机)
InetAddress[] addresses = InetAddress.getAllByName("www.baidu.com");

Socket通信流程

text
服务端                          客户端
  |                               |
ServerSocket(port)               |
  |                               |
accept() ←─────────────────── Socket(host, port)
  |                               |
getInputStream() ←───────────── getOutputStream()
getOutputStream() ─────────────→ getInputStream()
  |                               |
close()                          close()

注意事项

accept() 是阻塞方法,直到有客户端连接才返回

客户端和服务端的流操作要匹配,避免死锁(双方都在等待对方发送)

关闭Socket会同时关闭关联的流

大量连接时应使用线程池或NIO(Selector)代替单线程处理

读写超时设置很重要,防止无限等待

要点总结

  1. ServerSocket 监听端口,accept() 等待连接
  2. Socket 连接服务端,获取流进行通信
  3. 服务端需多线程处理多个客户端连接
  4. 设置超时防止阻塞等待
  5. 使用完及时关闭Socket释放资源

📝 发现内容有误?点击此处直接编辑

← 上一篇 Java RPC原理
下一篇 → Java UDP协议
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库