1)发送完后调用Socket的shutdownOutput()方法关闭输出流,这样对端的输入流上的read操作就会返回-1。 注意不能调用socket.getInputStream().close()。这样会导致socket被关闭。 当然如果不需要继续在socket上进行读操作,也可以直接关闭socket。 但是这个方法不能用于通信双方需要多次交互的情况。 2)发送数据时,约定数据...
importjava.io.IOException;importjava.net.ServerSocket;publicclassSimpleServer{publicstaticvoidmain(String[]args){try{// 在12345端口上创建ServerSocketServerSocketserverSocket=newServerSocket(12345);System.out.println("服务器已启动,等待客户端连接...");}catch(IOExceptione){e.printStackTrace();}}} 1. ...
在Java中使用Socket进行网络通信时,readLine()方法确实有可能遇到堵塞的情况。这通常发生在客户端或服务器端没有正确发送或接收数据时。下面是对readLine()堵塞问题的详细分析和解决方法: 1. 确认readLine()方法的使用环境和上下文 readLine()方法通常用于从输入流中读取一行文本,直到遇到换行符( )或流结束(EOF)。在...
Java中的Socket通信可以通过客户端的Socket与服务端的ServerSocket通信,同时利用IO流传递数据,也就是说Socket通信是面向流的使用的是BIO,并不同于后来的NIO通信面向缓冲。Socket通信中使用的IO流的read,readline等函数都是阻塞的,这就导致了在通信过程中,双方不能确定什么时侯是流的结束,针对这种可以通过约定结束符的方...
serverSocket.close(); } } } 这段代码执行以后会发现server类 read()方法发生了阻塞,经过查找资料发现 read() 是一个阻塞函数,如果客户端没有声明断开outputStream那么它就会认为客户端仍旧可能发送数据,像read()这种阻塞读取函数还有BufferedReader类种的 readLine()、DataInputStream种的readUTF()等。
Socket 是网络通信的一个概念,允许不同设备之间进行数据交换。在 Java 中,Socket 提供了网络编程的基础,允许我们创建服务器与客户端之间的连接,以进行数据的双向交流。 读取数据是阻塞的还是非阻塞的? 在Java 中,Socket 的输入流(InputStream)默认是阻塞的。这意味着,当你调用如read()之类的方法时,如果没有数据可...
再次分析改过后的代码,客户端用到了read()返回 -1 这个条件,而服务端也用到了,只有二者有一方关闭了 Socket,另一方的 read()方法才会返回 -1,而在客户端打印输出前,二者都没有关闭 Socket,因此,二者的 read()方法都不会返回 -1,程序便阻塞在此处,都不往下执行,这便造成了死锁。
最近在学socket的网络编程,但遇到了一点问题,就是每次循环从缓冲区读数据时,如果缓冲区没有数据,这时候read方法会堵塞,此时也没有办法输入了。后来发现了主要有两种解决方法: 1. 在消息开头标记消息长度 2. 新启动一个线程进行读操作,阻塞就阻塞吧,反正读写没在一个线程(也算某种意义的读写分离) ...
查看线程信息发现是阻塞在了“tstr=reader.readLine()”这一行。得知是socket输入流读取信息阻塞了,可以理解阻塞在了信息最后一行。于是给socket对象添加超时,并处理异常,如下: Socket client=tm.serverSocket.accept();client.setSoTimeout(10);// 这里设置超时时长为10毫秒,对于读取http请求足够了 ...