有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java多socket导致连接异常:连接被拒绝:连接

我正在Windows XP上用Eclipse编写java。我有一个多进程模拟,它使用ProcessBuilder运行一个服务器和两个客户端。服务器启动一个线程来监听两个不同的socket——每个客户端一个。我可以注释出每个客户机的代码,并让其他客户机完美地工作。当我尝试同时运行它们时,一个客户端总是会出现错误,出现ConnectException:Connection Rejected:connect。哪个客户机运行得比较慢,尽管很难说。我可以在启动服务器后但在客户端之前暂停,netstat会验证两个socket是否都处于活动状态。这可能是什么原因造成的?下面我有一些简化的代码

更新:根据评论,我已经编辑了在单个socket上对服务器执行多线程处理的代码,但仍然存在相同的问题。下面的代码反映了这些变化。在另一个客户端有机会打开socket之前,一个客户端正在打开和关闭该socket。我可以在每个客户端的末尾抛出暂停语句,让另一个客户端可以完成,但这是一个解决方案,而不是解决方案。所以现在真正的问题是,在我指示ServerSocket关闭之前,如何让它一直处于监听状态

服务器

try{
    server = new ServerSocket(sockNum); 
} catch (IOException e) {
        System.out.printf("Could not listen on port %d\n",sockNum);
        System.exit(-1);
}
while(true){
    ClientWorker w;
    try{
        Socket connection = server.accept();
        w = new ClientWorker(connection);
        Thread t = new Thread(w);
        t.start();
    } catch (IOException e) {
        System.out.printf("Accept failed: %d\n",sockNum);
        System.exit(-1);
    }
}

class ClientWorker implements Runnable {
    private Socket client;

          ClientWorker(Socket client) {
           this.client = client;
          }

          public void run(){
            Object line;
            ObjectInputStream in = null;
            PrintWriter out = null;
            try{
              in = new ObjectInputStream(client.getInputStream());
              out = new PrintWriter(client.getOutputStream(), true);
            } catch (IOException e) {
              System.out.println("in or out failed");
              System.exit(-1);
            }

            while(true){
                try{
                    line = in.readObject();
                    //Send data back to client
                    out.println("Sent from broker");
                    if(line instanceof String)
                        System.out.println(line);
                    else
                        System.out.println(line.getClass());                        
                } catch (IOException e) {
                    System.out.println("Read failed");
                    System.exit(-1);
                } catch (ClassNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

客户

 try{
    socket = new Socket("localhost", socketNum);
    out = new ObjectOutputStream(socket.getOutputStream());
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

    out.writeObject(message);
    String line = in.readLine();
    System.out.println(line);
    } catch (UnknownHostException e) {
        System.out.println("Unknown host: localhost.eng");
        System.exit(1);
    } catch  (IOException e) {
        System.out.println("No I/O");
        System.exit(1);
    }

控制器

ProcessBuilder server = new ProcessBuilder("java.exe","-Xss64m","-cp","bin;jscheme.jar","ServerProcess");
server.redirectErrorStream(true);
Process runServer = server.start();

ProcessBuilder clientA = new ProcessBuilder("java.exe","-Xss64m","-cp","bin;jscheme.jar","ClientAProcess");
clientA.redirectErrorStream(true);
Process runClientA = clientA.start();

ProcessBuilder clientB = new ProcessBuilder("java.exe","-Xss64m","-cp","bin;jscheme.jar","ClientBProcess");
clientB.redirectErrorStream(true);
Process runClientB = clientB.start();

共 (0) 个答案