已连接Java套接字,但无法通过OutputStream.write()发送消息,但PrintStream可以工作

时间:2019-10-05 16:32:50

标签: java sockets socket.io

我是Java套接字编程的业余爱好者。就像我在标题中所说的那样,当我使用PrintStream进行套接字输出时,它可以工作;但是如果我仅使用OutputStream则不起作用。
我知道客户端连接到服务器是因为“服务器获取了客户端的信息。所以我认为I / O流一定有问题,而不是套接字连接。

顺便说一句,我什至对flush()使用了OutputStream方法。我认为flush()将强制发送所有字节,但似乎不起作用。

客户代码: @第12行

public class Clinet {

    public static void main(String[] args) throws UnknownHostException, IOException {
        System.out.println("==========Client============");
        Socket socket = new Socket("localhost", 8888);// Server's addr and port
        socket.setSoTimeout(3000);

        InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream();

        String msgToSent = "Hello TCP";
        outputStream.write(msgToSent.getBytes());
        outputStream.flush();// FIXME:why flush() didn't work?why msg wasn't sent.

        // read from socket input
        String receivedMsg = new String(inputStream.readAllBytes());
        System.out.println(receivedMsg);

        socket.close();
    }

}

当我使用PrintStream之类的过滤器流时,msg可以发送到服务器。

服务器代码:如果使用PrintStream,它将与客户端完美配合:

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(8888);

        while (true) {
            Socket client = serverSocket.accept();
            new Thread(new ServerHandler(client)).start();
        }
    }
}

class ServerHandler implements Runnable {
    private Socket client;

    ServerHandler(Socket client) {
        this.client = client;
    }

    @Override
    public void run() {
        try {
            InetAddress clientAddr = client.getInetAddress();
            int clientPort = client.getPort();
            System.out.println("client connected @ " + clientAddr + ":" + clientPort);

            InputStream inputStream = client.getInputStream();
            OutputStream outputStream = client.getOutputStream();

            while (true) {
                String msg = new String(inputStream.readAllBytes());// FIXME: Why Server didn't receive Client's msg?
                System.out.print("/" + clientAddr + "@" + clientPort + " : ");
                System.out.println(msg);

                String reply = "I received " + msg.length() + " words.";// return how many words the server got.
                outputStream.write(reply.getBytes());
                outputStream.flush();// flush to ensure send all msg,but seems doesn't work
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

0 个答案:

没有答案