java当中用UDP实现相互交流

一:引言

实现一方 到另一方可以发送信息,而另一方也能回复信息。这里用到了多线程,开辟两条不同的执行路径,一个执行接收信息,一个执行发送信息,但其端口号 要对应 ,即一个发送端口,对应一个接收端口。

二:上码:

1:发送端类的实现

package com.wyj.three;

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 86155
 *
 */
public class Demo12_talk发送02 implements Runnable{
	
	private DatagramSocket client;
	private BufferedReader reader;
	private int port;
	private int toport;
	private String toIP;
	
	 public Demo12_talk发送02(int port,int toport,String toIP) {
		 this.port = port;
		 this.toport = toport;
		 this.toIP = toIP;
		 
		 try {
			client = new DatagramSocket(port);
			reader = new BufferedReader(new InputStreamReader(System.in));

		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 }
	 
	@Override
	public void run() {
		// TODO Auto-generated method stub
		 while( true ) {
			 String msg ;
			 try {
				  msg = reader.readLine();
				 byte[] dates = msg.getBytes();
		//		 3.封装成 DatagramPacket 包裹  指定目的地 即Ip地址和端口
				 DatagramPacket packet = new DatagramPacket(dates, 0,dates.length, 
						 				new InetSocketAddress(this.toIP,this.toport));
				 
		//		 4.发送包裹 send(DatagramPacket p)
				 client.send(packet);
				 
				 if(msg.equals("bye")) {
					 break;
				 }
			 }catch( IOException e  ) {
				 e.printStackTrace();
			 }
			 
		 }
		 
		 client.close();
	}

}

2:接受端类的实现

package com.wyj.three;

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

/**
 * 接收端
 * 
 * 
 * @author 86155
 *
 */
public class Demo11_talk接收端02 implements Runnable{

	DatagramSocket server;
	 
	 public Demo11_talk接收端02(int port) {
		 try {
			server = new DatagramSocket(port);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	 }
	
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while(true) {
			byte [] container = new byte[1024*60];
			DatagramPacket packet = new DatagramPacket(container,container.length);
//			3.阻塞式接受包裹 receive​(DatagramPacket p)
			try {
				server.receive(packet);//会有延迟
				
				byte[] dates = packet.getData();
				int len = packet.getLength();//得用packet的实际大小  
				String date = new String(dates,0,len);
				
				System.out.println(date);
				
				if( date.equals("bye")) {
					break;
				}
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			

		}
		//释放资源
		server.close();
	}

}

3:具体的实现(老师与学生的交流)

package com.wyj.three;
/**
 * 实现相互交流吧
 * 
 * 
 * @author 86155
 *
 */
public class Demo1_student {
	public static void main(String[] args) {	
		new Thread(new Demo11_talk接收端02(9998)).start();//接受
		
		new Thread(new Demo12_talk发送02(5555, 9997, "localhost")).start();//发送
	}
}

4:具体的实现(老师与学生的交流)

package com.wyj.three;
/**
 * 
 * 实现相互交流
 * 
 * @author 86155
 *
 */
public class Demo2_teacher {
	public static void main(String[] args) {
		
		
		new Thread(new Demo12_talk发送02(8888, 9998, "localhost")).start();//发送
		
		new Thread(new Demo11_talk接收端02(9997)).start();//接受
	}
}

不同的颜色代表接受端和发送端不相同(黑色代表接收端)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天天向上的菜鸡杰!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值