繁体   English   中英

套接字接收数据时,Java套接字中是否有事件?

[英]Is there an event in Java Socket when socket receive data?

我编写了一个Swing Java程序,带有一个客户端和一个带有java.io套接字的服务器。 当客户端按下按钮时,某些内容将发送到服务器,然后服务器应将某些内容发送到客户端。 为了实现这一点,我需要知道在C ++中是否存在诸如“ onClientRead”之类的事件,因为我还有其他一些按钮可以执行其他操作,因此无法将ReadLine()方法放在所有这些按钮中。 我知道我可以在java.nio中使用套接字,但是如果java.io的套接字中有东西,那就更好了。 谢谢。

如果没有要读取的数据,则从两端的Socket返回的InputStream都将阻塞(即,InputStream上的read()方法在读取数据之前不会返回)。 如果您正在SwingEventThread中执行read()(即,当用户单击按钮时),则您的UI将显示为锁定。 如果有可供读取的字节,InputStream上的available()方法将返回大于0的数字,因此您可以使用它。
但是,听起来您应该编写GUI外部存在的一些其他代码,这些代码将从InputStream读取,并在读取数据时触发其自己的事件。 然后,您的GUI可以侦听该事件。 像这样:

public class InputStreamReader
  implements Runnable
{
   protected InputStream in;
   protected List<ChangeListener> listeners;

   public InputStreamReader( InputStream in )
   {
     this.in = in;
     this.listeners = new ArrayList<ChangeListener>();
   }

   public void addChangeListener( ChangeListener l )
   {
     this.listeners.add( l );
   }

   public void run()
   {
     byte[] bytes = new byte[256]; //make this whatever you need
     in.read( bytes );

     //need some more checking here to make sure 256 bytes was read, etc.
     //Maybe write a subclass of ChangeEvent
     ChangeEvent evt = new ChangeEvent( bytes );
     for( ChangeListener l : listeners )
     {
       l.stateChanged( evt );
     }
   }
}

此类是“ Runnable”的类,因为InputStream的读取方法会阻塞,因此需要在其他线程中运行。 要开始上课:

InputStreamReader r = new InputStreamReader( in );
//add your listener here
Thread t = new Thread( r );
t.start();

可以使用带有read的单独Thread(这是一种阻塞方法)来完成:

Thread t = new Thread() {
  public void run() {
    InputStream is = clientSocket.getInputStream();
    byte[] buffer = new byte[1024];
    int read;

    while(true) {
      read = is.read(buffer);
      onClientRead(clientSocket, read);
    };
  }
};
t.start();

这是一种“测试方法”,请尝试为此线程创建一个单独的类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM