Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对输入流(套接字)的读写感到困惑_Java_Sockets - Fatal编程技术网

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”奇怪地从未打印过”。什么印的?这里没有这样做的代码。