簡體   English   中英

Java從套接字讀取消息未發送完整消息

[英]Java reading message from socket is not sending full message

你好,我正在使用這種方法來讀取消息:

public String readMessage() {
    int read = -1;
    byte[] buffer = new byte[5*1024];
    byte[] redData;
    try {
        while ((read = this.session.getInputStream().read(buffer)) > -1) {
            redData = new byte[read];
            System.arraycopy(buffer, 0, redData, 0, read);
            return new String(redData,"UTF-8");

        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

當我寫“你好,你今天好嗎?”之類的東西時

響應(精確格式,包括這些新行):

[/127.0.0.1:54930]:     
[/127.0.0.1:54930]: are

[/127.0.0.1:54930]: you

[/127.0.0.1:54930]: today?

這就是我讀取聊天消息的方式,首先我檢查請求的數據包,如果數據包類型為0,然后獲取packethandler的實例,然后將客戶端對象傳遞給Chat處理數據包,該數據包將在此處讀取消息,如下所示:

public void startClientService() throws IOException {
    while(true) {
        int packetType = this.in.read();
        packets.getPacket(packetType);
    }
}
public void getPacket(int packetType) {
    switch (packetType) {
    case 0:
        chat.processPacket(this.client);
        break;
    }
}

和聊天包:

@Override
public void processPacket(Session c) {
    String clientMessage = c.readMessage();
    System.out.println("[" + c.getStream().getRemoteSocketAddress() + "]: " + clientMessage.toString());
}

並出現打印消息。

為什么它用新行打印部分消息? 甚至沒有完整的消息。

這是我的客戶:

public static void main(String[] args) throws UnknownHostException, IOException {
    Socket socket = new Socket("127.0.0.1", 43594);
    Scanner r = new Scanner(System.in);
    PrintWriter out = new PrintWriter(socket.getOutputStream());
    String input;
    while(true) {
        input = r.next();
        if (input != null) {
            sendMessage(input, out);
        }
    }

}

public static void sendMessage(String message, PrintWriter out) {
    out.write(0);
    out.flush();
    out.write(message + "\n");
    out.flush();
}

謝謝。

會議:

public class Session extends Thread implements Runnable {

    private Socket session;
    private Client client;
    private PrintWriter out;
    private BufferedReader in;  
    private PacketHandler packets;

    public Session(Socket session) {
        this.session = session;
        this.client = new Client(this);
        try {
            this.setStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        this.packets = new PacketHandler(this);
        System.out.println("[New session created]: " + session.getRemoteSocketAddress());
    }   

    public void run() {
        try {
            this.startClientService();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public Socket getStream() {
        return this.session;
    }

    public void setStream() throws IOException {
        this.out = new PrintWriter(this.session.getOutputStream());
        this.in = new BufferedReader(new InputStreamReader(this.session.getInputStream()));
    }

    public Client getClient() {
        return this.client;
    }

    public String readMessage() {
        int read = -1;
        byte[] buffer = new byte[5*1024];
        byte[] redData;
        try {
            while ((read = this.session.getInputStream().read(buffer)) > -1) {
                redData = new byte[read];
                System.arraycopy(buffer, 0, redData, 0, read);
                return new String(redData,"UTF-8");

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    public void startClientService() throws IOException {
        while(true) {
            int packetType = this.in.read();
            packets.getPacket(packetType);
        }
    }

    public void destruct() throws IOException {
        this.session.close();
        System.out.println("Session killed");
    }

}

看起來只要您從流中獲取了一些數據,您就將返回。

  while ((read = this.session.getInputStream().read(buffer)) > -1) {
            redData = new byte[read];
            System.arraycopy(buffer, 0, redData, 0, read);
            return new String(redData,"UTF-8");

        }

完全讀取數據,並從中創建一個字符串對象並返回

    BufferedReader br = new BufferedReader(new InputStreamReader(this.session.getInputStream()));
String msg = br.readLine();
br.close();
    return msg;

嘗試這種方式。 這會將全部數據提供給緩沖區,並且可以作為字符串行返回。

從一次調用讀取返回的數據量與發送時數據如何划分無關。 一個發送可以導致任何數量的讀取,並且多個發送可以組合為一個讀取。

暫無
暫無

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

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