You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Socket编程中HelloWorld服务端与客户端程序异常求助

Java Socket客户端异常排查与解决方案

Hey,我看到你在运行Java Socket客户端时碰到了异常,换端口、查往期帖子都没解决,确实挺闹心的。先帮你梳理下可能的问题点,再给你实用的排查步骤和代码参考。

首先,你的服务器代码不完整

你贴的Server.java代码只到Socket connectionSocket = we...,这里应该是welcomeSocket.accept()对吧?而且整个代码没有完整的输入输出流处理、异常捕获和资源关闭逻辑,这很可能是问题根源之一——服务器端可能启动失败或者运行中抛出异常,但因为你直接throws Exception没有捕获,导致你完全不知道服务器端的状态。

核心排查步骤

我给你列几个优先级最高的排查点:

  • 先确认服务器是否正常启动:如果服务器启动时端口被占用,会抛出BindException,但你的代码直接抛出Exception,不会有任何提示,导致你以为服务器启动了,但其实根本没起来。建议给服务器加异常捕获,看启动日志。
  • 端口要两端同步更换:如果你换了服务器的端口,客户端代码里的连接端口也要跟着改,不然肯定连不上。
  • 检查防火墙拦截:本地防火墙或者服务器所在机器的防火墙可能阻止了端口通信,暂时关闭防火墙测试一下,能连上的话再去配置防火墙规则。
  • 务必提供具体异常信息:客户端抛出的异常栈是关键!比如是ConnectException: Connection refused(服务器没启动/端口不对),还是EOFException(服务器输出流异常关闭),或者其他IO异常,不同的异常指向完全不同的问题。
  • 跨机器连接要注意IP:如果客户端和服务器不在同一台机器,客户端不能用localhost,要填服务器的局域网IP或公网IP。

完整的服务器与客户端示例代码

我给你补全并优化了服务器代码,加上了异常捕获和资源关闭逻辑,你可以先跑这个测试:

服务器代码(Server.java)

import java.io.*;
import java.net.*;

class Server{
    public static void main(String argv[]) {
        ServerSocket welcomeSocket = null;
        try {
            // 这里可以换成你要测试的端口
            int port = 8080;
            welcomeSocket = new ServerSocket(port);
            System.out.println("服务器已启动,监听端口:" + port + ",等待客户端连接...");
            
            while (true) {
                // 等待客户端连接
                Socket connectionSocket = welcomeSocket.accept();
                System.out.println("客户端已连接:" + connectionSocket.getInetAddress());
                
                // 初始化输入输出流
                BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
                PrintWriter outToClient = new PrintWriter(connectionSocket.getOutputStream(), true);
                
                // 读取客户端消息
                String clientSentence = inFromClient.readLine();
                if (clientSentence == null) {
                    System.out.println("客户端断开连接");
                    connectionSocket.close();
                    continue;
                }
                
                // 处理消息并返回
                String capitalizedSentence = clientSentence.toUpperCase();
                outToClient.println(capitalizedSentence);
                System.out.println("已响应客户端:" + capitalizedSentence);
            }
        } catch (BindException e) {
            System.err.println("错误:端口被占用,请更换端口或释放资源!");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("服务器发生IO异常:");
            e.printStackTrace();
        } finally {
            // 关闭ServerSocket资源
            try {
                if (welcomeSocket != null && !welcomeSocket.isClosed()) {
                    welcomeSocket.close();
                    System.out.println("服务器已关闭");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码(Client.java)

import java.io.*;
import java.net.*;

class Client{
    public static void main(String argv[]) {
        Socket clientSocket = null;
        try {
            // 连接服务器,本地测试用localhost,跨机器换成服务器IP
            String serverIp = "localhost";
            int port = 8080;
            clientSocket = new Socket(serverIp, port);
            System.out.println("已连接到服务器:" + serverIp + ":" + port);
            
            // 初始化输入输出流
            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
            PrintWriter outToServer = new PrintWriter(clientSocket.getOutputStream(), true);
            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            
            // 输入消息并发送给服务器
            System.out.print("请输入要发送的消息:");
            String sentence = inFromUser.readLine();
            outToServer.println(sentence);
            
            // 接收服务器响应
            String modifiedSentence = inFromServer.readLine();
            System.out.println("服务器响应:" + modifiedSentence);
            
        } catch (ConnectException e) {
            System.err.println("错误:无法连接到服务器!请检查服务器是否启动、端口是否正确、防火墙是否拦截。");
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("客户端发生IO异常:");
            e.printStackTrace();
        } finally {
            // 关闭客户端Socket
            try {
                if (clientSocket != null && !clientSocket.isClosed()) {
                    clientSocket.close();
                    System.out.println("客户端已断开连接");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

先运行服务器,再运行客户端测试,如果还是有问题,把客户端抛出的完整异常栈信息贴出来,我再帮你定位具体问题。

内容的提问来源于stack exchange,提问作者Lahari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:43:40