我正在开发一个可以从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;
}
}
答案 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)更频繁地更新鼠标坐标。