2017-07-08 44 views
0

我有这个简单的多线程Java套接字应用程序。使用类Client.java简单的Java多线程套接字应用程序

public class Client { 

private static Socket socket; 
private static boolean waitForServer = false; 
public static void main(String[] args) throws IOException { 
    while(true){ 
     socket = new Socket("localhost", ServerPortInfo.getPort()); 
     PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader bufferedReader = new java.io.BufferedReader(new InputStreamReader(System.in)); 

     while(true){ 
      PrintWriter.println(name + " Hello"); 
       waitForServer = true; 

      if (waitForServer){ 
       BufferedReader inputBufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
       String inputString = null; 
       while((inputString = inputBufferedReader.readLine()) != null){ 
        System.out.println(inputString); 
        break; 
       } 

      } 

     } 

    } 
    } 
} 

而且Server.java

然后,处理该连接的主题...

public class ServerThread extends Thread { 

private static Socket socket; 
public static boolean alive = true; 

ServerThread(Socket socket){ 
    this.socket = socket; 
} 

public void run(){ 
    if (alive) { 
     //DO STUFF NOW 
}  

} 

,现在当我有多个连接。它为每个连接创建一个不同的线程。 用户想要从该服务器断开连接时应该怎么做?

我应该杀死线程,套接字吗?

我试着只是说线程 alive = false;所以运行将停止运行。但是这也打破了其他连接。

编辑

ServerThread - >

private Socket socket; 

和一个功能 - >

void closeConnection() throws IOException{ 
    this.socket.close(); 
} 

的作品就像一个魅力。

+1

关闭套接字,然后杀死线程。 – frozen

+0

这个程序的目的是什么?家庭作业? –

+1

'公共静态'变量是灾难的秘诀(因为我相信你刚刚发现了困难的方式)。但正如@cktang所说,关闭套接字,然后杀死该线程(而不是其他)。 –

回答

1

公共静态变量是灾难的秘诀(因为我确信你刚刚发现了困难的方式) 。但正如@cktang所说,关闭套接字,然后杀死该线程(而不是其他)。 - @ JoeC

private static Socket socket;更改为private Socket socket;。 关闭套接字,然后关闭线程。

0

问题是与

public static boolean alive = true; 
private static Socket socket; 

由于它是静态的,它会影响您的所有ServerThread的,但每个ServerThread(又名连接的客户端)应该有表明自己的插座和旗帜,如果它是活着还是不。

从两个属性中删除static改性剂和 使标志
private volatile boolean alive = true;

起初关闭插座,然后停止线程(从列表中删除)。