我正在尝试使用套接字编程和计时器
创建一个监听客户端输入流的程序但每当计时器执行.. 它被绞死了
请帮帮我
这是代码......
private void jButton1MouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
try
{
ServerUserName=jTextField1.getText();
ss=new ServerSocket(5000);
jButton1.enable(false);
jTextArea1.enable(true);
jTextField2.enable(true);
Timer t=new Timer(2000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
try
{
s=ss.accept();
InputStream is=s.getInputStream();
DataInputStream dis=new DataInputStream(is);
jTextArea1.append(dis.readUTF());
}
catch(IOException IOE)
{
}
catch(Exception ex)
{
setLbl(ex.getMessage());
}
}
});
t.start();
}
catch(IOException IOE)
{
}
}
提前致谢
答案 0 :(得分:4)
使程序多线程;一个线程侦听套接字,另一个线程处理GUI。使用SwingUtilities.invokeLater让GUI线程(“事件调度线程”)在网络线程接收数据时进行GUI更新。
答案 1 :(得分:1)
每次调用accept
都会等待新客户端连接到服务器。呼叫将阻塞,直到建立连接。听起来你有一个客户端维护与服务器的连接。
一种解决方案是拉
s=ss.accept();
InputStream is=s.getInputStream();
DataInputStream dis=new DataInputStream(is);
在代码的计时器部分之外。
更新:请注意,如果没有可供读取的数据,readUTF
仍会阻止。
答案 2 :(得分:0)
我认为您想使用套接字超时而不是计时器:
Thread listener = new Thread() {
ServerSocket ss;
@Override
public void run() {
try {
ss = new ServerSocket(5000);
ss.setSoTimeout(2000);
try {
while (true) {
try {
final String text = acceptText();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jTextArea1.append(text);
}
});
} catch (final Exception ex) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setLbl(ex.getMessage());
}
});
}
}
} finally {
ss.close();
}
} catch (IOException ex) {
Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
}
}
private String acceptText() throws IOException {
Socket s = ss.accept();
try {
InputStream is=s.getInputStream();
try {
DataInputStream dis=new DataInputStream(is);
return dis.readUTF();
} finally {
is.close();
}
} finally {
s.close();
}
}
};
listener.setDaemon(true);
listener.start();