[英]Simple Java multi-threaded socket application
我有這個簡單的多線程Java套接字應用程序。 使用類Client.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 Server {
public static ArrayList<ServerThread> connections = new ArrayList<ServerThread>();
public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
// Init server functionality
new Server().runServer();
}
// Implementing server functionality
public void runServer() throws IOException{
ServerSocket serverSocket = new ServerSocket(ServerPortInfo.getPort());
System.out.println("Server is running... Waiting for connections");
while (true){
Socket socket = serverSocket.accept();
// After connection handle clients in threads
ServerThread newThread = new ServerThread(socket);
connections.add(newThread);
newThread.start();
}
}
}
然后是一個處理該連接的線程...
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();
}
奇跡般有效。
公共靜態變量是災難的根源(因為我敢肯定,您已經找到了很難的方法)。 但是正如@cktang所說,關閉套接字,然后殺死該線程(而不是其他線程)。 -@ JoeC
更改了private static Socket socket;
private Socket socket;
。 關閉套接字,然后關閉線程。
問題出在
public static boolean alive = true;
private static Socket socket;
由於它是靜態的,因此會影響您所有的ServerThread
,但是每個ServerThread
(也稱為已連接的客戶端)應具有自己的套接字和標志,以指示其是否有效。
從兩個屬性中刪除static
修飾符並進行標記
private volatile boolean alive = true;
首先,關閉套接字a,然后停止線程(並將其從列表中刪除)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.