RT,在用SWT做一个Socket通信程序时控制台总报错:
Exception in thread Thread-0
org.eclipse.swt.SWTException: Invalid thread access
………..
客户端程序经验证没有问题。
服务器端程序线程中有一段:
text.append(客户端输入的信息为:
+receiveMsg);
receiveMsg=reader.readLine();
本想通过
Thread th=new Thread(this);
th.start();
来启动线程,总不行。还是报错。但把上面的text.append(….)
改成System.out.println(….)“后控制台却可以把客户端发送的消息打印出来。</p>
<p>想了半天,突然想起SWT的线程和SWING的线程不一样的,把书一翻,把那段线程代码改成了:</p>
<p><span style=`
>new Thread(){
public void run(){
try{
sPort=6854; //设置服务器的端口号
sSocket=new ServerSocket(sPort,10); //创建监听ServerSocket套接字
while(true){
cSocket=sSocket.accept(); //监听,并产生对应的Socket套接字.
//获取套接字的输入输出流对象
reader=new BufferedReader(new InputStreamReader(cSocket.getInputStream()));
writer=new PrintStream(cSocket.getOutputStream());
//先向客户端发送一行数据
writer.println(你已经连接上服务器了.可以通信!
);
writer.flush();
//再从客户端读取信息
receiveMsg=reader.readLine();
while(!receiveMsg.equals(Bye
))
{
display.asyncExec(new Runnable(){ //注意,我曾把这里的receiveMsg=reader.readLine()一句写入了run方法里
public void run(){
text.append(client端输入的信息为:
+receiveMsg); //导致了程序运行异常,导致服务端不断的读数据。cSocket根本关闭不了
}
}); //看来display.asyncExec….是对访问对象有严格限制的
receiveMsg=reader.readLine();
}
//读入CLIENT端写入的下一行信息
cSocket.close();
}
}catch(IOException e){
System.out.println(套接字、输入输出流创建失败或网络IO出现错误.
);
}
}
}.start();
程序正常运行鸟。。。
p.s.1.注意一般为后台新开一个线程用:
new Thread(){ //新开一个线程,这是匿名内部类的写法
public void run(){
….. //开始后台任务
}
}start(); //start表示立即启动线程
2.从后台处理线程中访问前台界面组件,关键在于使用Display对象:
display.asyncExec(new Runnable(){
public void run(){
…..//前台界面操作
}
});