问题描述
我写了个socket的例子,为什么用BufferedWriterout=newBufferedWriter(newOutputStreamWriter(client.getOutputStream()));这样写socket通讯好像不通,而我用注释里的那种写法:PrintWriterout=newPrintWriter(client.getOutputStream());这样客户端发包,服务端收得到信息,而且能返回应答包,为什么会这样??【code=Java】publicclassMyServer{publicstaticvoidmain(String[]args)throwsIOException{ServerSocketserver=newServerSocket(5678);Socketclient=server.accept();BufferedReaderbufReader=newBufferedReader(newInputStreamReader(client.getInputStream()));//PrintWriterout=newPrintWriter(client.getOutputStream());BufferedWriterout=newBufferedWriter(newOutputStreamWriter(client.getOutputStream()));while(true){Stringstr=bufReader.readLine();System.out.println(str);//out.println("hasreceive....");out.write("hasreceive....");out.flush();if(str.equals("end"))break;}client.close();}}publicclassClient{staticSocketserver;publicstaticvoidmain(String[]args)throwsException{server=newSocket("192.168.10.40",5678);BufferedReaderin=newBufferedReader(newInputStreamReader(server.getInputStream()));//PrintWriterout=newPrintWriter(server.getOutputStream());BufferedWriterout=newBufferedWriter(newOutputStreamWriter(server.getOutputStream()));BufferedReaderwt=newBufferedReader(newInputStreamReader(System.in));while(true){Stringstr=wt.readLine();out.write(str);//out.println(str);out.flush();if(str.equals("end")){break;}System.out.println(in.readLine());}server.close();}}【/code】
解决方案
解决方案二:
应该不会啊,这两种写法应该是一样的啊。
解决方案三:
可是就是不行,不信你试试
解决方案四:
流应该成对(读和写)使用:这边以什么格式写进去,那边就应该以什么格式读出来BufferedReader<-->PrintStreamBufferedReader<-->BufferedWriter
对不?
解决方案五:
呵呵,神秘,实际上理解了原理就没什么神秘的了:Stringstr=wt.readLine();out.write(str);out.write("n");加上红色的这一句,凡是使用BufferedReader.readLine(),而对方使用readLine收的,都要加这一句。为什么,因为readLine读取一行,但丢掉了换行符,所以,client发出去的数据,永远都在一行上,没有换行,readLine则一致等在那里不返回。
解决方案六:
引用4楼jinxfei的回复:
呵呵,神秘,实际上理解了原理就没什么神秘的了:Stringstr=wt.readLine();out.write(str);out.write("n");加上红色的这一句,凡是使用BufferedReader.readLine(),而对方使用readLine收的,都要加这一句。为什么,因为readLine读取一行,但丢掉了换行符,所以,client发出去的数据,永远都在一行上,没有换行,readLine则一致等在那里不返回。
我加了也没用啊
解决方案七:
而且我用PrintWriter是可以的
解决方案八:
我发现客户端去掉System.out.println(in.readLine());这句话服务端收包正常,为什么会这样
解决方案九:
晕。in.readLine是在等待你输入啊