我正在尝试编写客户端服务器应用程序。 客户发布服务请求,服务器接收它们并在技术室中显示它们。
一切都很好,直到我尝试将屏幕截图发送到特殊的管理客户端,该客户端应该会收到实时请求列表的屏幕截图。
我的主服务器监听线程如下所示:
while (true) {
clientSocket = echoServer.accept();
log.debug("Server Started Listening");
is = new DataInputStream(clientSocket.getInputStream());
os = new PrintStream(clientSocket.getOutputStream());
// An option for a stop listening button. currently not available !
if( listening==true ) {
line = is.readUTF();
os.println(line);
System.out.println(line);
RequestReciever.pharseToRequest(line);
}
pharseToRequest方法如下所示:
public static void pharseToRequest(String input) {
List<String> list = new ArrayList<String>(Arrays.asList(input.split(";;;")));
if (list.get(0).equalsIgnoreCase("Login") && list.get(1).equalsIgnoreCase("Login") && list.get(2).equalsIgnoreCase("5"))
{
_adminClients.add(list.get(4));
updateScreenCapture();
AdminClientUpdate tmp = new AdminClientUpdate(list.get(4));
Thread aCU = new Thread (tmp);
aCU.start();
}
else
{
ServerRequest newReq = new ServerRequest(list.get(0), list.get(1), Integer.parseInt(list.get(2)),list.get(3),list.get(4));
addRequest(newReq);
}
}
当客户端发送“Login”作为数据时,我将其视为ADMIN CLIENT,并尝试通过AdminclientUpdate线程向其发送一个screencapture。
当客户端发送常规数据时,我只需使用“addRequest”方法在服务器屏幕上更新它。
我遇到的问题是,当我尝试发送屏幕截图时,它会找到管理客户端的方式,并会在那里正确更新,但我的服务器出错并停止工作。
我怀疑它可能与侦听线程有关,当AdminclientUpdate线程传输数据时,旧请求中仍然有数据,或者什么。
这是我在发送截屏后从服务器获得的错误:
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at java.io.DataInputStream.readUTF(Unknown Source)
at ListeningThread.run(ListeningThread.java:50)
at java.lang.Thread.run(Unknown Source)
serversocket.accept()继续读取,因为刚收到客户端的新请求, 当它真的没有...... 而不是暂停和等待新的请求......
我现在已经坚持了两个星期,非常沮丧。
请帮助。
大卫。
答案 0 :(得分:0)
在我的情况下服务器应该启动一个新线程来处理每个接受的连接,而不是在接受线程中内联处理每个连接。 但我也尝试通过serversocket而不是登录初始化获得第一次更新。 现在,在登录后获得第一次更新后,我在客户端添加了一个服务器套接字,因此它将继续监听服务器的进一步更新。
EJP的想法给了我第一个领导。