Java readUTF()挂在服务器上(套接字连接)

时间:2020-07-14 17:36:45

标签: java sockets server

我阅读了大部分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()上。如果我注释掉,那么我会收到文件)。

1 个答案:

答案 0 :(得分:0)

所以...我尝试了此方法并开始工作。我没有在多个端口上创建多个套接字,而是在filename上分别写了fileObjectOutputStream oos

oos.writeUTF(filename)
oos.writeObject(bytearray)

然后,在客户端上,我只需使用readUTF()读取文件名并使用readObject()读取文件即可。