tcp传输 丢包

场景:关于TCP传输不稳定(估计是丢包)的有关问题

求助:关于TCP传输不稳定(估计是丢包)的问题
小弟做了一个内网用TCP传输文字、文件的通讯软件。
  以下为设计思路:
发送方:
  1、发送PrintWriter.println()告诉接收方接下来要传送的是String还是File
  2、若为String则用OutputStream.write()发送String内容,结束;
    若为File则继续用PrintWriter.println()发送文件名称;
  3、File第三步用OutputStream.write(buffer, 0, length)循环发送文件主体。
tcp传输 丢包
接收方:
  1、BufferedReader.readLine()确定接收类型
  2、若为String用InputStream.read(buff)循环接收,结束;
    若为File用BufferedReader.readLine()确定文件名
  3、File第三步InputStream.read(buffer)循环获取文件主体。
tcp传输 丢包
  但使用起来很不稳定,传输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();////
------解决思路----------------------
引用:
Quote: 引用:

封包拆包最简单也最常用的方式,就是在每个包的前面要加一个字节长度。比如说要发一个字符串,就在字符串的前面加上字符串的长度(可以是2个字节或者4个字节)。

请教一下如何指定2个字节或者4个字节呢?截图中我发送的包头是自然数位,超出一位数就出错了,

长度为两字节
[

byte[] bytes = null;
OutputStream out = null;
...
ObjectOutputStream objOutput = new ObjectOutputStream(out);
objOutput.writeShort((short)bytes.length);

长度为四字节

objOutput.writeInt((int)bytes.length);