[英]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.