思路:
在同一个java文件中写发送端与接收端,使用多线程完成。
1,建立Send端,使用读取流读取键盘录入,将数据以byte[]的形式保存。
2,建立数据报(DatagramPacket),填写参数,将byte[]数据发出。
3,建立Rece端,建立byte[]与数据报,用来等待接收数据。
3,得到数据报之后,调用数据报方法,得出数据报里的各种信息,例如,ip,data
import java.net.*;
import java.io.*;
class UdpOnline
{
public static void main(String[] args)
{
try
{
DatagramSocket sendds=new DatagramSocket();//创建send端点
DatagramSocket receds=new DatagramSocket(10003);//创建rece端点
Send send=new Send(sendds);//创建send
Rece rece=new Rece(receds);//创建rece
new Thread(send).start();//send跑起!
new Thread(rece).start();//rece跑起!
}
catch (Exception ex)
{
throw new RuntimeException("建立失败!");
}
}
}
class Send implements Runnable//Udp Send
{
private DatagramSocket ds;
Send(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{
while(true)
{
//读取流读取键盘录入。
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
//将键盘录入的数据存储到String line 中做准备。
String line=null;
while ((line=bufr.readLine())!=null)//注意,readLine方法是阻塞式方法,无数据会等待。
{
//将键盘录入的数据转成byte[],方便下面传送。
byte[] info=line.getBytes();
//创建数据报,并发送出去。这里我发送的目的地是自己。将ip和端口改成自己想要的吧,记得上面端口也要改。
DatagramPacket dp=new DatagramPacket(info,info.length,InetAddress.getByName("127.0.0.1"),10003);
//发送数据出去。
ds.send(dp);
//聊天结束语句。
if("over".equals(line))
break;
}
//聊天结束语句。
if("over".equals(line))
break;
//关闭资源。
bufr.close();
ds.close();
}
}
catch (Exception ex)
{
throw new RuntimeException("Send data ok");
}
}
}
class Rece implements Runnable//Udp Rece
{
private DatagramSocket ds;
Rece(DatagramSocket ds)
{
this.ds=ds;
}
public void run()
{
try
{ //创建数据接收的容器.
byte[] buf=new byte[1024];
while(true)
{
//创建数据报,为数据接受做准备。
DatagramPacket dp=new DatagramPacket(buf,buf.length);
//等待数据接受。也就是当监听的端口有数据报来时,在执行一次,也是阻塞式方法。
ds.receive(dp);
//获得数据报后,查看数据报相关信息,例如ip,data
String ip=dp.getAddress().getHostAddress();
String data=new String(dp.getData(),0,dp.getLength());
//打印出来.
System.out.println(ip+"::"+data);
//结束语句。
if("over".equals(data))
break;
}
}
catch (Exception ex)
{
throw new RuntimeException("Rece data lose");
}
}
}
|