Java 对输入流(套接字)的读写感到困惑
我有一个关于从与套接字相关的输入流读写的问题。例如,我有Java 对输入流(套接字)的读写感到困惑,java,sockets,Java,Sockets,我有一个关于从与套接字相关的输入流读写的问题。例如,我有 ServerSocket testie = new ServerSocket(0); Socket putClient = new Socket("localhost",testie.getLocalPort()); InputStream is = putClient.getInputStream(); OutputStream os = putClient.getOutputStream(); os.write("testt".get
ServerSocket testie = new ServerSocket(0);
Socket putClient = new Socket("localhost",testie.getLocalPort());
InputStream is = putClient.getInputStream();
OutputStream os = putClient.getOutputStream();
os.write("testt".getBytes());
System.out.println(convertStreamToString(is));
但奇怪的是,“testt”从未印刷过。方法convertStreamToString
来自
我对流和套接字的理解有缺陷吗。我认为,如果您写入套接字的输出流,您可以从其输入流中检索它?该方法只是无限期地挂起。如果写入套接字的输出流,则可以从远程套接字的输入流读取。在代码中,您正在向套接字的一侧写入,然后尝试从同一侧读取 不幸的是,您甚至还没有创建远程套接字。接下来要做的事情是在
ServerSocket
上调用accept()
。这将从putClient
接收连接,并创建一个Socket
。此新套接字将是服务器端套接字。基本上,您将拥有以下内容:
//Server Thread
ServerSocket testie = new ServerSocket(0);
Socket remoteSocket = testie.accept();
remoteIs = remoteSocket.getInputStream();
remoteOs = remoteSocket.getOutputStream();
System.out.println(new Scanner(remoteIs).next());
//Client Thread
Socket putClient = new Socket("localhost",testie.getLocalPort());
InputStream is = putClient.getInputStream();
OutputStream os = putClient.getOutputStream();
os.write("testt\n".getBytes());
os.flush();
注意,我说的是两个不同的线程。问题是调用testie.accept()
将阻塞,直到它获得连接。但是,newsocket(“localhost”,testie.getLocalPort())
也将阻塞,直到建立连接。不能在同一线程上进行这些调用
更新:
可能值得指出的是,我对
convertStringToStream
方法不是很有信心。您可能希望从一些简单的内容开始,如我在上面所做的修改(注意写入调用中的换行符)。如果您写入套接字的输出流,您可以从远程套接字的输入流中读取。在代码中,您正在向套接字的一侧写入,然后尝试从同一侧读取
不幸的是,您甚至还没有创建远程套接字。接下来要做的事情是在ServerSocket
上调用accept()
。这将从putClient
接收连接,并创建一个Socket
。此新套接字将是服务器端套接字。基本上,您将拥有以下内容:
//Server Thread
ServerSocket testie = new ServerSocket(0);
Socket remoteSocket = testie.accept();
remoteIs = remoteSocket.getInputStream();
remoteOs = remoteSocket.getOutputStream();
System.out.println(new Scanner(remoteIs).next());
//Client Thread
Socket putClient = new Socket("localhost",testie.getLocalPort());
InputStream is = putClient.getInputStream();
OutputStream os = putClient.getOutputStream();
os.write("testt\n".getBytes());
os.flush();
注意,我说的是两个不同的线程。问题是调用testie.accept()
将阻塞,直到它获得连接。但是,newsocket(“localhost”,testie.getLocalPort())
也将阻塞,直到建立连接。不能在同一线程上进行这些调用
更新:
可能值得指出的是,我对convertStringToStream
方法不是很有信心。您可能希望从一些简单的内容开始,比如我在上面修改的内容(注意write调用中的换行符)。“testt”奇怪地从未打印出来。什么印的?这里没有这样做的代码。“testt”奇怪地从未打印过”。什么印的?这里没有这样做的代码。