[英]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.