tcp传输 丢包
场景:关于TCP传输不稳定(估计是丢包)的有关问题
求助:关于TCP传输不稳定(估计是丢包)的问题
小弟做了一个内网用TCP传输文字、文件的通讯软件。
以下为设计思路:
发送方:
1、发送PrintWriter.println()告诉接收方接下来要传送的是String还是File
2、若为String则用OutputStream.write()发送String内容,结束;
若为File则继续用PrintWriter.println()发送文件名称;
3、File第三步用OutputStream.write(buffer, 0, length)循环发送文件主体。

接收方:
1、BufferedReader.readLine()确定接收类型
2、若为String用InputStream.read(buff)循环接收,结束;
若为File用BufferedReader.readLine()确定文件名
3、File第三步InputStream.read(buffer)循环获取文件主体。

但使用起来很不稳定,传输String有50%几率接收到空字符串,传送文件超过7成的几率出现文件名乱码、文件无法打开,长度为N/A,但多次尝试下也有成功的案例。
初步判断这是网络传输不稳定的原因,请教各位大神如何解决这个问题,或是否这个设计思路有问题,求指点!
------解决思路----------------------
那看你文件多大了。 我以前测试TCP Socket超过10M 传输 几百用户量同时跑,不过用的是Apache MINA服务器。
你可以固定一下
[类型][文件名][文件大小][文件内容] 这样的格式,传输一般都用字节传输。
也就类似这样的:
ByteOutputStream bos = new ByteOutputStream();
int len = -1;
byte[] buffer = new byte[1024];
while((len=in.read(buffer)) != -1) {
bos.write(buffer,0,len);
}
byte[] allbytes = bos.toArrayBytes();////
------解决思路----------------------
长度为两字节
[
长度为四字节
求助:关于TCP传输不稳定(估计是丢包)的问题
小弟做了一个内网用TCP传输文字、文件的通讯软件。
以下为设计思路:
发送方:
1、发送PrintWriter.println()告诉接收方接下来要传送的是String还是File
2、若为String则用OutputStream.write()发送String内容,结束;
若为File则继续用PrintWriter.println()发送文件名称;
3、File第三步用OutputStream.write(buffer, 0, length)循环发送文件主体。
接收方:
1、BufferedReader.readLine()确定接收类型
2、若为String用InputStream.read(buff)循环接收,结束;
若为File用BufferedReader.readLine()确定文件名
3、File第三步InputStream.read(buffer)循环获取文件主体。
但使用起来很不稳定,传输String有50%几率接收到空字符串,传送文件超过7成的几率出现文件名乱码、文件无法打开,长度为N/A,但多次尝试下也有成功的案例。
初步判断这是网络传输不稳定的原因,请教各位大神如何解决这个问题,或是否这个设计思路有问题,求指点!
------解决思路----------------------
那看你文件多大了。 我以前测试TCP Socket超过10M 传输 几百用户量同时跑,不过用的是Apache MINA服务器。
你可以固定一下
[类型][文件名][文件大小][文件内容] 这样的格式,传输一般都用字节传输。
也就类似这样的:
ByteOutputStream bos = new ByteOutputStream();
int len = -1;
byte[] buffer = new byte[1024];
while((len=in.read(buffer)) != -1) {
bos.write(buffer,0,len);
}
byte[] allbytes = bos.toArrayBytes();////
------解决思路----------------------
长度为两字节
[
byte[] bytes = null;
OutputStream out = null;
...
ObjectOutputStream objOutput = new ObjectOutputStream(out);
objOutput.writeShort((short)bytes.length);
长度为四字节
objOutput.writeInt((int)bytes.length);