java tcp 字节_java-TCP文件传输中缺少字节

我需要能够读取文件,将其分解为任意大小的数据包,比如说512字节,然后通过TCP发送这些数据包.问题是,接收者没有获得即时消息发送的所有字节.如果我发送1000个数据包,则接收器从InputStream读取时会阻塞,因为他没有更多数据可读取990个数据包左右.

这是代码(只是发送和接收部分):

发件人:

int parts = (int)Math.ceil((double)(file.length()/512.0));

out.println(parts+"");

int readFile;

int i = 0;

while ((readFile = fileIn.read(buffer)) != -1) {

i++;

fileOut.write(buffer, 0, readFile);

fileOut.flush();

System.out.println("-- Sent packet " + i + "/" + parts + ". " + "Bytes sent = " + readFile);

}

接收方:

int parts = Integer.parseInt(in.readLine());

byte[] buffer = new byte[512];

FileOutputStream pw = new FileOutputStream("file.ext");

DataInputStream fileIn = new DataInputStream(socket.getInputStream());

for(int j = 0; j < parts; j++){

int read = 0;

if(j == parts - 1){

read = fileIn.read(buffer);

pw.write(buffer, 0, read);

}else{

fileIn.readFully(buffer);

pw.write(buffer);

}

System.out.println("-- Received packet " + (j+1) + "/" + parts + ". Read " +read+ " bytes.");

}

我尝试增加套接字的发送和接收缓冲区的大小,但没有成功.我想念什么?

这是一个输出示例:

发件人:

-- Sent packet 1/10. Bytes sent = 512

-- Sent packet 2/10. Bytes sent = 512

-- Sent packet 3/10. Bytes sent = 512

-- Sent packet 4/10. Bytes sent = 512

-- Sent packet 5/10. Bytes sent = 512

-- Sent packet 6/10. Bytes sent = 512

-- Sent packet 7/10. Bytes sent = 512

-- Sent packet 8/10. Bytes sent = 512

-- Sent packet 9/10. Bytes sent = 512

-- Sent packet 10/10. Bytes sent = 234

接收方:

-- Received packet 1/10. Read 512 bytes.

-- Received packet 2/10. Read 512 bytes.

-- Received packet 3/10. Read 512 bytes.

-- Received packet 4/10. Read 512 bytes.

-- Received packet 5/10. Read 512 bytes.

-- Received packet 6/10. Read 512 bytes.

-- Received packet 7/10. Read 512 bytes. (And it blocks here, because there is no more data to read)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Java的Socket和InputStream/OutputStream类来实现TCP通信,具体实现方法如下: 1. 在服务器端,创建一个ServerSocket对象并指定端口号,等待客户端的连接。一旦有客户端连接,就会返回一个Socket对象。 2. 获取输入输出流。在服务器端,可以使用Socket对象获取InputStream和OutputStream类的实例,它们用于接收和发送数据。在客户端,也可以使用Socket对象获取输入输出流。 3. 接收和发送数据。在客户端,可以使用OutputStream类的write()方法向服务器端发送字节数组。在服务器端,可以使用InputStream类的read()方法接收客户端发送的字节数组,然后再使用OutputStream类的write()方法向客户端发送字节数组。 例子:服务器端代码 ```java ServerSocket serverSocket = new ServerSocket(8000); Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); byte[] data = new byte[1024]; int length = inputStream.read(data); outputStream.write(data, 0, length); ``` 客户端代码 ```java Socket socket = new Socket("localhost", 8000); OutputStream outputStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); byte[] message = "Hello, server!".getBytes(); outputStream.write(message); byte[] data = new byte[1024]; int length = inputStream.read(data); System.out.println(new String(data, 0, length)); ``` 关于你的问题,你可以将客户端发送的字节数组直接写入服务器的字节数,具体实现方式就是在服务器端使用InputStream类的read()方法获取客户端发送过来的字节数组,然后把它写入另一个字节数即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值