try{
byte[] buf = new byte[1024];
DatagramSocket ds = new DatagramSocket(10005);
DatagramPacket dp =new DatagramPacket(buf,buf.length);
while(true)
{
ds.receive(dp);
listmessage.add(new String(buf,0,dp.getLength()),0);
ds.close();
}
}catch(Exception e){};
接收到一个数据包后 ds.close();后便不能接收下一个数据包
把ds.close();去掉后客户端在运行时会出现“程序没有响应”.请问应该怎样修改?

解决方案 »

  1.   

    忘记说了  listmessage是一个SWT中一个List实例
      

  2.   

    没有sleep、没有yield,随便找个多线程的例子看看。『把ds.close();去掉后客户端在运行时会出现“程序没有响应”.』,
    你说的也没错,去掉之后在下一个循环就从catch处退出了。
      

  3.   

    我改成这样了,为什么还是有错误?
    package com.im886;import java.net.DatagramPacket;
    import java.net.DatagramSocket;import org.eclipse.swt.SWT;
    import org.eclipse.swt.widgets.Composite;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.List;
    import org.eclipse.swt.widgets.Shell;public class Rec { //private static List listmessage;
    /**
     * Launch the application
     * @param args
     */
    public static void main(String[] args)
    {
    Run run = new Run();

    }
    }
    class Run 
    {

    Display display = Display.getDefault();
    Shell shell = new Shell();
    Composite composite = new Composite(shell, SWT.NONE);
    List listmessage= new List(composite, SWT.BORDER);
    public Run()
    { new Thread(new Runnable()
    {
    public void run()
    {
    shell.setSize(255, 203);
    shell.setText("SWT Application");
    shell.open();
    listmessage.setBounds(3, 4, 227, 156);
    shell.layout();
    composite.setBounds(6, 7, 236, 163);
    try{ while(true)
    {
    byte[] buf = new byte[1024];
    DatagramSocket ds = new DatagramSocket(10005);
    DatagramPacket dp =new DatagramPacket(buf,buf.length);
    ds.receive(dp);
    listmessage.add(new String(buf,0,dp.getLength()),0);
    ds.close();
    }
    }catch(Exception e){System.out.println("error");};
    while (!shell.isDisposed())
    {
    if (!display.readAndDispatch())
    display.sleep();
    }
    }
    }).start();
    }
    }结果:
    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.Control.setSize(Control.java:2566)
    at com.im886.Run$1.run(Rec.java:39)
    at java.lang.Thread.run(Unknown Source)
      

  4.   

    你后贴的这段代码,受到SWT的一个限制,你建立了自己的线程,其中修改了UI,通常这是不允许的,不过你可以这样来异步执行:display.asyncExec(new Runnable(){…});