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

如何在java中优化此套接字代码?,java,android,sockets,Java,Android,Sockets,我正在开发一个可以从android手机控制鼠标的应用程序。问题是通讯非常缓慢,移动时鼠标会滞后。我想在用户在屏幕上移动手指时移动鼠标指针。如何优化此代码 在计算机方面,我使用的是这个代码 try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.out.println("Could not

我正在开发一个可以从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;
        }


    }
私有类SendMessage扩展异步任务{
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
client=newsocket(Login.IP,4444);//连接到服务器
printwriter=新的printwriter(client.getOutputStream(),true);
write(message);//将消息写入输出流
printwriter.flush();
printwriter.close();
client.close();//关闭连接
}捕获(未知后异常e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
}

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

现在我刚刚开始学习,套接字编程不好,但我认为服务器应该在单独的线程中等待新的连接,因为
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
}
}
对于客户端,创建一次套接字和iostream并让它们打开。不关闭iostreams,因为关闭iostreams也会关闭相应的套接字。可以在创建时打开套接字和io,在存储时关闭。请注意服务器端的
input.readLine()
等待新行字符,并且
printWriter.write()
不会自动添加该字符。因此,尽管调用了
printWriter.flush()
,但您可能无法获得任何传入数据,您需要在写入时输入“\n”。

在PC端: 考虑重构到几个辅助类,也许一个用于连接,一个用于发送更新,一个用于断开连接。然后,每个会话只需连接和断开连接一次


最好在服务器和客户机上都设置一个刻度率,以防止过度使用CPU时间和其他资源。例如,不需要更新鼠标坐标的频率高于典型监视器的刷新率(60fps/16.6ms)

他将需要在书写时连接
“\n”
:不可能。当(Thread.currentThread.isAlive())处于活动状态时测试
是毫无意义的:如果线程不处于活动状态,测试将无法执行。你的阅读循环也不正确:它应该是
,而((message=input.readLine())!=null)
。你的阅读循环仍然是错误的,与原来的不同,这很奇怪,因为我给了你一个正确的版本;您的服务器代码不完整,看起来它只能处理一个连接,如果是这样的话;'“可能无法获取任何传入数据”应为“不会获取任何传入数据”;你第一段中的所有短处都无关紧要。这要么是答案,要么不是。在电脑方面,他主要在
accept
readLine()中阻止。
这个循环没有“尽可能快地”运行,也不会“像任何人一样使用内存”。他需要为每一个接受的插座重新测试阅读器。