如何在java中通过服务器启动客户端更新

时间:2014-02-06 19:28:20

标签: multithreading sockets client eofexception

我有一个客户端/服务器应用程序来管理某种类型的行。 所有客户都将对象添加到我的行中。

我希望服务器每次更改行,插入或删除行时,都会将jpanel的屏幕截图发送给客户端。 我设法将jpanel捕获到jpeg甚至发送它。 但我的应用程序的流程已停止,在第一次更新后,我得到终止我的侦听服务器套接字的eofexception。

更新客户端的正确方法是什么?我应该设置一个serversocket来始终在客户端监听吗?

请帮助,我坚持了2周。

这是我的听线程(服务器):

public class ListeningThread implements Runnable {

static boolean listening = true;    
public BufferedReader in;


public void run() {

    ServerSocket echoServer = null;
    String line;
    DataInputStream is = null;
    PrintStream os = null;
    Socket clientSocket = null;

   try {
       echoServer = new ServerSocket(RequestReciever._communicationPort);
    }
    catch (IOException e) {
       System.out.println(e);

    }   

// Create a socket object from the ServerSocket to listen and accept 
// connections.
// Open input and output streams

try {


// As long as we receive data, send it to be phrased to a request.
        while (true) {

         clientSocket = echoServer.accept();
         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);
//           clientSocket = null;


       }
       else  {
                echoServer.close();
                is.close();
                os.close();
                break;
            }
       }

}   

catch (IOException e) {
       e.printStackTrace();
       System.out.println("Listening Thread Unknown error");
    }
}
}

这是我的Pharse方法:

 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);
    }
}

,这是AdminClientUpdate类

public class AdminClientUpdate implements Runnable {

static boolean listening = true;    
public BufferedReader in;
public String _ip;

public AdminClientUpdate(String ip)
{
    _ip = ip;
}

public void run() {

        try {
            Socket socket = new Socket(_ip,   RequestReciever._communicationPort);
            InputStream in = new FileInputStream("Capture/tmp.jpg");
            java.io.OutputStream out = socket.getOutputStream();

            copy(in, out);
            System.out.println("Sent Image !");
            socket.close();
            out.close();
            in.close();

        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            System.out.println("Cant find tmp.jpg");
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   
    }


    static void copy(InputStream in, java.io.OutputStream out) throws IOException {
            byte[] buf = new byte[8192];
            int len = 0;
            while ((len = in.read(buf)) != -1) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
     }
}

2 个答案:

答案 0 :(得分:0)

消除这个

echoServer.close();

此行关闭套接字。连接中止的原因。

答案 1 :(得分:0)

在几次脑崩溃之后,我决定在客户端放置服务器套接字来监听来自服务器的更新是最好的方法。 我修了几件事: *服务器应该启动一个新线程来处理每个接受的连接,而不是在接受线程中内联处理每个连接。 *我试图通过服务器套接字而不是登录初始化获得第一次更新。  现在,在登录后获得第一次更新后,我在客户端添加了一个服务器套接字,因此它将继续监听服务器的进一步更新。