TCP 客户端消息累积
TCP Client message acumulating
我正在尝试实现一个 TCP 客户端,它每 50 毫秒向服务器发送一次。所以我开发了一个快速的 TCP 测试程序,我可以在其中更改每条消息之间的时间,但我并没有真正收到发送每个 X 毫秒的消息,而且它们正在累积,正如您在 Wireshark 捕获中看到的那样。有什么想法吗?
它应该只有一个字母 a 并且自此 TCP 流中的前一帧以来的时间 应该接近本示例中控制台引入的值 0.08 秒
public class TCPClient {
static Socket clientSocket;
static DataOutputStream outToServer;
public static class enviar extends TimerTask {
public void run() {
try{
outToServer.writeBytes("a");
System.out.println("Packet Sent");
}catch(Exception e){
System.out.println(e);
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int tiempo = 1000;
System.out.print("Tiempo: ");
tiempo = scanner.nextInt();
try{
clientSocket = new Socket("192.168.1.21", 1337);
outToServer = new DataOutputStream(clientSocket.getOutputStream());
}catch(Exception e){
System.out.println(e);
}
Timer timer = new Timer();
timer.schedule(new enviar(), 0, tiempo);
}
}
您可以通过设置套接字选项 "TCP_NODELAY" 来影响发送方行为(本地拼写可能会有所不同),这使得字节更有可能立即发送(受流量控制等)但是不会改变 TCP 的基本性质。
TCP 不是 message-oriented 协议,它是顺序 byte-stream 协议。无法保证 'send' 的单独执行会导致另一端的 'receives' 具有相同的编号和相同的内容。这种情况经常发生,尤其是在 LAN 上,您很不走运,'message' 边界似乎被保留了下来,但事实并非如此。
如果你想要消息,你必须发明它们。标准技术:fixed-length 消息(听起来像你这样做:长度 1),header 给出长度,分隔符字节。必须对接收器进行编码以重建消息。 on-the-wire 打包并不重要。
我正在尝试实现一个 TCP 客户端,它每 50 毫秒向服务器发送一次。所以我开发了一个快速的 TCP 测试程序,我可以在其中更改每条消息之间的时间,但我并没有真正收到发送每个 X 毫秒的消息,而且它们正在累积,正如您在 Wireshark 捕获中看到的那样。有什么想法吗?
它应该只有一个字母 a 并且自此 TCP 流中的前一帧以来的时间 应该接近本示例中控制台引入的值 0.08 秒
public class TCPClient {
static Socket clientSocket;
static DataOutputStream outToServer;
public static class enviar extends TimerTask {
public void run() {
try{
outToServer.writeBytes("a");
System.out.println("Packet Sent");
}catch(Exception e){
System.out.println(e);
}
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int tiempo = 1000;
System.out.print("Tiempo: ");
tiempo = scanner.nextInt();
try{
clientSocket = new Socket("192.168.1.21", 1337);
outToServer = new DataOutputStream(clientSocket.getOutputStream());
}catch(Exception e){
System.out.println(e);
}
Timer timer = new Timer();
timer.schedule(new enviar(), 0, tiempo);
}
}
您可以通过设置套接字选项 "TCP_NODELAY" 来影响发送方行为(本地拼写可能会有所不同),这使得字节更有可能立即发送(受流量控制等)但是不会改变 TCP 的基本性质。
TCP 不是 message-oriented 协议,它是顺序 byte-stream 协议。无法保证 'send' 的单独执行会导致另一端的 'receives' 具有相同的编号和相同的内容。这种情况经常发生,尤其是在 LAN 上,您很不走运,'message' 边界似乎被保留了下来,但事实并非如此。
如果你想要消息,你必须发明它们。标准技术:fixed-length 消息(听起来像你这样做:长度 1),header 给出长度,分隔符字节。必须对接收器进行编码以重建消息。 on-the-wire 打包并不重要。