当客户端的消息类型为“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/