udp实现简单发送接受消息功能。代码如下:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.List;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import com.swtdesigner.SWTResourceManager;public class Chat { Display display = Display.getDefault();
Shell shell = new Shell(); 
Composite composite = new Composite(shell, SWT.NONE);
List listmessage = new List(composite, SWT.BORDER);
Text ip = new Text(composite, SWT.BORDER);
Text message = new Text(composite, SWT.BORDER);
    Button send = new Button(composite, SWT.FLAT); 
    DatagramSocket ds = null;
public Chat()
{
try
{
ds = new DatagramSocket(3000);
}catch(Exception e){};
shell.setSize(287, 290);
shell.setText("SWT Application");
shell.open();
composite.setBounds(0, 0, 279, 262);
send.setText("button");
//创建收消息线程
new Thread(new Runnable()
{
public void run()
{
byte[] buf = new byte[1024];
DatagramPacket dp =new DatagramPacket(buf,1024);
while(true)
{
try{ds.receive(dp);
}catch(Exception e){};
listmessage.add(new String(buf,0,dp.getLength()),0);
}
}
}).start();
//发消息代码开始               send start
send.addMouseListener(new MouseAdapter() {
public void mouseDown(MouseEvent e) 
{
byte[] buf;
buf = message.getText().getBytes();
try{
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName(ip.getText()),3000);
ds.send(dp);
}catch(Exception ex){};
message.setText("");
}
});
//发消息代码结束               send end
send.setBounds(228, 3, 48, 30);
message.setBackground(SWTResourceManager.getColor(255, 255, 255));
message.setBounds(79, 3, 148, 30);
ip.setBackground(SWTResourceManager.getColor(255, 255, 255));
ip.setBounds(2, 3, 72, 30);
listmessage.setBackground(SWTResourceManager.getColor(255, 255, 255));
listmessage.setBounds(2, 35, 271, 224);
shell.layout();
while (!shell.isDisposed()) 
{
if (!display.readAndDispatch())
display.sleep();
}
}
public static void main(String[] args) 
{
new Chat();
}
}控制台报告异常:
Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3374)
at org.eclipse.swt.SWT.error(SWT.java:3297)
at org.eclipse.swt.SWT.error(SWT.java:3268)
at org.eclipse.swt.widgets.Widget.error(Widget.java:435)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:331)
at org.eclipse.swt.widgets.List.add(List.java:126)
at com.im886.Chat$1.run(Chat.java:52)
at java.lang.Thread.run(Unknown Source)

解决方案 »

  1.   

    你把主函数改成这样:
    Chat chat = new Chat();
    chat.start();
      

  2.   

    listmessage.add(new String(buf,0,dp.getLength()),0);
    这里错了,调试发现这个方法不能在另外一个线程中运行,你用控制台输出就能正常运行。另外 主函数也不用改。
      

  3.   

    to JaredJared() 
    控制台输出是什么意思?怎么做??
      

  4.   

    为什么listmessage.add(new String(buf,0,dp.getLength()),0);
    不能在另外一个线程中运行?不明白啊