0

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

当我将OutputStreamandPrintWriter用于服务器和客户InputStream时,它运行良好。Scanner

如果我为String发送一个intnull ,那么会发生什么情况下,客户端以缓冲方式读取 -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);
        }
    }
}
4

2 回答 2

3

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

output.flush();

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

于 2010-09-29T22:00:22.760 回答
1

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

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

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

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

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


资源 :

于 2010-09-29T22:02:31.923 回答