【发布时间】:2017-12-12 21:06:15
【问题描述】:
我有这个简单的多线程 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; 所以运行会停止运行。但这也破坏了其他联系。
编辑
服务器线程->
private Socket socket;
还有一个函数->
void closeConnection() throws IOException{
this.socket.close();
}
像魅力一样工作。
【问题讨论】:
-
关闭套接字,然后杀死线程。
-
这个程序的目的是什么?作业?
-
public static变量是灾难的根源(我相信你刚刚发现了困难的方法)。但正如@cktang 所说,关闭套接字,然后杀死该线程(而不是其他线程)。 -
@randnum-1 这行得通,我什至尝试过,但由于 Joe C 提到的静态变量,这不能正常工作。快速重写它,它现在可以工作了。
-
@AbhijitSarkar 遗憾的是,我们没有在我的大学学习套接字,所以我只是在教育自己添加到投资组合中。所以不,这不是作业。
标签: java multithreading sockets networking