我正在使用Java TCP socket: data transfer is slow中的代码,效果很好,但我在接收部分有一个问题,它读取数据但不退出while循环,不知道为什么,代码正好是相同。
好,所以代码就像这个客户端:
uploadFile.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent ev){
try{
JFileChooser chooser = new JFileChooser();
File file=null;
int returnVal = chooser.showOpenDialog(UserWindow.this);
if (returnVal == JFileChooser.APPROVE_OPTION)
file = chooser.getSelectedFile();
FileInputStream fis = new FileInputStream(file);
OutputStream os= Client.socket.getOutputStream();
int packetSize=65536;
byte[] buffer = new byte[packetSize];
Client.out.writeObject("upload file");
int read=0;
do{
os.write(buffer, 0, read);
System.out.println(read);
}while((read = fis.read(buffer))!=-1);
os.flush();
System.out.println("sent");
fis.close();
}
catch(Exception ex){
ex.printStackTrace();
JOptionPane.showMessageDialog(null,"File send error: "+ex.toString(), "Error", JOptionPane.ERROR_MESSAGE);}
}
});
服务器端:
else if(message.equals("upload file")){
try{
FileOutputStream fos=new FileOutputStream("doc.pdf");
BufferedOutputStream bos = new BufferedOutputStream(fos);
int packetsize=65536;
byte[] buffer = new byte[packetsize];
InputStream is =socket.getInputStream();
int read=0;
do{
bos.write(buffer,0,read);
System.out.println(read);
}while((read = is.read(buffer))!=-1);
System.out.println("received");
bos.close();
fos.close();
}catch(Exception ex){ex.printStackTrace();}
}
答案 0 :(得分:1)
客户端代码在您向其发送预期数据之前不会结束(因为,您所链接的问题的提问者很多)。
并且,您链接的问题的提问者的代码不完整,请发布您的完整代码。
答案 1 :(得分:0)
你的'do'循环应该是'while'循环。通过'do'形式完成的所有操作都是浪费的第一个操作,其中长度为零。这没有错,但没有意义。
while ((count = in.read(buffer)) > 0)
out.write(buffer, 0, count);
在客户端关闭连接之前,服务器端循环不会终止,而您似乎从未这样做过。这就是导致read()返回-1的原因。
您正在使用actionPerformed()
方法执行所有操作,该方法在AWT线程中执行,因此它将阻止GUI。对于长时间运行的操作,必须使用单独的线程而不是AWT线程。
如果您需要在发送文件后保持连接打开,则需要在文件之前发送文件的长度,例如通过DataOutputStream.writeLong().
然后修改读取循环以准确读取多个字节:
final long total = dis.readLong();
long current = 0;
while (current < total &&
(count = dis.read(buffer, 0, total-current > buffer.length ? buffer.length : (int)(total-current))) > 0)
{
out.write(buffer, 0, count;
current += count;
}
(模数错误,特别检查括号)