这里是两个个客户端程序,我连一次服务器,服务器就要发送大概260000字节的数据。但是两个客户端分别都不能完整接收服务器传过来的数据,麻烦大家帮我看看怎么回事啊,谢谢大家。如果有好的代码,谢谢大家给出来。拜托拜托了!这个问题困惑我好几天了!!!程序1如下(一次只能接收到1460字节):
   package tcp;import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;public class MyClient {

public static String tcpTest(int port,String ipAdd){
String s="";
try {
Socket socket = new Socket(ipAdd, port);
InputStream is = socket.getInputStream();
int bufSize = socket.getReceiveBufferSize();
byte[] receiveBuffer=new byte[(bufSize<1?1:bufSize)]; 
int readSize;
StringBuffer s1=new StringBuffer();

while (true) {

readSize=is.read(receiveBuffer);
byte[] b=new byte[readSize];
for(int i=0;i<readSize;i++){
b[i]=receiveBuffer[i];

System.out.println(""+receiveBuffer[i]);
}

System.out.println("sys::"+new String(b));
    s=new String(b);
    
return s;
} } catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
System.out.println("错误");
} finally {
System.out.println("finally");
}
 return null;
}


}
  程序2如下(一次接收了一万多字节,但是距离二十几万的量还是很远啊):
package tcp;import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.net.UnknownHostException;public class ClientTe {
   public static void main(String[] argv){
   int port=15199;
   String ip="127.0.0.1";
   try {
Socket socket=new Socket(ip,port);   //建立socket连接

InputStream in=socket.getInputStream();    //获取流

  byte[]   buff=new   byte[100];   
  int   len;   
  //按每100字节循环
  while   ((len=in.read(buff))>-1){    //如果len==-1说明已经读到流结尾
  System.out.println("re::"+len);
      if   (len==100){   
       System.out.println("abc");
          //已经读到数据,处理这些数据   
           
       for(int i=0;i<100;i++){

System.out.println("ii:"+buff[i]);//打印出每一个字节
}
      }else{
       for(int i=0;i<len;i++){

System.out.println("ii:"+buff[i]);
}
       System.out.println("aa:"+len);
       break;//如果不足100字节就跳出循环(流末尾)
      } 
  }   
  System.out.println("流读完");   
  in.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
   }
}大家帮我看看这两段程序为什么接收的数据都不完整啊?如果有更好的方法,谢谢告诉我,最好有代码。万分感激啊!

解决方案 »

  1.   

    用的Tcp/ip协议的,大家帮帮忙哈
      

  2.   

    http://topic.csdn.net/u/20080722/23/31AF518F-B39C-4CE6-9121-E19D800DEEA6.html有关于SOCKET半包与粘包的处理~~
      

  3.   

    else{ 
          for(int i=0;i <len;i++){ System.out.println("ii:"+buff[i]); 

          System.out.println("aa:"+len); 
          break;//如果不足100字节就跳出循环(流末尾) 
          } 这里不要break。
    可能每次接受,不一定保证是100,
    反正while循环有结束条件,这里可以不用break,试试
      

  4.   

    大体的看了下你的代码,发现了你的程序中有一个致命的缺陷。 
    用Socket编写聊天程序,最主要的应该要掌握两点: 
    第一:服务器端多线程 
    第二:客户端多线程 
    而这里的多线程,从你的代码里面没有体现出来,当然,代码不是必须得这样去编写,但是一般来说这是一个规范,而且也是一个很好的思路。 
    方法: 
    服务器端:两个线程,一个负责专门等待客户端的连接,核心代码为:Socket client = serverSocket.accept();第二个线程主要负责所有客户端发来的消息的处理。 
    服务器端:一个线程,就负责接受并解析所有的消息。 
    严格按照这样的方式去编写代码去改写你的代码的话,很快就会实现的。楼主不妨试一下... 
    如果需要的话,我可以给你共享一下我以前的代码
      

  5.   

    把接收端的接收缓冲区设置大一点试试,我以前也碰到过这种问题,把缓冲区设置大一点就好了。我以前碰到的问题是这样的,我发现当文件比较大的时候,远程传没有问题,本地传就不行,接收的比实际的少很多。后来才发现因为本地网速太快,而缓冲区很小,导致还没有读取完缓冲区就已经被写满了。后来我的解决方式是,1、把缓冲区设置大一点(调用setReceiveBufferSize),2、在发送端每次发送数据后间隔一点点时间再发送(调用sleep(50))。
      

  6.   

    我不能控制发送端,只能在客户端修改。因为服务器端是固定的,我只知道它是通过TCP/IP协议发送数据过来,我只能在客户端接收,不能操纵服务器端
      

  7.   


    rum-lee:接收端程序缓冲区设置成多大比较合适呢?