错误提示你数据报发送存在问题
不知道你导入了io和net包没有?
我给你一个关于数据报通讯的例子吧
  1、javaCommunicationServer.java  import java.net.*;
  import java.io.*;
  import java.awt.*;
  import java.applet.Applet;  public final class javaCommunicationServer extends Frame
   {
    private Label label1,label2 ;
    private Panel panel1,panel2;
    private TextField textfield;
    private String name,name1;
    private TextArea textarea;
    private DatagramSocket sendSocket,receiveSocket;
    private DatagramPacket sendPacket,receivePacket;  public javaChatServer()
   {
    super("通讯控制台:");//使用超类构造方法,构造一个Frame
    panel1=new Panel();
    panel1.setLayout(new BorderLayout());
    label1=new Label("通话纪录");
    textarea=new TextArea(10,20);
    textarea.setText("欢迎您!");    panel1.add("North",label1);
    panel1.add("Center",textarea);
    add("North",panel1);
    panel2=new Panel();
    panel2.setLayout(new BorderLayout());
    label2=new Label("发言:");
    panel2.add("Center",label2);
    textfield=new TextField(20);
    panel2.add("South",textfield);
    add("Center",panel2);
    show();   try
   {
    sendSocket=new DatagramSocket();
    receiveSocket= new DatagramSocket(5000);
   }
   catch (SocketException e)
    {
     e.printStackTrace();
     System.exit(1);
    }
   }  public void waitForPacket()
   {
    while (true)
   {
   try
    {
     byte buf[]=new byte[100];
     receivePacket=new DatagramPacket(buf,buf.length);
     receiveSocket.receive(receivePacket);
     name=receivePacket.getAddress().toString();
     if(name1!=name)
      {
       textarea.appendText("\n来自主机:"+name+"\n端口:"+receivePacket.getPort());
      }
     textarea.appendText("\n客户:\t");
     byte[] data=receivePacket.getData();
     String receivedString=new String(data,0);
     textarea.appendText(receivedString);
     name1=name;
    }   catch(IOException e)
    {
     textarea.appendText("网络通讯出现错误,问题在"+e.toString());
     }
    }
   }  public boolean handleEvent(Event e)
    {
     if(e.id==Event.WINDOWS_DESTROY)
     {
      hide();
      dispose();
      System.exit(0);
     }
    return super.handleEvent(e);
    }  public boolean action(Event e,Object o)
   {
    try
     {textarea.appendText("\n服务器:");
      String string=o.toString();
      textarea.appendText(string);
      byte[] databyte=new byte[100];
      string.getBytes(0,string.length(),databyte,0);
      sendPacket=new DatagramPacket(databyte,string.length(),InetAddress.getByName(name),5001);
      sendSocket.send(sendPacket);
     }catch(IOException ioe)
     {
      textarea.appendText("网络通讯出现错误,问题在"+ioe.toString());
     }
     return true;
    }   }CommunicationServerRun.java,建立javaCommunicationServer的实例,然后运行。   import javaCommunicationServer
   class CommunicationServerRun extends javaCommunicationServer
    {
     public static void main(String args[])
     {
      javaCommunicationServer cs=new javaCommunicationServer();
      cs.waitForPacket();
      }
    }
2、客户端
  import java.applet.*;
  import java.awt.*;
  import java.net.*;
  import java.io.*;  public final class javaCommunicationClient extends Applet
  {
   private Label label1,label2 ;
   private Panel panel1,panel2;
   private TextField textfield;
   private TextArea textarea;
   private DatagramSocket sendSocket,receiveSocket;//声明发送数据报Socket和接收数据报Socket
   private DatagramPacket sendPacket,receivePacket;//声明发送数据报文包和接收数据报文包  public void init()
   {
    setBackground(Color.gray);
    setLayout(new BorderLayout());//设置一个布局管理器
    panel1=new Panel();
    panel1.setLayout(new BorderLayout());//在容器中放置布局管理器
    label1=new Label("通话纪录");
    textarea=new TextArea(10,20);//文本显示区域
    textarea.setText("欢迎您!");
    panel1.add("North",label1);//将标签添加到布局管理器中
    panel1.add("Center",textarea);
    add("North",panel1);
    label2=new Label("发言:");//创建另一个容器
    panel2.add("Center",label2);
    textfield=new TextField(20);
    textfield.setText("");
    panel2.add("South",textfield);
    add("Center",panel2);
    show();
   }  public void start()
   {
    waitForPackets();
   }  public void waitForPackets()   /*方法waitForPacket用来监听来自于服务器的数据报,当获得数据报后,在文本显示区域显示出来   */
  {
   try
   {
    sendSocket=new DatagramSocket();//实例化一个发送数据报Socket对象
    receiveSocket= new DatagramSocket(5001);//实例化一个接收数据报Socket对象,以5001为端口    } catch (SocketException e)//捕获异常
   {
    textarea.appendText("不能打开数据报Socket,或数据报Socket无法与指定端口连接!");
   }
   while (true)
    {
     try
     {
      byte buf[]=new byte[100];
      receivePacket=new DatagramPacket(buf,buf.length);//实例化一个接收数据报文包对象      receiveSocket.receive(receivePacket);//以receivePacket为参数,接受文包
      textarea.appendText("\n服务器:\t");
      byte[] data=receivePacket.getData();
      String receivedString=new String(data);
      textarea.appendText(receivedString);//将接收到的数据报文报中的数据显示出来
     } catch(IOException e)
    {
     textarea.appendText("网络通讯出现错误,问题在"+e.toString());
    }
   }
  }  public boolean action(Event e,Object o)
   {
    try
     {textarea.appendText("\n客户端:");
     String string=o.toString();
     textarea.appendText(string);
     byte[] databyte=new byte[100];
     string.getBytes(0,string.length(),databyte,0);
     sendPacket=new DatagramPacket(databyte,string.length(),InetAddress.getByName("202.38.64.4"),5000);//发送数据报,其中你可以用你自己的主机IP替换器中的IP地址
     sendSocket.send(sendPacket);
    }catch(IOException ioe)
    {
     textarea.appendText("网络通讯出现错误,问题在"+ioe.toString());
    }
   return true;
  }  }

解决方案 »

  1.   

    多谢你的代码!
    假如applet所在页面刷新后,端口会被占用吗?
      

  2.   

    数据报(包括SOCKET)发送时,端口是不会存在占用问题的
    好比一台机器上可以有n个客户端,使用同一端口
      

  3.   

    数据报是 connectionless 的, 发送可以用系统指定的任意端口.
      

  4.   

    是的,数据包发送时不会存在端口占用的问题。
    我是说,applet需要侦听一个端口,接收从server发送的数据。这个端口,也是server往applet发送的数据的端口。这个端口会出现占用问题。你们试过没有?谢谢。