从服务器端传送一张图片到客户端(这里用的是jpg),奇怪的是有时候传送成功,有时候传送失败.我所用的方法是把图片的字节流传过去,可是无论是分批传还是一次性传输(图片大小在80K左右),问题总是存在.服务器端主要代码 C++
// transfer image start with <IMAGE>
   inImage.open((dir+filename+".jpg").c_str(),fstream::binary);
   CNetwork::Send(clientSocket,"<IMAGE>\n",strlen("<IMAGE>\n"));
   int length; // clientSocket 为客户端套接字
   char * buffer;   // get length of file:
   inImage.seekg (0, ios::end);
   length = inImage.tellg();
   inImage.seekg (0, ios::beg);   // allocate memory:
   buffer = new char [length];   // read data as a block:
   inImage.read(buffer,length);
   CNetwork::Send(clientSocket, buffer, length);
   inImage.close();
   delete [] buffer;
客户端主要代码 Java
   server = new Socket(host,port);
   // get input stream
   InputStream inn = server.getInputStream();
   BufferedReader bufIn = new BufferedReader(new InputStreamReader(inn));
   // get ouput stream
   PrintWriter out = new PrintWriter(server.getOutputStream());
   // send the name of the file which we need to server
   out.write(filename.toCharArray(),0,filename.length());
   out.flush();
   String line; //
   while ((line = bufIn.readLine()) != null) {
       if (line.equals("<FILE>"))
           fileTransfer(bufIn);
       else if (line.equals("<IMAGE>")){
           bufImage = imageTransfer();
           break;
   }
}
public BufferedImage imageTransfer() throws IOException{
        BufferedImage image=null;
        // get input stream
        ImageInputStream stream = ImageIO.createImageInputStream(
                server.getInputStream());//server为连接的socket
        image = ImageIO.read(stream);
        ImageIO.write(image,"jpg",new File(filename+".jpg"));
        return image;
    }

解决方案 »

  1.   

    是不是缓冲区大小的关系
    我也有个程序是JAVA和C连接的
    但是我设置的2048大小的缓冲区,实际使用中发现是1380
    所以往往造成超过1380的数据被分割了...找资料...无果...
    只能把2方的缓冲区都设成1380...
      

  2.   

    这么大,发送的时间 flush()试下
      

  3.   

    不懂,发送端是C++直接调用SOCKET API实现的,如何实现flush()的功能,请高手指点.
      

  4.   

    C++的话,你调用了SEND方法后接着调用RECV接收就会把缓冲区的数据刷出去
      

  5.   

    我java除了刚开始发送文件名过来,就没有再发数据了;所以C++端如果调用RECV,不是会一直阻塞在那吗;还有就是缓冲我原来是默认的,是出现了上述的问题,我才把缓冲改大的,所以应该和缓冲区大小没什么关系.
      

  6.   

    换了个JDK1.5.0,问题就解决了;编译成applet放到网页上,问题又出现了,郁闷......
    昨天重新发了个帖子
    http://community.csdn.net/Expert/topic/5690/5690349.xml?temp=.6771509
    标题为"还是Java与VC传输图片的问题(通过SOCKET),望高手指点.!!!!!!!!!!!!!!!!!!!!!!!!"
      

  7.   

    http://community.csdn.net/Expert/topic/5690/5690349.xml?temp=.9994623
    标题为"还是Java与VC传输图片的问题(通过SOCKET),望高手指点.!!!!!!!!!!!!!!!!!!!!!!!!"好几天没人回,失望............
    还是结帖算了.