1
我在写一个程序,它有一个客户端和服务器,客户端将发送一个img文件到服务器。下面的代码是针对服务器的,它将在obIn.read
最后一次运行时阻塞在while循环中,因此它永远不会返回-1并打破循环。它确实打破了我的客户端循环。所以我试图在客户端循环之后刷新它,但它似乎没有任何好处。我不想关闭obOut,因为那样会关闭我想保持打开的套接字。服务器端是它从obIn(输入流是一个实例变量)接收咬入的位置,并将其写入到我创建的文件中。服务器和客户端发送文件Java
//server receives file
File file = new File("image/image.png");
BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream(file));
byte[] bytes = new byte[1000];
int c = 0;
while((c = obIn.read(bytes)) != -1) {
fileOut.write(bytes, 0, c);
fileOut.flush();
System.out.println(c);
}
System.out.println(c);
fileOut.close();
System.out.println("File Created");
//Client
String imgPath = in.nextLine();
File file = new File(imgPath);
BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream(file));
byte[] bytes = new byte[1000];
int c = 0;
while((c = fileIn.read(bytes)) != -1) {
obOut.write(bytes, 0, c);
obOut.flush();
System.out.println(c);
}
obOut.write(bytes, 0, 1000);
obOut.flush();
System.out.println(c);
fileIn.close();
System.out.println("File Sent");
此图片的输出,其中所述服务器是在顶部和客户端是上底部。那是我发现服务器卡住阻塞的地方。
Here是我发现这个方法,并试图使其成为我的设置工作。这是我第一次使用流。
更换
write
和flush
功能的同时循环的一面派'-1'您需要关闭()作家(这里'obOut')。如果你不想这么做,可以说你想发送很多文件,那么你需要创建自己的*协议*(客户端和服务器之间的通话规则)。这样的协议应该说明,首先你要通知服务器它应该有多少字节(文件的长度),然后而不是等待-1,你只需要计算到达多少字节,并在收到所有字节后服务器可以做其他事情,或者等待它应该处理的其他任务的信息(如接收另一个文件)。 – Pshemo