我怎么知道套接字何时空闲?

时间:2014-02-10 16:51:28

标签: java multithreading sockets inputstream eofexception

我正在尝试编写客户端服务器应用程序。 客户发布服务请求,服务器接收它们并在技术室中显示它们。

一切都很好,直到我尝试将屏幕截图发送到特殊的管理客户端,该客户端应该会收到实时请求列表的屏幕截图。

我的主服务器监听线程如下所示:

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()继续读取,因为刚收到客户端的新请求, 当它真的没有...... 而不是暂停和等待新的请求......

我现在已经坚持了两个星期,非常沮丧。

请帮助。

大卫。

1 个答案:

答案 0 :(得分:0)

在我的情况下服务器应该启动一个新线程来处理每个接受的连接,而不是在接受线程中内联处理每个连接。 但我也尝试通过serversocket而不是登录初始化获得第一次更新。 现在,在登录后获得第一次更新后,我在客户端添加了一个服务器套接字,因此它将继续监听服务器的进一步更新。

EJP的想法给了我第一个领导。