客户/服务器模型Java

时间:2012-03-24 01:40:53

标签: java client

我有一个服务器类,它连接特定服务器套接字端口上的客户端,并启动带有服务类的线程。具体来说,我有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();
//            }
        }
    }
}

任何帮助都将不胜感激。

3 个答案:

答案 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的子类中进行覆盖。