我正在使用this鏈接開發一個簡單的客戶端服務器程序。我的服務器是Mac機,客戶機是Windows機器(Win 10)。爲什麼Java writeBytes只發送第一個TCP數據包中的一個字節並保留在另一個TCP數據包中
客戶端 - 服務器通信正常工作。當我檢查使用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是一個流媒體協議。除了初始連接和連接關閉之外,沒有開始或結束。只有一串字節。 –
有人可以澄清downvote背後的原因,因爲我覺得這是一個合法的問題嗎? – Anit
感謝您的及時接受! – GhostCat