socket io流 readLine()方法报错问题

 

服务异常如下: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);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值