2017-06-13 40 views
2

大家。 希望你能帮助我: 我有两个线程,负责处理来自客户端的连接。两个服务器线程在一个while循环互相阻塞

这是我的代码

ServerSocket loginSocket = new ServerSocket(8000); 
ServerSocket fileSocket = new ServerSocket(7000); 

while (running) { 
    new LoginThread(loginSocket.accept(),loginInormation).start(); 
    new LoaderThread(fileSocket.accept()).start(); 
} 

当我尝试连接到loginSocket两次,服务器将封锁并停止工作,导致用户端,但如果我删除此不这样做:

new LoginThread(loginSocket.accept(),loginInormation).start(); 

我没有收到任何错误消息,为什么会发生这种情况,我该如何解决这个问题?

+0

登录插座'loginSocket.accept()'可能是等待连接? –

+0

我看着这个:https://stackoverflow.com/questions/10131377/socket-programming-multiple-client-to-one-server我看不出你在哪里错了。我认为我们需要更多的代码。例如,“LoginThread”和“LoaderThread”中的内容。另外,你确定你没有默默捕捉异常吗? –

回答

0

accept()方法是一种阻塞方法,这意味着您的程序将不会继续,直到与loginSocket()建立连接。

当您创建LoginThread时,程序会等待连接以设置对象的第一个参数,并且在连接完成之前它不会继续执行。

0

new LoginThread(loginSocket.accept(),loginInormation).start();包含方法调用loginSocket.accept(),它将在创建该线程之前调用。此方法调用将阻塞,直到客户端登录(此外,第二个线程将被阻止fileSocket.accept())。

至于解决方案,我会将accept()调用移动到每个线程内。您需要将套接字传递给线程才能执行此操作。

0

开始fileSocket并在不同的线程

package com.ca.training.task.app; 

import java.io.IOException; 
import java.net.ServerSocket; 

public class App { 

    public void execute() { 
     LoginRunnable loginRunnable = new LoginRunnable(); 
     loginRunnable.setLoginInformation(new Object());//Login information 

     FileRunnable fileRunnable = new FileRunnable();//Data for loaded runnable. 
     fileRunnable.setParams(new Object()); 

     startLoginThread(loginRunnable); 
     startFileThread(fileRunnable); 
    } 

    private static void startLoginThread(LoginRunnable loginRunnable) { 
     Thread loginThread = new Thread(loginRunnable); 
     loginThread.start(); 
    } 

    private static void startFileThread(FileRunnable fileRunnable) { 
     Thread loadedThread = new Thread(fileRunnable); 
     loadedThread.start(); 
    } 

    class LoginRunnable implements Runnable { 

     private Object loginInformation; 

     @Override 
     public void run() { 
      try { 
       ServerSocket loginSocket = new ServerSocket(8000); 
       loginSocket.accept(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public Object getLoginInformation() { 
      return loginInformation; 
     } 

     public void setLoginInformation(Object loginInformation) { 
      this.loginInformation = loginInformation; 
     } 
    } 

    class FileRunnable implements Runnable { 

     private Object params; 

     @Override 
     public void run() { 
      try { 
       ServerSocket fileSocket = new ServerSocket(7000); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public Object getParams() { 
      return params; 
     } 

     public void setParams(Object params) { 
      this.params = params; 
     } 
    } 
}