Java聊天室 - 为什么我收到SocketException?

时间:2012-05-26 07:12:00

标签: java client socketexception chatroom

我正在使用简单的套接字套接字建立聊天室。 我有一个服务器和客户端程序。服务器在端口225上运行,然后当我在端口225上运行客户端以便它们可以读取/写入套接字时,客户端立即停止并显示错误消息

java.net.SocketException: Connection resetJava Result: 1

为什么会抛出此异常?它连接,线条打印到控制台,如图所示:

try {
    client = new Socket(serverAdress, portNumber);
    System.out.println("Successful connection to server on port " + portNumber + ".");

那么为什么它无法连接?

这是例外追踪......

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:168)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at schoolroom10.SchoolRoomClient.SchoolRoomClientWindow.main(SchoolRoomClientWindow.java:85)

这是我的服务器代码......

public class SchoolRoomServer {

    // 'server' will create the server over the local port:
    static ServerSocket serverSocket = null;

    //Socket for listening:
    static Socket clientcommunicate = null;

    //portnum is the number of the local port. Change to required port before running.
    static int portnum = 225;

    public static void main(String[] args) throws IOException{
        try {
            serverSocket = new ServerSocket(portnum);
        clientcommunicate = serverSocket.accept();
            Communicate c = new Communicate(Communicate.server);
            Thread t = new Thread(c);
            t.start();
        } catch (UnknownHostException uhe) {
            System.err.println(uhe);
            System.exit(1);
        } catch (IOException ioe) {
            System.err.println(ioe);
            System.exit(1);
        }


    } 
}

class Communicate implements Runnable {
    public static Socket server;
    Communicate(Socket server) {
        Communicate.server = server;
    }
    public void run() {
        String in = "";
        try {
            //i/o for clients:
            PrintStream output = new PrintStream(server.getOutputStream());
            BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream()));
            String message;

            //Message handling:
            while(((message = input.readLine()) != null) && (!in.equals("."))) {
                output.println(message);
            }
        } catch (IOException ioe) {
            System.err.println(ioe);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

正如之前的海报所指出的那样,你应该避免使用低于1024的端口,因为它们是保留的。

在没有看到所有代码的情况下,剩下的只是猜测,但是在客户端你应该进入一个循环,以便从输入流中不断准备并处理传入的消息,然后在重复之前暂停一下,例如睡眠(100)。相同的服务器端用于监视连接请求和传入消息。

如果你不继续读取输入流,它将填充缓冲区并删除连接,但有例外。

答案 1 :(得分:0)

'连接重置'通常意味着您已写入已被另一端关闭的连接。一般来说,这是一个应用程序协议错误。但是在某些情况下,例如在同伴是浏览器的地方,或者也可能在你的情况下,这只是同伴可能随时选择离开这一事实的必然结果。在这些情况下,您所能做的就是关闭套接字并忘记连接。