2010-11-22 63 views
0

一,引言TCP文件传输问题

我打开并从文件中读取,在读取时通过TCP套接字发送数据块。

发送方码

byte[] buffer = new byte[16384]; 
while ((in.read(buffer)) > 0) 
{ 
    SendProtocol(new FileTransfer(sender, receiver, buffer); 
} 

接收机CODE

if(o instanceOf FileTransfer) 
    FileTransfer tf = (FileTransfer) o; 
    out.write(tf.getData); 
} 

II。问题

我通过TCP套接字发送协议后,查看要发送的字节。他们都是独一无二的。但在接收端,收到的字节只是一个字节[]一遍又一遍。

三,示例

SENDER BYTES 
[3, 3, 5, -44, 4, 3]  
[99, -3, 5, -44, 7, 3] 
[-11, 3, 5, -44, 4, 7] 
[10, 6, 5, -44, 4, 66] 

RECEIVER BYTES 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
[3, 3, 5, -44, 4, 3] 
+0

什么是你'SendProtocol'和'FileTransfer'类?他们不是标准的Java库。 – 2010-11-22 04:30:35

+0

SendProtocol是我的客户端网络类中的一个功能,它委托套接字的所有TCP连接等。循环监听输入和输出流的协议。我的FileTransfer类不是标准的Java库,它是一个包含发送者,接收者和字节的可序列化的类对象。 (有没有更好的方法来做到这一点O_O)? – user515574 2010-11-22 05:58:07

回答

0

使用out.flush()写入所有信息后。

+0

当你完成输出流时,不要忘记'out.close();'。 – bakoyaro 2010-11-22 03:47:40

+0

我再次检查了我已经完成了这两项工作,所以我仍然困惑为什么这不起作用。 – user515574 2010-11-22 04:04:48

0

什么是FileTransfer,并且其构造函数是否复制缓冲区?它的操作是异步的吗?可能是它的缓冲区在被复制到TCP套接字之前被循环重新填充。也就是说,你保持指向同一个缓冲区的指针,然后你在循环中覆盖它。

使FileTransfer承担缓冲区参数的所有权,并在发送时删除它。然后为通过循环的每次旅程分配一个新的,并将其交给FileTransfer。

+0

我会尝试。除了程序之外,我单独运行我的代码,并且按照我的方式运行,但肯定会尝试。 – user515574 2010-11-22 06:33:53

+0

更新:我刚刚做了一个forloop并将缓冲区复制到一个新的缓冲区并发送它。这是做这件事的好方法吗?有用。 – user515574 2010-11-22 06:48:51

2

你有一个问题是你不检查你收到多少字节。几乎每次都可以通过回送获得完整的缓冲区,但您不可能通过实际的网络获取该缓冲区。您必须记录多少个字节被读入缓冲区,并且只使用该数量。

2

也许我做了这个测试例子清楚你错过了什么:

public class Test { 
    public static void main(String args[]) throws Exception { 

     Server server = new Server(12345); 

     Socket s = null; 
     InputStream fs = null; 
     try { 
      s = new Socket("localhost", 12345); 
      fs = new FileInputStream("test.txt"); 

      OutputStream os = s.getOutputStream(); 
      byte[] bytes = new byte[1024]; 
      int read; 
      while ((read = fs.read(bytes)) != -1) 
       os.write(bytes, 0, read); 
     } 
     finally { 
      if (s != null) 
       s.close(); 
      if (fs != null) 
       fs.close(); 
     } 


     server.join(); 
    } 

    static class Server extends Thread { 

     ServerSocket serverSocket; 

     Server(int port) throws IOException { 
      serverSocket = new ServerSocket(port); 

      start(); 
     } 

     @Override 
     public void run() { 
      try { 
       Socket s = serverSocket.accept(); 

       InputStream is = s.getInputStream(); 

       try { 

        StringBuffer sb = new StringBuffer(); 
        { 
         byte[] bytes = new byte[1024]; 
         int read; 
         while ((read = is.read(bytes)) != -1) 
          sb.append(new String(bytes, 0, read)); 
        } 

        System.out.println(sb); 
       } 
       finally { 
        if (is != null) 
         is.close(); 
       } 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
}