作业说明
使用DataInputStream的readUTF() 和BufferedReader的ReadLine()方法进行消息输入时都会产生阻塞,在网上寻找解决办法如下
readUTF()
1. 每次调用事件响应时现在该事件的函数内重新初始化DataInputStream和DataOutputStream。
2. 在文本后加上换行符”\n”,回车符”\r”。
readLine()
(1)双方约定每次发送报文都报文前几个字符表示长度信息,如下
原始报文是:ASDF
发送的socket报文是:0004ASDF
其中0004表示报文长度,接收方先接收四位的长度,再接收余下的报文。
(2)双方约定一个特殊的标志是结束符,比如约定 ==END== 表示结束
代码修改为while(!"==END==".equals(line = in.readLine()))就继续等待接收
这个特殊的结束符需要双方发送报文结束必须再发送的。
(3)发送完后调用Socket的shutdownOutput()方法关闭输出流,这样对端的输入流上的read操作就会返回-1。
注意不能调用socket.getInputStream().close()。这样会导致socket被关闭。
当然如果不需要继续在socket上进行读操作,也可以直接关闭socket。
但是这个方法不能用于通信双方需要多次交互的情况。
(4)为了防止read操作造成程序永久挂起,还可以给socket设置超时。
如果read()方法在设置时间内没有读取到数据,就会抛出一个java.net.SocketTimeoutException异常。
例如下面的方法设定超时3秒。
socket.setSoTimeout(3000);
(5)加上换行符\r、\n
效果:没有成功
请教同学后改进:
1.使用Scanner输入
2.主程序中的读取输入用线程单独实现
效果:可以正常通信
TCP-socket.zip_java_java Tcp _java socket _socket_socket多线程
版权申诉
93 浏览量
2022-09-20
11:22:40
上传
评论
收藏 13KB ZIP 举报
朱moyimi
- 粉丝: 61
- 资源: 1万+