TCP文件传输问题

时间:2010-11-22 03:38:08

标签: java networking tcp file-transfer

予。引言

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

SENDER CODE

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);
}

II。问题

通过TCP套接字发送协议后,我查看发送的字节数。它们都是独一无二的。但是在接收方,收到的字节反复是相同的字节[]。

III。实施例

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]

4 个答案:

答案 0 :(得分:2)

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

答案 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();
            }
        }
    }
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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