当消息到达服务器而没有在java中读取流时,会发生什么?

时间:2016-04-26 19:11:19

标签: java sockets server client client-server

如果我有服务器和客户端,我在两者之间打开了一个套接字:

1.客户端是否有可能有一个printWriter流,以便将内容写入套接字,但服务器在同一时间内不会有一个bufferReader?

  1. 如果1的答案为是,如果该客户端将向服务器(当前没有读取流)发送消息,则该消息将发生什么,直到服务器将创建读取流并读取消息?
  2. 谢谢

2 个答案:

答案 0 :(得分:5)

这完全不是Java特有的,而是TCP/IP。存在用于保持接收数据的缓冲器,因此不可能丢失某些数据,因为一端不准备"然而。这是因为TCP将重新传输尚未被确认为已接收的数据,从而保证所有写入的字节都在另一个上接收(除非有明显的情况)。

答案 1 :(得分:0)

除了@Kayaman的回答:

考虑这个可编译的简单Java实现示例:

服务器端:

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

public class SimpleServer implements Runnable{

    int          serverPort   = 45000;
    ServerSocket serverSocket = null;
    boolean      isStopped    = false;

    public SimpleServer(int port){
        this.serverPort = port;
    }

    public void run(){
        try {
            serverSocket = new ServerSocket(serverPort);
        } catch (IOException e) {
            System.err.println("Cannot listen on this port.\n" + e.getMessage());
            System.exit(1);
        }    
            while(!isStopped){
                try {
                        Socket clientSocket = serverSocket.accept();
                } catch (IOException e) {
                    // do nothing
                }
            }
    }

public static void main(String[] args) throws IOException {
        SimpleServer server = new SimpleServer(45000);
        new Thread(server).start();
        System.out.println("Server is waiting to connect");
    }
}

客户端:

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

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

        Socket socket = null; 
        PrintWriter out = null;

        try {
            socket = new Socket("127.0.0.1", 45000);   
            out = new PrintWriter(socket.getOutputStream(), true);  
            System.out.println("output stream created");
            out.write(9);
            System.out.println("message was sent to output with no listener");

        } catch (UnknownHostException e) {
            // do nothing
        } catch (IOException e) {
            // do nothing
        }
    }
}

该示例是 very 基本客户端服务器连接的实现,其中创建套接字并且仅在客户端定义流,然后写入最终将成为流的流由服务器读取(如果有的话)。

因此,回答你的问题:
1)是的,可以在没有"听众的情况下打开单向连接流"
2)编辑:根据@EJP:它将被保存在套接字缓冲区中,直到它被读取或套接字被关闭。