我用JAVA写的服务端,每收请求以线程响应,读取报文的代码如下:
DataInputStream dis=new DataInputStream(socket.getInputStream());
//缓冲区的大小
byte[] bt=new byte[MsgEnvironment.MAX_MESSAGE_LENGTH];//MsgEnvironment.MAX_MESSAGE_LENGTH为32000
dis.read(bt);
//处理接收到的报文,转换成字符串
String message=new String(bt).trim();我用JAVA写的SOCKET客户端,发送超过8K的报文,能够正常接收,在本机以及其它机器都有测试,正常通过。
客户端用C给我发,也是TCP/IP给我发过来,超过4380,就只能够收到4380字节了,C端给本身编写的测试服务端发报文,也可以超过5K,能够正常收到。现在的问题就是C客户端与JAVA服务端通信时,有长度上的问题,我不知道问题出在什么地方,因为我们单测都是正常的,
不知道有没有遇到此问题的其它朋友,请指教。
DataInputStream dis=new DataInputStream(socket.getInputStream());
//缓冲区的大小
byte[] bt=new byte[MsgEnvironment.MAX_MESSAGE_LENGTH];//MsgEnvironment.MAX_MESSAGE_LENGTH为32000
dis.read(bt);
//处理接收到的报文,转换成字符串
String message=new String(bt).trim();我用JAVA写的SOCKET客户端,发送超过8K的报文,能够正常接收,在本机以及其它机器都有测试,正常通过。
客户端用C给我发,也是TCP/IP给我发过来,超过4380,就只能够收到4380字节了,C端给本身编写的测试服务端发报文,也可以超过5K,能够正常收到。现在的问题就是C客户端与JAVA服务端通信时,有长度上的问题,我不知道问题出在什么地方,因为我们单测都是正常的,
不知道有没有遇到此问题的其它朋友,请指教。
解决方案 »
- StringBuffer的append和加号的小疑问
- Spring 整合 hibernate 报错 org.hibernate.FlushMode.<init>(java.lang.String)
- 事务问题
- hibernate自增的一个小问题,菜鸟求教.
- 求救啊...myeclipse
- 求助!谁能给我一个用springMVC实现文件上传下载的例子?
- JSP连接SQL SERVER的问题
- SSH上传图片保存在文件夹里面,将保存路径存入数据库里面
- 请教一下Weblogic 和Jboss+Tomcat哪个运行快点,相同硬件配置
- 想建立一个java群,希望大家踊跃参加,不论高手还是菜鸟,都一律敞开大门欢迎,但是只能讨论java的话题
- 困惑:JAVA程序部署到WINDOWS上运行比LINUX快?
- 表格,div区域设置位置问题
另外,我可能忘提一个重要的问题了,我的JAVA MS(MessageServer)在WINDOWS XP平台上运行,C客户端是在UNIX平台上运行的。
我们尝试了如下步骤:
1、我编写的JAVA CLIENT发超过8K的数据,MS(MessageServer)可以正常接写。
2、核心采用C客户端与C服务端发,C服务端可以正常接收超过8K的数据。
3、我的JAVA CLIENT与其C服务端发,对方C服务端可以接收超过8K的数据。
4、对方在WINDOWS平台下重新编译发送端,我的JAVA MS可以正常接收超过8K的数据。
5、对方通过WINDOWS平台往UNIX服务端发送超过8K的数据,可以正常接收。
现在唯一有问题的就是对方通过UNXI客户端往WINDOWS的MS服务端发数据了,我们开始怀疑WINDOWS与UNIX的底层的通信可能有问题了,因为通过上面的实验可以证明我们编写的服务端、客户端都没有问题。最后我将JAVA MS服务移到了LINUX平台上,对方再次通过UNIX发过来,终于可以接收超过8K的数据了。总结:从上面的步骤可以看出,问题出在WINDOWS XP上面,没有尝试过WIN2003,不知道2003的结果是怎么样的。
设置该选项:public void setReceiveBufferSize(int size) throws SocketException
读取该选项:public int getReceiveBufferSize() throws SocketException
SO_RCVBUF 表示服务器端的用于接收数据的缓冲区的大小,以字节为单位。一般说来,传输大的连续的数据块(基于HTTP或FTP协议的数据传输)可以使用较大的缓冲区,这可以减少传输数据的次数,从而提高传输数据的效率。而对于交互式的通信(Telnet和网络游戏),则应该采用小的缓冲区,确保能及时把小批量的数据发送给对方。
SO_RCVBUF的默认值与操作系统有关。例如,在Windows 2000中运行以下代码时,显示SO_RCVBUF的默认值为8192:ServerSocket serverSocket=new ServerSocket(8000);
System.out.println(serverSocket.getReceiveBufferSize());无论在ServerSocket绑定到特定端口之前或之后,调用setReceiveBufferSize()方法都有效。例外情况下是如果要设置大于 64K的缓冲区,则必须在ServerSocket绑定到特定端口之前进行设置才有效。例如,以下代码把缓冲区设为128K:ServerSocket serverSocket=new ServerSocket();
int size=serverSocket.getReceiveBufferSize();
if(size<131072) serverSocket.setReceiveBufferSize(131072);
//把缓冲区的大小设为128K
serverSocket.bind(new InetSocketAddress(8000)); 执行serverSocket.setReceiveBufferSize()方法,相当于对所有由serverSocket.accept()方法返回的Socket设置接收数据的缓冲区的大小。
欢迎加入!
------------------------
qq群 59011611
深圳外包.J2EE群
qq群 43652320
在线程序员论坛