如何在java中优化此套接字代码?
我正在开发一个可以从android手机控制鼠标的应用程序。问题是通讯非常缓慢,移动时鼠标会滞后。我想在用户在屏幕上移动手指时移动鼠标指针。如何优化此代码 在计算机方面,我使用的是这个代码如何在java中优化此套接字代码?,java,android,sockets,Java,Android,Sockets,我正在开发一个可以从android手机控制鼠标的应用程序。问题是通讯非常缓慢,移动时鼠标会滞后。我想在用户在屏幕上移动手指时移动鼠标指针。如何优化此代码 在计算机方面,我使用的是这个代码 try { serverSocket = new ServerSocket(4444); } catch (IOException e) { System.out.println("Could not
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()中阻止。
这个循环没有“尽可能快地”运行,也不会“像任何人一样使用内存”。他需要为每一个接受的插座重新测试阅读器。