现有两个程序,Sender和Receiver,Sender不停制造数据包,通过Socket传给Receiver。节选代码如下:
Sender: public void run() {
try {
Socket sock = new Socket("211.66.6.217", 10001);
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
int len = 58164;
byte[] content = new byte[58164];
for (int i = 0; i < len; i++) {
content[i] = 1;
}
while(true) {
dos.writeInt(len);
dos.write(content);
logger.debug("send bytes");
}
} catch (Exception e) {
e.printStackTrace();
} }Receiver:
public void run() {
try {
ServerSocket serv = new ServerSocket(10001);
System.out.println("Waiting for connection");
Socket sock = serv.accept();
while (true) {
DataInputStream dataIn = new DataInputStream(new BufferedInputStream(sock
.getInputStream()));
int len = dataIn.readInt();
logger.debug("readLen = " + len);
byte[] content = new byte[len];
dataIn.read(content, 0, len);
} } catch (Exception e) {
e.printStackTrace();
}
}在localhost上运行两个程序,没有问题。
但是在局域网内的两台机上运行,不久会出现发送的len和接收的len不相等的情况,而且接受的len可能是一个很大的负数,导致程序出错。
如果在Sender的循环里加入Thread.sleep(500),则可以无限期正常运行。
这是否说明,Java的Socket不能承受高负荷?
Sender: public void run() {
try {
Socket sock = new Socket("211.66.6.217", 10001);
DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(sock.getOutputStream()));
int len = 58164;
byte[] content = new byte[58164];
for (int i = 0; i < len; i++) {
content[i] = 1;
}
while(true) {
dos.writeInt(len);
dos.write(content);
logger.debug("send bytes");
}
} catch (Exception e) {
e.printStackTrace();
} }Receiver:
public void run() {
try {
ServerSocket serv = new ServerSocket(10001);
System.out.println("Waiting for connection");
Socket sock = serv.accept();
while (true) {
DataInputStream dataIn = new DataInputStream(new BufferedInputStream(sock
.getInputStream()));
int len = dataIn.readInt();
logger.debug("readLen = " + len);
byte[] content = new byte[len];
dataIn.read(content, 0, len);
} } catch (Exception e) {
e.printStackTrace();
}
}在localhost上运行两个程序,没有问题。
但是在局域网内的两台机上运行,不久会出现发送的len和接收的len不相等的情况,而且接受的len可能是一个很大的负数,导致程序出错。
如果在Sender的循环里加入Thread.sleep(500),则可以无限期正常运行。
这是否说明,Java的Socket不能承受高负荷?
解决方案 »
- Java 中没有无符号数,在读字节数组转换的时候需要注意溢出的情况
- 我觉得NumberFormatException 根本不能算运行时异常。。。。质疑ing
- udp实现数据传输,怎么老有问题 请指点下
- Java enum的开发用途
- swing的jRadioButton能储存value吗
- 求救:由于Comm通讯的底层接口获取的int型整数数据是C++写的,现在要用java调用C++的接口int型出现溢出,即怎么获取大于2147483648(c++可
- 1780518的打印程序(大家有什么好玩的一起贴阿)
- applet编译对jdk版本有要求吗?提示找不到类
- ___Java菜鸟问题: 请问有没有把.class转化成在windows平台上.exe的软件?如果可能,.exe可以在DOS下运行吗?___
- JCreator LE 和 JCreator Pro有什么区别?
- 请问对JList来说,有鼠标双击事件么?
- 一个比较菜的问题: 怎样让JDialog窗口无法改变大小?
.getInputStream()));
不要放到循环体内,否则每次包装可能会buffer一些数据了
.getInputStream()));
放到循环体外,不加Thread.sleep(500)len仍然会变得不一致。
最奇怪的是,加了Thread.sleep(500)后,偶尔会有几次接收到的len变得很大,随后又恢复正常。
按理,当接收到的len变得很大,dataIn.read(content, 0, len)会造成错位才对,为什么后面的一切正常??
注意检查length的长度,如果不够则循环
length = dataIn.read(content,length);
真是奇怪
在你的程序里的这一句 dataIn.read(content, 0, len); 很可能并没有读到len个字节,然后下一个循环中的这一句 int len = dataIn.readInt(); 实际上得到的是上一个循环里没有读完的 byte[] content = new byte[58164]; 中的内容。你说读到的len全都是 16843009, 这个数转换成二进制是 00000001 00000001 00000001 00000001, 不就正好是你发送的content的内容么。这一句 dataIn.read(content, 0, len); 应该改成
int n = 0;
do
{
n += dataIn.read(content, n, len - n);
}
while (n < len);