如何在java中优化此套接字代码?

时间:2016-01-15 05:11:24

标签: java android sockets

我正在开发一个可以从Android手机控制鼠标的应用程序。问题是移动时插槽鼠标滞后通信速度很慢。当用户在屏幕上移动手指时,我想移动鼠标指针。如何优化此代码?

在计算机端我正在使用此代码

   try {
                    serverSocket = new ServerSocket(4444);    
            } catch (IOException e) {
                System.out.println("Could not listen on port: 4444");
            }

            System.out.println("Server started. Listening to the port 4444");


        while (true) {
            try {

                clientSocket = serverSocket.accept(); 

                inputStreamReader = new InputStreamReader(
                        clientSocket.getInputStream());
                bufferedReader = new BufferedReader(inputStreamReader);

                message = bufferedReader.readLine();

                System.out.println(message);
                Robot robot = new Robot();

                switch (message) {

                case "first":
                    ix = MouseInfo.getPointerInfo().getLocation().x;
                    iy = MouseInfo.getPointerInfo().getLocation().y;
                    break;

                case "lclickp":
                    robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
                    break;

                case "lclickr":
                    robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
                    break;


                //several more cases

            } catch (IOException | AWTException ex) {
                System.out.println("Problem in message reading");
            }

我在android端使用它。

private class SendMessage extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... params) {
            try {

                client = new Socket(Login.IP, 4444); // connect to the server
                printwriter = new PrintWriter(client.getOutputStream(), true);
                printwriter.write(messsage); // write the message to output stream

                printwriter.flush();
                printwriter.close();
                client.close(); // closing the connection

            } catch (UnknownHostException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }


    }

3 个答案:

答案 0 :(得分:2)

不要为每条消息创建一个新连接:保持套接字打开。在服务器端,每个接受的套接字处理多个消息,直到readLine()返回null。

答案 1 :(得分:-1)

现在我刚刚开始学习,我不擅长套接字编程,但我认为服务器应该等待单独线程中的新连接,因为ServerSocket.accept()方法会阻塞,直到有连接并导致我的应用程序被冻结那条线。

Thread conWaitingThread = new Thread(new Runnable(){
while (true){
//try
socket = serverSocket.accept();
//catch
}
void startWaiting(){
comWaitingThread.start();
}

void endWaiting(){
if(conWaitingThread.isAlive()){
conWaitingThread.interrupt();
}
}

并从客户端读取消息

while(input.readLine()!=null){
try{
message = input.readLine();
//ur switch case
}catch (ioException e){
//do catch
}
}

对于客户端,创建一次socket和iostreams并让它们打开。不关闭iostreams,因为关闭iostreams也会关闭相应的套接字。可以在onCreate中打开套接字和io,然后在onDestroy.中关闭。请注意,serverSide上的input.readLine()会等待新行char,而printWriter.write()不会自动添加该行。因此,虽然调用printWriter.flush()并且您需要在编写时连接“\ n”,但您可能无法获得任何传入数据。

答案 2 :(得分:-1)

在PC方面: 考虑重构为几个辅助类,可能是一个用于Connect,一个用于发送更新,另一个用于Disconnect。然后,每个会话只需连接和断开一次。

最好在服务器和客户端上设置滴答速率,以防止过度使用CPU时间和其他资源。例如,没有必要比典型监视器的刷新率更新(60fps / 16.6ms)更频繁地更新鼠标坐标。