【发布时间】:2017-09-11 02:18:04
【问题描述】:
我正在使用this 链接开发一个简单的客户端服务器程序。我的服务器是 Mac 机器,客户端是 Windows 机器(Win 10)。
客户端-服务器通信工作正常。当我检查使用 Wireshark 发送的字节时,在第一个 TCP 数据包中只发送了一个字符。还有另一个 TCP 数据包,其余数据将在其中发送。
即如果我发送“qwerty”,客户端发送“q”,服务器响应,然后客户端发送“werty”。同样,服务器发送“Q”,客户端响应,然后服务器发送“WERTY”。
这是我的客户端服务器代码。执行 writeBytes() 后,我正在刷新数据。
如何强制在单个 TCP 数据包中发送数据?
客户代码:
import java.io.*;
import java.net.*;
class Client
{
public static void main(String argv[]) throws Exception
{
String sentence;
String modifiedSentence;
BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in));
Socket clientSocket = new Socket("192.1.162.65", 6789);
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
System.out.println("Enter some text: " + inFromServer);
sentence = inFromUser.readLine();
outToServer.writeBytes(sentence + '\n');
outToServer.flush();
modifiedSentence = inFromServer.readLine();
System.out.println("FROM SERVER: " + modifiedSentence);
clientSocket.close();
}
}
服务器代码:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void createListener(ServerSocket serverSocket) throws Exception {
String clientSentence;
String capitalizedSentence;
@SuppressWarnings("resource")
ServerSocket welcomeSocket = new ServerSocket(6789);
while (true) {
@SuppressWarnings("resource")
Socket connectionSocket = welcomeSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());
clientSentence = inFromClient.readLine();
System.out.println("Received: " + clientSentence);
capitalizedSentence = clientSentence.toUpperCase() + '\n';
outToClient.writeBytes(capitalizedSentence);
outToClient.flush();
}
}
public static void main(String[] args) throws Exception {
Server.createListener(null);
}
}
编辑 1: 这个问题背后的原因是,我试图使用相同的服务器代码将数据发送到另一个不受我控制的客户端。在这种情况下,上面的代码只发送第一个 TCP 数据包。我在 Wireshark 上看不到第二个 TCP 数据包。关于如何调试它的任何建议?
【问题讨论】:
-
TCP 是一种流协议。除了最初的连接和连接的关闭之外,没有开始或结束。只有一个字节流。
-
有人可以澄清投票背后的原因,因为我认为这是一个合理的问题吗?
-
使用 write 而不是 writeBytes 的长度,然后调用 flush。
标签: java sockets tcp network-programming client-server