0

所以在这个阶段我有一个服务器和一个客户端,它们每个都有输入和输出流。

我正在使用 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>");

}
4

1 回答 1

2

为什么不将侦听()或调用侦听(您的阻塞操作)的循环放在线程中:

new Thread(new Runnable() {

    @Override
    public void run() {
        listening();

    }

}).start();

这样,阻塞操作在一个单独的线程中,您的主代码继续正常执行。

于 2012-05-28T16:10:31.427 回答