基于UDP协议实现一个简陋的一对一的聊天室

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40301026/article/details/88623692

首先明白UDP相关知识:

https://blog.csdn.net/qq_40301026/article/details/88623353

https://blog.csdn.net/qq_40301026/article/details/88605688

首先先实现一方接受,一方发送的能力:

这是发送方:

思路:

          1.使用DatagramSocket指定端口,创建接收端

          2.准备要发送的数据(最后要转化为字节,不要超过60k)

          3.创建并封装DatagramPacket包裹 (需指明目的地IP和端口)

          4.发送包裹seed(DatagramPacket p)

          5.释放资源

package cn.liu.loc;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UdptalkClient01 {
	public static void main(String[] args) throws Exception {
		DatagramSocket client = new DatagramSocket(8832);//创建发送端
		System.out.println("正在发送中。。。。。");
		while(true) {
			//准备要发送的数据,并处理为字节
			BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));
			byte[] datas = new byte[1024*60];
			String str = dis.readLine();//拿到流中的数据
			datas = str.getBytes();//String转为字节,存入字节数组
			//将数据打包并发送
			DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("Dick",8888));
			client.send(packet);
			if(str.equals("结束")) {
				break;
			}
		}
		//关闭服务端口
		client.close();
	}
}

这是接受方:

思路:

       1.使用DatagramSocket指定端口,创建接收端

       2.准备字节数组用来存放包裹数据

       3.阻塞式接受包裹receive(Datagrampacket p)

       4.将字节数组中数据转换或处理

       5.释放资源

package cn.liu.loc;

import java.net.DatagramPacket;
import java.net.DatagramSocket;


/**
 * 接收端
 * @author Administrator
 *
 */
public class UdptalkServer01 {
	public static void main(String[] args) throws Exception {
		System.out.println("正在接收中。。。。。。");
		DatagramSocket server = new DatagramSocket(8888);//创建接收端
		byte[] datas = new byte[1024*60];//准备接收数组
		
		//循环的去接受包,并处理
		while(true) {
			//写明地址,并接收包
			DatagramPacket packet = new DatagramPacket(datas,0,datas.length);//创建接收包
			server.receive(packet);
			//拿到包的字节数据
			datas = packet.getData();
			int len = packet.getLength();
			//转换数据类型
			String str = new String(datas,0,len);
			System.out.println(str);
			if(str.equals("结束")) {
				break;
			}
		}
		//关闭服务端口
		server.close();
	}
}

 运行之后,实现如图效果。

-------------------------------------------------------------------------------------------------------------------------------------->

这只实现了一方发送数据,一方只能接受数据。如何能实现想qq那样你一句我一句呢???即:一边发一边收,那就要加入多线程。

对上面代码进行封装,并且加入多线程。

发送方:

package cn.liu.loc;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;

/**
 * 封装
 * @author Administrator
 *
 */
public class UdptalkClient02 implements Runnable{
	private DatagramSocket client ;
	private int Port;
	private String otherIP;
	private int otherPort;
	
	public UdptalkClient02(int Port,String otherIP,int otherPort) {
		this.Port = Port;
		this.otherIP = otherIP;
		this.otherPort = otherPort;
		try {
			this.client = new DatagramSocket(Port);//创建发送端
			
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	
	
	@Override
	public void run() {
		while(true) {
			//准备要发送的数据,并处理为字节
			BufferedReader dis = new BufferedReader(new InputStreamReader(System.in));
			byte[] datas = new byte[1024*60];
			try {
				String str = dis.readLine();//拿到流中的数据
				datas = str.getBytes();//String转为字节,存入字节数组
				//将数据打包并发送
				DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(otherIP,otherPort));
				client.send(packet);
				if(str.equals("结束")) {
					break;
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		client.close();
	}
}

接收方: 

package cn.liu.loc;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdptalkServer02 implements Runnable{
	private DatagramSocket server;
	private int Port;
	private String role;
	
	public UdptalkServer02(int Port,String role) {
		this.Port = Port;
		this.role = role;
		try {
			this.server = new DatagramSocket(Port);//创建接收端
		} catch (SocketException e) {
			e.printStackTrace();
		}
	}
	
	
	@Override
	public void run() {
		byte[] datas = new byte[1024*60];//准备接收数组
		//循环的去接受包,并处理
		while(true) {
			//写明地址,并接收包
			DatagramPacket packet = new DatagramPacket(datas,0,datas.length);//创建接收包
			try {
				server.receive(packet);
			} catch (IOException e) {
				e.printStackTrace();
			}
			//拿到包的字节数据
			datas = packet.getData();
			int len = packet.getLength();
			//转换数据类型
			String str = new String(datas,0,len);
			System.out.println(role+":"+str);
			if(str.equals("结束")) {
				break;
			}
		}
		server.close();
	}
}

测试,启动:

package cn.liu.loc;

public class UdptalkClient02Test {
	public static void main(String[] args) {
		//一个发送端对应对方一个接收端
		//发送端8888
		new Thread(new UdptalkClient02(8888,"Dick", 5535)).start();
		//接收端7753
		new Thread(new UdptalkServer02(7753,"小红")).start();
	}
}
package cn.liu.loc;

public class UdptalkServer02Test {
	public static void main(String[] args) {
		//一个发送端对应对方一个接收端
		//接收端5535
		new Thread(new UdptalkServer02(5535,"小明")).start();
		//发送端6634
		new Thread(new UdptalkClient02(6634,"Dick", 7753)).start();
	}
}

 现在基于控制台比较简陋,但是基于UDP传输的思想基本表达明白:

猜你喜欢

转载自blog.csdn.net/qq_40301026/article/details/88623692