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

时间:2015-01-25 15:17:41

标签: java sockets

我编写了一个Swing Java程序,其中一个客户端和一个服务器使用Socket of java.io.当客户端按下按钮时,会向服务器发送一些内容,然后服务器应该向客户端发送一些内容。 为了实现这一点,我需要知道是否存在" onClientRead"在C ++中,因为我有其他一些不同的按钮可以执行其他操作,所以我不能将ReadLine()方法放在每个按钮中。 我知道我可以在java.nio中使用套接字,但是如果java.io的套接字中有什么东西则更好。 感谢。

2 个答案:

答案 0 :(得分:3)

如果没有要读取的数据,则从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 );
     }
   }
}

这个班级是&#34; Runnable&#34;因为InputStream读取方法阻塞所以它需要在不同的线程中运行。开始上课:

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

答案 1 :(得分:1)

这可以使用带有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();

这是一种“测试方式”,请尝试为此线程创建一个separete类。