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