问一个socket问题,望高手回答

问题描述

我写了个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是在等待你输入啊

时间: 2024-09-07 00:07:37

问一个socket问题,望高手回答的相关文章

求高手点拨一个Socket程序的设计方案可行性.

问题描述 高手,您好:我在写一个Socket程序,由于工期,工程量和技术的原因,现在,我需要尽快将我的作品调通畅.现在,我打算进行下面的"简化版本程序"的修改方案的施工,为了"快速将活儿"交工,希望得到高手的可行性认证:1.我打算将我的服务端的数十个并行线程的功能的所有的"close()语句"全部删除.2.并且,在每一个子线程中创建出的"流"或者"Socket对象"都按照用户的编号,放到对应与入口类中定义的

问一个笼统的问题,ios客户端和服务器通信都有什么方法

问题描述 问一个笼统的问题,ios客户端和服务器通信都有什么方法 ios客户端和服务器通信时都有那些方法?那种比较好用或最常用的? 解决方案 ios设备的网络通信的方法,有如下两个大类: 1.使用socket的方式进行通信. 2.使用asynsocket类库进行通信. 两种方法当中,我觉得asynsocket更好,因为是别人已经封装好的类库,比较稳定.但是对于直接使用socket的通信方法我倒是觉得很灵活.因为控制都是自己在做的事情. 先列举集中不同的使用方法: 1.直接使用socket的方式.

小弟目前要做一个SOCKET编程客户端通讯软件,与多个服务器进行通讯

问题描述 这个项目主要是上位机与下位机通讯方面的东西,因为之前从来没有写过这方面的软件,所以对这个是一无所知.这个软件我想实现的功能就是编写一个客户端上位机软件与多台服务器通讯,当然这些服务器都是一些网卡设备说具体一点就是一些带网卡的单片机或者ARM,在此之前我试了很多次方法(比如说异步多线程什么的)都没有成功但是几天前用了异步方法只是连接成功了但是异步接受还是不行,我知道解决这个方面的问题就是你连接多少个服务器IP就必须必须写多少个接收数据的方法,但是这个系统没有限制呀<有可能是100个设备,

代码-问一个win32application中,我创建了对话框,

问题描述 问一个win32application中,我创建了对话框, 在对话框中我拖进去编辑框控件,问题是如何使用编辑框,得到输进去的数字求求各位高手了,最好有具体代码,感激不尽!!! 解决方案 用GetDlgItem获取编辑框窗口句柄,用GetWindowText获取编辑框内容,用atoi等函数将字符串转换成整数或者用 GetDlgItemInt 解决方案二: 直接用GetDlgItemInt就可以了.不需要什么"G?e?t?DlgItem获取到控件,然后GetWindowText获取控件文本

sql server-一个不太懂.GraphView的人来问一个关于用.GraphView做完表格后坐标名称被挡住了的问题

问题描述 一个不太懂.GraphView的人来问一个关于用.GraphView做完表格后坐标名称被挡住了的问题 现在在做从sybase到sqlserver移行的工作 其中有一个部分是通过给出的数据做一个曲线图出来部分代码如下 Set objGraph = Server.CreateObject(""NplotWrapper.LogGraph"") . . . Response.BinaryWrite objGraph.GraphView(intQueryImgWid

关于android 横竖屏的一个问题。求高手赐教。

问题描述 关于android 横竖屏的一个问题.求高手赐教. 关于android 横竖屏的一个问题.求高手赐教. activity被我强制设为横屏了,但是在此activity上锁屏后再解锁屏,这时此activity竟是从竖屏切换到横屏了,也就是说锁屏后横屏的activity又变回竖屏了.这是怎么回事?如何让被我强制设为横屏的activity一直保持横屏,即使在锁屏的时候? 解决方案 其实我很奇怪为什么你的屏幕没有转成横屏,因为你已经设置横屏了. 如果一个界面是横屏状态下锁屏,如果锁屏界面是竖屏,

单独写的一个socket服务应该怎么部署?部署到哪个平台?

问题描述 RT:想问下:我通过java代码实现了一个socket服务端(可以启动socket服务,接收客户端请求,给客户端回复响应),在eclipse中调试启动服务,调测是OK的:但是这个服务怎么才能集成或部署到一个类似于jetty或tomcat容器中呢?(而不是每次通过eclipse启动),知道的能告诉我一个具体方法吗?感激! 解决方案 应该是c/s程序吧,直接在服务器上调用java命令运行main类就行,就像我们开始学习java时需要手动编译运行一样,先javac编译,再java运行你把在你

socket-new 一个Socket 出来,是不是Socket的源代码已经包括基础输入输出流了

问题描述 new 一个Socket 出来,是不是Socket的源代码已经包括基础输入输出流了 DataOutputStream dos = new DataOutputStream(s.getOutputStream());(其中s是一个Socket对象).我想问一下s.getOutputStream()直接拿出来一个socket的输出流,这个我们从来就没有定义过一个输出流,为什么就可以拿到,是说new出来一个Socket 对象出来,是不是Socket的源代码已经包括基础输入输出流了.如果说的不

问一个MVC提交返回的小白问题

问题描述 现在我有一个form提交到action,action返回可能会有异常之类的什么信息,然后我想在页面上alert出来,怎么做?要在button在onclick的时候用jq.ajax调用action方式,可是如果我submit没有用ajax的什么可以alert么?难道是在return的时候直接"alert('aaa')"??之所以要问submit是因为想用jq的validate的验证,不知道还有没有其他方式?小白问的问题,希望有回答,谢谢! 解决方案 解决方案二: 解决方案三:p