予。引言
我正在打开并读取文件,在读取时通过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]
答案 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。