练习UDP发送接收

最近进入网络编程这块了,今天视频上把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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值