我有一个服务器类,它连接特定服务器套接字端口上的客户端,并启动带有服务类的线程。具体来说,我有3个服务类,所以我想有3个不同的端口。然而,这并不像我预期的那样有效。这是我的服务器代码:
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
public class WebsiteServer {
public static void main(String args[]) throws IOException {
ServerSocket serversocket = new ServerSocket(22401);
ServerSocket serversocket2 = new ServerSocket(22402);
Thread thread;
Thread thread2;
Socket socket;
Socket socket2;
NewUserService newuserservice;
ExistingUserService existinguserservice;
System.out.println("Waiting for clients to connect.");
while (true) {
socket = serversocket.accept();
socket2 = serversocket2.accept();
if(socket.isConnected()) {
System.out.println("NewUserClient has connected.");
newuserservice = new NewUserService(socket);
thread = new Thread(newuserservice);
thread.start();
}
if(socket2.isConnected()) {
System.out.println("ExistingUserClient has connected.");
existinguserservice = new ExistingUserService(socket2);
thread2 = new Thread(existinguserservice);
thread2.start();
}
}
}
}
如果我只使用一个端口,它可以正常工作:
import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
public class WebsiteServer {
public static void main(String args[]) throws IOException {
ServerSocket serversocket = new ServerSocket(22401);
ServerSocket serversocket2 = new ServerSocket(22402);
Thread thread;
Thread thread2;
Socket socket;
Socket socket2;
NewUserService newuserservice;
ExistingUserService existinguserservice;
System.out.println("Waiting for clients to connect.");
while (true) {
socket = serversocket.accept();
//socket2 = serversocket2.accept();
if(socket.isConnected()) {
System.out.println("NewUserClient has connected.");
newuserservice = new NewUserService(socket);
thread = new Thread(newuserservice);
thread.start();
}
// if(socket2.isConnected()) {
//
// System.out.println("ExistingUserClient has connected.");
// existinguserservice = new ExistingUserService(socket2);
// thread2 = new Thread(existinguserservice);
// thread2.start();
// }
}
}
}
任何帮助都将不胜感激。
答案 0 :(得分:1)
accept方法阻塞,直到建立连接。所以,即使其他服务器可能有活动,你也会被阻塞一个.accept()。一个简单的解决方案是为每个服务器创建一个监听线程。
答案 1 :(得分:1)
accept()
是一种阻止方法。换句话说,第二个accept()
正在等待另一个连接。接受第二个连接,您的代码将被阻止
答案 2 :(得分:0)
您需要在单独的线程中调用accept()
方法。 accept()
阻塞线程,直到有人加入服务器。这可能是1毫秒或1年。
我建议您创建一个在有人加入时调用的AcceptListener
public interface AcceptListener{
public void socketAccepted(Socket s);
}
处理程序类
public class MyServerSocket extends Thread{
private AcceptListener l;
private boolean run = true;
private ServerSocket s;
public MyServerSocket(AcceptListener l, int port){
this.l = l;
this.s = new ServerSocket(port);
this.start();
}
public void run(){
while(run){
l.socketAccepted(s.accept());
}
}
}
你必须处理错误和诸如此类的东西,并在你的AcceptListener的子类中进行覆盖。