所以在这个阶段我有一个服务器和一个客户端,它们每个都有输入和输出流。
我正在使用 VLC 包装器实现视频流媒体。基本上,当我在客户端选择一个视频时,它会发送一个服务器应该期望接收的对象字符串。(视频文件/commentWrite/ratingWrite)。它会在选择视频时发送所有这三个对象,以便更新流、更新评论框和评级框。
现在的问题是,当我需要发送这些标头并接收数据时,我必须使用类似的东西:
replyToServer.writeObject("videoFile");
replyToServer.writeObject(selectedVideo);
//get comments
listening();
//get rating
listening();
因此,通过预先知道您期望的许多回复来进行硬编码。此外,如果您想在客户端工作的任何时候从服务器接收一些东西,但是您不能使用简单的 while 循环来检查 listener() 函数,因为它会阻塞所有其他功能。
PS。侦听器的结构如下:
public void listening() throws IOException, ClassNotFoundException {
String mode = null;
// blocks the process till gets the output.
mode = (String) inputFromServer.readObject();
System.out.println("Mode Received:" +mode);
if (mode.equals("videoList")) {
getListFromSocket();
} else if [.....]
所以......所以我明白它可以通过使用线程来完成。我并没有真正使用 Java 做过很多线程,但是是否可以在(String) inputFromServer.readObject()上进行某种中断;或inputFromServer.available()所以一旦它看到流上有东西它就跳转到 listener() 函数?
更新:
通过使用 lxx 代码,我注意到我收到的 null 异常是由于更新了 gui。我在那个监听()中有一个函数 updateComments;。当我看到评论等时,一切似乎都运行良好。但它仍然在控制台中显示那些空异常......
public void updateComments(List<Comment> commentList) {
commentLabel.setText("<html><div style='width:130px; border: 1px solid black; list-style-type: none; text-align:left;'>");
if (commentList.size() == 0) {
commentLabel.setText(commentLabel.getText()+"<font style='font-family: Century Gothic, sans-serif; font-weight:normal; color:#444; font-size:9px;'>No comments...</font><br>");
} else {
for (Comment tempComment : commentList) {
commentLabel.setText(commentLabel.getText()+"<div style='margin:3px;'><font style='font-family: Century Gothic, sans-serif; font-size:9px; color:#333;'>"+tempComment.getUser()+":</font><br>");
commentLabel.setText(commentLabel.getText()+"<font style='font-family: Century Gothic, sans-serif; font-weight:normal; font-size:8px;'>"+tempComment.getText()+"</font><br>");
commentLabel.setText(commentLabel.getText()+"<font style='font-family: Century Gothic, sans-serif; font-weight:normal; font-size:7px;'><i>"+tempComment.getDate()+"</i></font></div><hr>");
}
}
commentLabel.setText(commentLabel.getText()+"</div></html>");
}