我使用Java
使用Eclipse
编码了服务器,我在此服务器上运行Android Apps
我的两部手机和服务器都在同一个网络上。
当我从电话连接两台服务器时,我可以看到客户端连接到服务器 当客户端断开连接时,我也可以看到它。
当我从第一个客户端连接然后我从第二个客户端建立连接然后第一个客户端无缘无故地自动断开连接。 这意味着如果没有客户端断开连接,我就无法在服务器上进行两次移动。
可能的事情是,当客户端连接到服务器时,会创建一个线程(myThread
),但是当客户端断开连接时,我认为线程(MyThread
)永远不会停止。
我可以看到我得到30个线程名称。
我的问题是,如果多个线程导致断开连接,如何在客户端被连接后停止每个线程?
public Server() {
// ServerSocket is only opened once !!!
try {
serverSocket = new ServerSocket(6000);
System.out.println("Waiting on port 6000...");
boolean connected = true;
// this method will block until a client will call me
while (connected) {
Socket singleClient = serverSocket.accept();
// add to the list
ServerThread myThread = new ServerThread(singleClient);
allClients.add(myThread);
myThread.start();
}
// here we also close the main server socket
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class ServerThread extends Thread {
Socket threadSocket;
String userName;
boolean isClientConnected;
InputStream input;
ObjectInputStream ois;
OutputStream output;
ObjectOutputStream oos;
public ServerThread(Socket s) {
threadSocket = s;
}
public void sendText(String text) {
try {
oos.writeObject(text);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run() {
try {
counter++;
input = threadSocket.getInputStream();
ois = new ObjectInputStream(input);
output = threadSocket.getOutputStream();
oos = new ObjectOutputStream(output);
userName = (String) ois.readObject();
isClientConnected = true;
while (isClientConnected) {
String singleText;
singleText = (String) ois.readObject();
oos.flush();
for (ServerThread t : allClients)
if (t.isAlive())
t.sendText(singleText);
}
// close all resources (streams and sockets)
ois.close();
oos.close();
threadSocket.close();
counter--;
System.out
.println("disconnected : lost connection - connections: "
+ counter);
} catch (Exception e) {
// TODO Auto-generated catch block
counter--;
isClientConnected = false;
System.out.println("Quit App : lost connection - connections: "
+ counter);
}
}
}
答案 0 :(得分:0)
我之前想到了,我刚刚在循环之前删除了userName = (String) ois.readObject();
并且它运行良好..谢谢你
- 阿姆贾德