java - 我的套接字服务器循环类正确吗?

标签 java multithreading sockets

当客户端的消息类型为“connect”时,我的服务器出现错误,这很奇怪。

服务器接收器代码:

package threads;

public class ReceiveFromClientThread extends Thread {

ObjectInputStream inFromClient = null;
ServerSocket servs = new ServerSocket();
Socket link = null;
Message m = null;

public void run() {

    try {
        this.servs.servs.accept();
        this.inFromClient = new ObjectInputStream(link.getInputStream());
    } catch (SocketException e3) {
        System.err.println(" Connection reset by peer.");
    } catch (IOException e1) {
        e1.printStackTrace();
    }

    while(true) {   
        try {
            if (link.isConnected()) {
                this.m = (Message) inFromClient.readObject(); //SHOULDN'T THIS THREAD PAUSE HERE?

                if (m.getType().equalsIgnoreCase("normal")) {
                      System.out.println("[" + m.getTimestamp() + "] "  
                          + m.getOwner() + " -> " + m.getText());
                      ServerMain.mc.pushMessageToList(this.m); //Added to message list.
                } else if (m.getType().equalsIgnoreCase("connect")) {
                      System.out.println(m.getOwner() + " connected from "
                          + this.link.getInetAddress()+":"+this.link.getPort());
                } else if (m.getType() == "disconnect") {
                      System.err.println("[" + m.getTimestamp() + "] " 
                          + "[Origin: " + m.getIp() + "] " + m.getOwner() 
                          + " Disconnected." );
                }
            }
        } catch (IOException | ClassNotFoundException e) {
        }
    }
}

public ReceiveFromClientThread(Socket link) {
    this.link = link;   
}
}

客户端连接代码:

ClientMain.sock     = new Socket("127.0.0.1",21215);
ClientMain.oos      = new ObjectOutputStream(sock.getOutputStream());

Message m = new Message();
        m = m.setType("connect");
        m.setOwner("Raphael");
        m.setIp(sock.getInetAddress().getHostAddress());
        m.setPcname(sock.getInetAddress().getCanonicalHostName());
        clientmain.ClientMain.oos.writeObject(m);

它应该可以工作,但是它会产生无限循环,或者有时会出现 NullPointerException。我的代码有什么错误吗?服务器线程不应该在 readObject() 行挂起吗?

最佳答案

从您提交的代码来看,客户端看起来不错,但服务器有一些问题。

创建服务器套接字时,必须指定要绑定(bind)的端口(在构造函数中)。这定义了您在哪个端口上监听并等待客户端。

一旦有了绑定(bind)套接字监听,您就可以调用 .accept() 来接受客户端传入的连接。 .accept() 方法将返回一个代表已连接客户端的套接字。通常,您将循环 .accept() 并在每次返回时生成一个线程来处理新客户端(您可能有多个客户端)。要与客户端通信,需要使用返回的套接字。

在您的代码中,您似乎正在使用未绑定(bind)的服务器套接字,并且您的 link 客户端套接字绝对不是来自 .accept()

编辑:正如 Joachim 指出的,您还需要处理套接字关闭的情况,例如通过中断循环来处理。

关于java - 我的套接字服务器循环类正确吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27513887/

相关文章:

java - java中的字符串数组排序

java - 使用 Lucene IndexableField 在运行时出现 NoClassDefFoundError

multithreading - 在后台线程上将 UIVIew 渲染为图像的安全方法?

java - 优雅地终止套接字线程

c# - 无效操作异常 : The Undo operation encountered a context that is different from what was applied in the corresponding Set operation

java - 如何使用Java获取Google的搜索结果

Java for循环不执行

java - 多线程可以运行得更快吗?

multithreading - Interlocked.CompareExchange 的返回值是否有充分的理由

python-3.x - api返回奇数响应