最近进入网络编程这块了,今天视频上把UDP的发送接受看完,然后自己晚上练习写了下,但还是需要提示才写完了
发送:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class send implements Runnable{
private DatagramSocket ds;
public send(DatagramSocket ds){
this.ds=ds;
}
public void run() {
try {
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while ((line=bufr.readLine())!=null){
byte[] buf=line.getBytes();
DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("172.16.227.1"),22222);
ds.send(dp);
if (line.equals("886"))
break;
}
ds.close();
} catch (Exception e) {
}
}
}
首先是需要网络编程传输必须要的DatagramSocket, 此类表示用来发送和接收数据报包的套接字。
数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。
示例:DatagramSocket s = new DatagramSocket(null); s.bind(new InetSocketAddress(8888));
这等价于:DatagramSocket s = new DatagramSocket(8888);
两个例子都能创建能够在 UDP 8888 端口上接收广播的 DatagramSocket。
然后使用键盘录入
<span style="white-space:pre"> </span>BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
String line=null;
while ((line=bufr.readLine())!=null){
上面这三行需要熟练运用。
接着把数据放入包中,数据信息,数据长度,地址ip,端口,最后发送数据关闭之
<span style="white-space:pre"> </span>DatagramPacket dp=new DatagramPacket(buf, buf.length,InetAddress.getByName("172.16.227.1"),22222);
ds.send(dp);
接收:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class rece implements Runnable{
private DatagramSocket ds;
public rece(DatagramSocket ds){
this.ds=ds;
}
public void run() {
try {
while(true){
byte[] buf=new byte[1024];
DatagramPacket rece=new DatagramPacket(buf, buf.length);
ds.receive(rece);
String ip=rece.getAddress().getHostAddress();
int port=rece.getPort();
String text=new String(rece.getData(),0,rece.getLength());
System.out.println(ip+":"+port+":"+text);
if (text.equals("886"))
System.out.println(ip+"...退出聊天室");
}
}
catch (Exception e) {
}
}
}
首先同样是需要Socket来创建传输。
<span style="white-space:pre"> </span>byte[] buf=new byte[1024];
DatagramPacket rece=new DatagramPacket(buf, buf.length);
ds.receive(rece);
这里用于接受数据,然后用
String ip=rece.getAddress().getHostAddress();
int port=rece.getPort();
String text=new String(rece.getData(),0,rece.getLength());
解析需要的地址端口和内容
最后在主函数里面还第一次使用了线程。
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class testChar {
public static void main(String[] args) throws IOException{
DatagramSocket send=new DatagramSocket();
DatagramSocket rece=new DatagramSocket(22222);
new Thread(new send(send)).start();
new Thread(new rece(rece)).start();
}
}
String ip=rece.getAddress().getHostAddress();
int port=rece.getPort();
String text=new String(rece.getData(),0,rece.getLength());