练习UDP发送接收

来源:互联网 发布:不用网络最好玩的游戏 编辑:程序博客网 时间:2024/05/22 06:37

最近进入网络编程这块了,今天视频上把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());
0 0
原创粉丝点击