我阅读了大部分SO答案,但找不到readUTF()
挂起的原因。该代码是如此通用,但是以某种方式挂起。
客户端:
int ip = "192.168.56.101"
String filepath = "your local file path" // pdf file works, mp3 or mp4 don't work
int port = 6000;
int port1 = 6001;
Socket socket = new Socket(ip, port);
Socket socket1 = new Socket(ip, port1);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
ObjectOutputStream oos = new ObjectOutputStream(socket1.getOutputStream());
String filename = "filename_doesnt_matter_but_file_type_matters";
dos.writeUTF(filename); // USED writeUTF()
dos.flush(); dos.close(); socket.close();
FileInputStream fis = new FileInputStream(new File(filepath));
BufferedInputStream bis = new BufferedInputStream(fis);
final byte[] bytearray = new byte[(int) fis.length()];
bis.read(bytearray, 0, bytearray.length);
oos.writeObject(bytearray); // THIS WRITES THE FILE
oos.flush(); oos.close(); socket1.close();
服务器端:
int port = 6000;
int port1 = 6001;
ServerSocket ss = new ServerSocket(port);
ServerSocket ss1 = new ServerSocket(port1);
Socket socket = ss.accept();
Socket socket1 = ss1.accept();
DataInputStream dis = new DataInputStream(socket.getInputStream());
ObjectInputStream ois = new ObjectInputStream(socket1.getInputStream());
FileOutputStream fos = new FileOutputStream(new File("local path where I save my file"));
ois = new ObjectInputStream(socket1.getInputStream());
final BufferedOutputStream bos = new BufferedOutputStream(fos);
byte[] bytearray = (byte[]) ois.readObject();
bos.write(bytearray);
bos.flush();
String filename = dis.readUTF(); <----- HANGS HERE
文件名很小,大小不成问题。可能是什么问题?
编辑:忘了提及此读取文件名“ Dummy1.pdf”,但不读取诸如“ mp4”或“ file_dummy.mp3”之类的东西。我仍然不知道何时可以读取和当它挂着...
我尝试使用ObjectOutputStream
而不是DataOutputStream
,也尝试使用writeObject(filename)
,但仍然无法读取。我还尝试按照建议包装BufferedInputStream
,但效果不佳...
新编辑:我想知道它何时挂起。当我尝试传输mp3或mp4文件时,它挂起。当我传输pdf文件时,文件的文件名即被传输。但是,当我尝试传输音频或视频文件时,会传输文件,但文件名不会被传输(代码挂在readUTF()
上。如果我注释掉,那么我会收到文件)。
答案 0 :(得分:0)
所以...我尝试了此方法并开始工作。我没有在多个端口上创建多个套接字,而是在filename
上分别写了file
和ObjectOutputStream oos
。
oos.writeUTF(filename)
oos.writeObject(bytearray)
然后,在客户端上,我只需使用readUTF()
读取文件名并使用readObject()
读取文件即可。