簡體   English   中英

套接字readLine()不接收發送的行

[英]Socket readLine() doesn't receive line sent

我正在建立一個客戶服務器項目。
我需要的是客戶端發送一個字符串,例如“ Pendu”,服務器接收該字符串,然后將一個名為“ Pendu”的對象發送回客戶端。

這是我的代碼:

// server
ServerSocket serverSocket = new ServerSocket(6789);
System.out.println("accepting...");
Socket socket = serverSocket.accept();
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ObjectOutputStream outToClient = new ObjectOutputStream(socket.getOutputStream());
String clientMsg = inFromClient.readLine();
System.out.println("Received from client: " + clientMsg);
Object obj;
System.out.println("building object...");
obj = Class.forName("Data." + clientMsg).newInstance();
System.out.println("object built");
if(obj instanceof Pendu)
{
    System.out.println("Send to client: " + obj);
    outToClient.writeObject(new Pendu());
}


//client
Socket socket = new Socket("localhost", 6789);
DataOutputStream outToServer = new DataOutputStream(socket.getOutputStream());
System.out.println("sending...");
outToServer.writeBytes("Pendu");
System.out.println("sent");
ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
System.out.println("receiving...");
Object obj = ois.readObject(); // it is blocked here and I don't know why
System.out.println("received");

Pendu類在包Data定義:

package Data;

public class Pendu implements Serializable
{
    private static final long serialVersionUID = 1L;
    private static String[] words = new String[]{"bonjour", "bonsoir", "hier", "france", "ordinateur"};
    private static Random rand = new Random();
    private String but;

    public Pendu()
    {
        this.but = words[rand.nextInt(words.length)];
    }

    public int getLenth()
    {
        return this.but.length();
    }

    public String getBut()
    {
        return this.but;
    }

    @Override
    public String toString()
    {
        return "I'm a pendu object";
    }
}

我的問題是:
首先,我執行服務器,然后可以看到控制台中顯示了正在accepting...
然后執行客戶端,在控制台中,我收到如下消息:

sending...
sent
receiving...

同時,服務器端未顯示任何新內容。
現在,我停止客戶端,並顯示服務器的所有其他消息:

Received from client: Pendu
building object...
object built

當然我也得到錯誤:

java.net.SocketException:管道損壞

這是合乎邏輯的,因為我殺死了尚未完成接收的客戶端。
我不知道為什么客戶不能收到預期的結果。

您正在閱讀的行,而不是在寫行。 您需要在"Pendu"消息中添加行終止符。

注意:發送Pendu ,為什么要發送新的Pendu而不是剛創建的Pendu

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM