0

一、简介

我正在打开和读取文件,在读取时通过 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]
4

4 回答 4

2

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

于 2010-11-22T09:05:23.820 回答
1

也许我所做的这个测试示例清楚地说明了你错过了什么:

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();
            }
        }
    }
}
于 2010-11-22T11:18:03.780 回答
0

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

于 2010-11-22T03:41:07.040 回答
0

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

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

于 2010-11-22T06:23:40.043 回答