错误提示你数据报发送存在问题
不知道你导入了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;
} }
不知道你导入了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;
} }
假如applet所在页面刷新后,端口会被占用吗?
好比一台机器上可以有n个客户端,使用同一端口
我是说,applet需要侦听一个端口,接收从server发送的数据。这个端口,也是server往applet发送的数据的端口。这个端口会出现占用问题。你们试过没有?谢谢。