Android 到 Java TCP/IP 读取速度太慢
Android to Java TCP/IP reads too slow
所以,我一直在创建一个利用蓝牙和 WiFi(用户决定)的无线鼠标应用程序,我最近决定从 UDP 连接到 TCP 连接,因为我注意到主流鼠标应用程序之一使用 TCP而不是UDP。
我的问题: 我正在通过 TCP-IP 将多个字节数组发送到我的服务器端,但感觉好像有延迟,有什么方法可以提高速度我接收字节数组的速度有多快?
涉及接收的服务器代码:
Socket client = null;
BufferedInputStream bis = null;
try {
client = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
}
try {
bis = new BufferedInputStream(client.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
byte data[] = new byte[2];
if (bis != null) {
try {
while(alive && (bis.read(data)) != -1) {
System.out.println(data[0] + " " + data[1]);
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int)b.getX();
int y = (int)b.getY();
dx = data[0];
dy = data[1];
newX = x + dx;
newY = y + dy;
if(dx == -98 && dy == -98) {
// Right click
r.mousePress(InputEvent.BUTTON3_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
} else if (dx == -99 && dy == -99) {
// Left click
r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
} else if (dx == -97 && dy == -97) {
// Middle click
r.mousePress(InputEvent.BUTTON2_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON2_DOWN_MASK);
Main.wifiDisconnect.doClick();
} else {
if (!recieve && (dx != 0 || dy != 0)) { // No current thread and non empty values - Start a new one
newX = x + dx;
newY = y + dy;
i = 0;
recieve = true;
mmThread = new Thread(new Runnable() {
@Override
public void run() {
while (recieve){
r.mouseMove(newX + i * dx, newY + i * dy);
r.delay(8);
i++;
}
}
});
mmThread.start();
} else if (recieve && dx == 0 && dy == 0) {
recieve = false;
try {
mmThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
mmThread = null;
} else {
newX = x + dx;
newY = y + dy;
i = 0;
}
}
}
客户端代码(Android)涉及发送:
public class sendTask extends AsyncTask<Byte, Void, Void> {
@Override
protected Void doInBackground(Byte ...bytes) {
try {
byte x = bytes[0].byteValue();
byte y = bytes[1].byteValue();
System.out.println("Message sending: " + x + " " + y);
byte buf[] = {x, y};
bos.write(buf); //buffered output stream
bos.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
我自己的联网游戏也遇到了类似的问题。
如果你发送太多数据包,就会有很大的延迟。一般而言,网络无法处理被抛出的那么多数据包,而对于 TCP,在收到最后一个数据包之前无法发送下一个数据包,因此数据包只是排队等待发送。它会导致大量延迟。
我发现当我在发送数据包时添加 5 毫秒延迟时,我的游戏非常流畅并且运行完美。
挖出提交:https://github.com/anubiann00b/JourneyOfFear/commit/e9074d31bff235a0a12a9d6a0f8998ed2a817d85
首先,获取像 WireShark 这样的网络嗅探器,并确定发生了什么。没有它就知道是不可能的。
但我会推测... TCP 有所谓的“Nagle's Algorithm”来处理小数据包。基本上,它会延迟小数据包的传输,因为更多数据将很快准备好发送,并且可以将其聚合到一个更大的数据包中,整体好处是以几毫秒为代价的更高效的网络连接。
您可以设置套接字选项 TCP_NODELAY
来禁用它并立即发送所有写入的字节。
所以,我一直在创建一个利用蓝牙和 WiFi(用户决定)的无线鼠标应用程序,我最近决定从 UDP 连接到 TCP 连接,因为我注意到主流鼠标应用程序之一使用 TCP而不是UDP。
我的问题: 我正在通过 TCP-IP 将多个字节数组发送到我的服务器端,但感觉好像有延迟,有什么方法可以提高速度我接收字节数组的速度有多快?
涉及接收的服务器代码:
Socket client = null;
BufferedInputStream bis = null;
try {
client = serverSocket.accept();
} catch (IOException e) {
e.printStackTrace();
}
try {
bis = new BufferedInputStream(client.getInputStream());
} catch (IOException e) {
e.printStackTrace();
}
byte data[] = new byte[2];
if (bis != null) {
try {
while(alive && (bis.read(data)) != -1) {
System.out.println(data[0] + " " + data[1]);
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int)b.getX();
int y = (int)b.getY();
dx = data[0];
dy = data[1];
newX = x + dx;
newY = y + dy;
if(dx == -98 && dy == -98) {
// Right click
r.mousePress(InputEvent.BUTTON3_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON3_DOWN_MASK);
} else if (dx == -99 && dy == -99) {
// Left click
r.mousePress(InputEvent.BUTTON1_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
} else if (dx == -97 && dy == -97) {
// Middle click
r.mousePress(InputEvent.BUTTON2_DOWN_MASK);
r.mouseRelease(InputEvent.BUTTON2_DOWN_MASK);
Main.wifiDisconnect.doClick();
} else {
if (!recieve && (dx != 0 || dy != 0)) { // No current thread and non empty values - Start a new one
newX = x + dx;
newY = y + dy;
i = 0;
recieve = true;
mmThread = new Thread(new Runnable() {
@Override
public void run() {
while (recieve){
r.mouseMove(newX + i * dx, newY + i * dy);
r.delay(8);
i++;
}
}
});
mmThread.start();
} else if (recieve && dx == 0 && dy == 0) {
recieve = false;
try {
mmThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
mmThread = null;
} else {
newX = x + dx;
newY = y + dy;
i = 0;
}
}
}
客户端代码(Android)涉及发送:
public class sendTask extends AsyncTask<Byte, Void, Void> {
@Override
protected Void doInBackground(Byte ...bytes) {
try {
byte x = bytes[0].byteValue();
byte y = bytes[1].byteValue();
System.out.println("Message sending: " + x + " " + y);
byte buf[] = {x, y};
bos.write(buf); //buffered output stream
bos.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
我自己的联网游戏也遇到了类似的问题。
如果你发送太多数据包,就会有很大的延迟。一般而言,网络无法处理被抛出的那么多数据包,而对于 TCP,在收到最后一个数据包之前无法发送下一个数据包,因此数据包只是排队等待发送。它会导致大量延迟。
我发现当我在发送数据包时添加 5 毫秒延迟时,我的游戏非常流畅并且运行完美。
挖出提交:https://github.com/anubiann00b/JourneyOfFear/commit/e9074d31bff235a0a12a9d6a0f8998ed2a817d85
首先,获取像 WireShark 这样的网络嗅探器,并确定发生了什么。没有它就知道是不可能的。
但我会推测... TCP 有所谓的“Nagle's Algorithm”来处理小数据包。基本上,它会延迟小数据包的传输,因为更多数据将很快准备好发送,并且可以将其聚合到一个更大的数据包中,整体好处是以几毫秒为代价的更高效的网络连接。
您可以设置套接字选项 TCP_NODELAY
来禁用它并立即发送所有写入的字节。