服务异常如下:Connection reset
网上有很多关于socket通信的教程,很多教程例子中都会用到readLine()这个方法,然后就告诉大家,照着我的例子这么写就OK了。
古人云:尽信书则无书。网上有很多“大牛”从来“不拘小节”,到底是:不知道,还是知不道?你确定你的例子没问题?
readLine()这个方法是:按行读取,你读取一个文件流没问题。
但是你用在socket中就很有问题!在双方通信的时候,如果没有换行符该方法如何判断一行已经读取完毕?
解决:
客户端在写的时候需要添加换行符,这样服务端接收时候才能判定。可以使用 writer.newLine();来做换行。
客户端
for(int i=0;i<6;i++){
Socket socket=new Socket(host,port);
OutputStream os= socket.getOutputStream();
OutputStreamWriter ow=new OutputStreamWriter(os);
BufferedWriter bw=new BufferedWriter(ow);
bw.write(i+"第一行《这是一首小情歌》");
bw.newLine();
//网络传输时必须把内存缓冲同步出去
bw.flush();
//77777777777777777
socket.shutdownOutput();
}
服务端
is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader reader =new BufferedReader(isr);
String str;
while((str=reader.readLine())!=null){
System.out.println("服务端读取的数据是》》》"+str);
}
请看我的客户端带有777777777注解的那个代码,纵然你再客户端输出时候加了回车符,但是如果你不关闭这个流,会报错的!
因为readLine() 这个方法是阻塞方法,它只在2中情况下才不会读取(也就是==null),一种是流关闭,一种是socekt关闭!
那么有人会说了,这样用完就关闭,不是每次都要重新建立socket吗?不符合高要求。解决这个问题就是把【循环拿掉!】:
is=socket.getInputStream();
InputStreamReader isr=new InputStreamReader(is);
BufferedReader reader =new BufferedReader(isr);
String str=reader.readLine();
/*while((str=reader.readLine())!=null){
System.out.println("服务端读取的数据是》》》"+str);
}*/
//socket.shutdownInput();
System.out.println(str);