首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >套接字异常:套接字已关闭

套接字异常:套接字已关闭
EN

Stack Overflow用户
提问于 2011-11-25 06:41:07
回答 2查看 39.4K关注 0票数 4

我想创建服务器,这是能够与多个客户端连接。我的主要功能是:

代码语言:javascript
复制
ServerSocket serverSocket = null;
    try {
        serverSocket = new ServerSocket(5556);
    } catch (IOException ex) {
        Logger.getLogger(MakaoServer.class.getName()).log(Level.SEVERE, null, ex);
    }
    while (true) {
        try {
            Socket connection = serverSocket.accept();
            PlayerConnection playerConn = new PlayerConnection(connection);
            playerConn.start();
        } catch (IOException ex) {
            System.out.println("Nie można było utworzyć gniazda.");
        }
    }

PlayerConnection是一个线程类。run方法:

代码语言:javascript
复制
public void run() {
    InputStream input = null;
    while (true) {
        try {
            input = connection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            String msg = reader.readLine();
            System.out.println(msg);

        } catch (IOException ex) {
            Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

        }
    }
}

当我运行客户端并将消息发送到服务器时,它被接收到了,但是在下一次while循环迭代中,connection.getInputStream();抛出了一个套接字异常,套接字被关闭。为什么?

代码语言:javascript
复制
java.net.SocketException: socket closed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283)
at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177)
at java.io.InputStreamReader.read(InputStreamReader.java:184)
at java.io.BufferedReader.fill(BufferedReader.java:154)
at java.io.BufferedReader.readLine(BufferedReader.java:317)
at java.io.BufferedReader.readLine(BufferedReader.java:382)
at makaoserver.PlayerConnection.run(PlayerConnection.java:38)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-25 06:54:30

将输入流和缓冲的读取器放在循环之外。

可能是创建连接到同一个输入流的多个流导致了这种情况。

票数 6
EN

Stack Overflow用户

发布于 2011-11-25 07:00:28

试一试

代码语言:javascript
复制
public void run() {
    InputStream input = null;
    input = connection.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(input));

    while (true) {
        try {
            String msg = reader.readLine();
            System.out.println(msg);
        } catch (IOException ex) {
            Logger.getLogger(PlayerConnection.class.getName()).log(Level.SEVERE, null, ex);
        } finally {

        }
    }
}

使用完套接字后,也不要忘记关闭套接字

代码语言:javascript
复制
try {
  // Create objects
  // do stuff
} finally {
  if (obj != null) obj.close();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8263141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档