【问题标题】:why doesn't my client read correctly the outputStream sent by the Server?为什么我的客户端没有正确读取服务器发送的输出流?
【发布时间】:2010-09-29 21:45:55
【问题描述】:

这是一个简单的客户端-服务器,其中 Server 使用 BufferedWriter 对象将发送到 Client 在对象 BufferedReader 中接收。

当我将OutputStreamPrintWriter 用于服务器InputStreamScanner 用于客户端 时,它运行良好。

如果我发送 intnullString,客户端会以 Buffered 方式读取 -1 .

我希望我的英语是有意义的。 ;P

代码如下:

服务器

import java.io.*;
import java.net.*;

public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket server = new ServerSocket(8189);
        Socket incoming;

        incoming = server.accept();
        try {
            // OutputStream output = incoming.getOutputStream();
            // PrintWriter outStream = new PrintWriter(output, true /*autoFlush*/);
            // outStream.println("ENTER");
            BufferedWriter output = new BufferedWriter(new           
                                    OutputStreamWriter(incoming.getOutputStream()));
            output.write(3);
            System.out.println("\nSent");

        } finally {
            incoming.close();
        }
    }
}

客户

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {

        //Client theClient= new Client();
        Socket RTSPSocket;
        int ServerPort = 8189;
        //server name address
        String ServerHost = "localhost";

        //get Server IP Address
        InetAddress ServerIPAddress = InetAddress.getByName(ServerHost);

        RTSPSocket = new Socket(ServerIPAddress, ServerPort);

        try {
            /*
            InputStream input = theClient.RTSPSocket.getInputStream();
            Scanner in = new Scanner(input);
            String line = in.nextLine();
            System.out.println(line);
            */

            BufferedReader input = new BufferedReader(new  
                                   InputStreamReader(RTSPSocket.getInputStream()));

            //String line = input.readLine();
            //System.out.println("\nRicevuto: " + line);
            System.out.println(input.read());
        } catch (Exception e) {
            System.err.println("Error: " + e);
        }
    }
}

【问题讨论】:

    标签: java sockets stream client-server bufferedreader


    【解决方案1】:

    尝试将以下代码放在 output.write(3) 之后;

    output.flush();
    

    BufferedOutputStream 被构建为仅在缓冲区已满时发送数据(我相信默认的 1024 字节)。因此,要强制发送数据,您需要刷新流。

    【讨论】:

    • 是的。此外,您还需要在 finally 块中关闭 BufferedOutputWriter。这样做也会隐式关闭 Socket,尽管它通常被认为是显式关闭两者的好形式。
    【解决方案2】:

    您必须刷新数据才能在客户端部分接收它们。

            output.write(3);
            output.flush();
            System.out.println("\nSent");
    

    当您拥有 OutputStream(或 Writer)时,您必须刷新数据,这样您就可以 100% 确定您想要发送的内容已经发送。

    大多数(如果不是全部)OutputStream 子类使用“迷你缓冲区”,只有当它已满或您手动调用 flush() 时才会刷新。在您的情况下,它甚至更加公然,因为您使用的是BufferedWriter

    另一件事,当你使用流/写入器时,你真的应该在完成后关闭它们,close() 做的主要事情之一(大部分时间)是刷新“迷你缓冲区”中剩余的最后数据”。


    资源:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-04
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      相关资源
      最近更新 更多