【问题标题】:TCP File Transfer IssueTCP 文件传输问题
【发布时间】:2010-11-22 03:38:08
【问题描述】:

我。简介

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

发件人代码

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

接收者代码

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

二。问题

通过 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]

【问题讨论】:

  • 您的SendProtocolFileTransfer 课程是什么?它们不是标准的 java 库。
  • SendProtocol 是我的客户端网络类中的一个函数,它代表套接字等的所有 TCP 连接。循环监听具有输入和输出流的协议。我的 FileTransfer 类不是标准的 java 库,它是一个可序列化的类对象,包含发送者、接收者和字节。 (有没有更好的方法来做这个 O_O)?

标签: java networking tcp file-transfer


【解决方案1】:

您遇到的一个问题是您没有检查收到的字节数。您可能几乎每次都通过环回获得一个完整的缓冲区,但您不太可能通过真实的网络获得这个。您必须记录读入缓冲区的字节数并仅使用该数量。

【讨论】:

    【解决方案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();
                }
            }
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 完成输出流后不要忘记out.close();
      • 我仔细检查了这两件事我都做了,所以我仍然不明白为什么这不起作用。
      【解决方案4】:

      什么是 FileTransfer,它的构造函数是否复制缓冲区?它的操作是异步的吗?可能是它的缓冲区在被复制到 TCP 套接字之前被循环重新填充。即,您不断将指向同一个缓冲区的指针排队,然后在循环中将其覆盖。

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

      【讨论】:

      • 我会试试的。除了程序之外,我单独运行我的代码,它按我的方式工作,但肯定会尝试这个。
      • 更新:我刚刚做了一个 forloop 并将缓冲区复制到一个新缓冲区并发送出去。这是一个好方法吗?它有效。
      猜你喜欢
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2018-05-14
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多