java网络编程2-udp编程

1, demo

发送方代码

package networkCoding;

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

/**
 * 发送端
 * 1,使用 DatagramSocket指定端口 创建服务端
 * 2, 准备数据  转换成字节数组
 * 3,准备容器 封装称Datagrampacket包裹, 需要指定目的地
 * 4,准备发送包裹 send(Datagrampacket p)
 * 5,释放资源 
 *          
 * **/

public class UdpSend {
	public static void main(String[] args) throws IOException {
		System.out.println("发送方启动中");
		  // 1,使用 DatagramSocket指定端口 创建服务端
		 DatagramSocket client=new DatagramSocket(9999);
		// 2,准备数据  转换成字节数组
		String string= "123";
		byte[] bs= string.getBytes();
		// 3. 准备容器 封装称Datagrampacket包裹, 需要指定目的地
		 DatagramPacket  dp = new DatagramPacket(bs, 0,bs.length,new InetSocketAddress("localhost",8888));
		// 4,准备发送包裹 send(Datagrampacket p)
		 client.send(dp);
		// 5,释放资源 
		 client.close();
	}
}

2,接收方

package networkCoding;

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

/**
 * 
 * 1,一切以包裹为中心-数据包
 * 2,数据包操作字节数组
 * 两个api   
 * DatagramSocket 插座-套接字  开启一个端,有 send 和recive方法
 * DatagramPacket 数据包裹 信封 
 * 
 * */

/**
 * 接收端
 * 1,使用 DatagramSocket指定端口 创建服务端
 * 2,准备容器 封装称Datagrampacket包裹
 * 3. 阻塞失接受包裹receive(Datagrampacket p)
 * 4,分析数据
 *   date[] getData();
 *          getLength();
 * 5,释放资源 
 *          
 * **/

public class Udp {

	public static void main(String[] args) throws IOException {
		System.out.println("接收方启动中");
		  // 1,使用 DatagramSocket指定端口 创建服务端
		 DatagramSocket server=new DatagramSocket(8888);
		// 2,准备容器 封装称Datagrampacket包裹, 需要指定目的地
		  byte[] container =new byte[60*1024];
		  DatagramPacket dpDatagramPacket= new DatagramPacket(container, 0,container.length);
		// DatagramPacket 
		// 3. 阻塞失接受包裹receive(Datagrampacket p)
		  server.receive(dpDatagramPacket);
		// 4,分析数据
		//   date[] getData();
		//        getLength();
		  byte[] datas= dpDatagramPacket.getData();
		  int len =dpDatagramPacket.getLength();
		  System.out.println(new String(datas,0,datas.length));
		  
		// 5,释放资源
		  server.close();
	}

}

******************************

加上while 循环 多次发送

发送方

package networkCoding;

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;

/**
 * 发送端
 * 1,使用 DatagramSocket指定端口 创建服务端
 * 2, 准备数据  转换成字节数组
 * 3,准备容器 封装称Datagrampacket包裹, 需要指定目的地
 * 4,准备发送包裹 send(Datagrampacket p)
 * 5,释放资源 
 *          
 * **/

public class UdpSend {
	public static void main(String[] args) throws IOException {
		System.out.println("发送方启动中");
		  // 1,使用 DatagramSocket指定端口 创建服务端
		 DatagramSocket client=new DatagramSocket(9999);
		// 2,准备数据  转换成字节数组
		 BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(System.in));
		 while (true) {
			String string= bufferedReader.readLine();
			byte[] bs= string.getBytes();
			// 3. 准备容器 封装称Datagrampacket包裹, 需要指定目的地
			 DatagramPacket  dp = new DatagramPacket(bs, 0,bs.length,new InetSocketAddress("localhost",8888));
			// 4,准备发送包裹 send(Datagrampacket p)
			 client.send(dp);
			 if(bufferedReader.equals("bye")) {
				 break;
			 }
		}
		
		// 5,释放资源 
		 client.close();
	}
}

接收方

package networkCoding;

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

/**
 * 
 * 1,一切以包裹为中心-数据包
 * 2,数据包操作字节数组
 * 两个api   
 * DatagramSocket 插座-套接字  开启一个端,有 send 和recive方法
 * DatagramPacket 数据包裹 信封 
 * 
 * */

/**
 * 接收端
 * 1,使用 DatagramSocket指定端口 创建服务端
 * 2,准备容器 封装称Datagrampacket包裹
 * 3. 阻塞失接受包裹receive(Datagrampacket p)
 * 4,分析数据
 *   date[] getData();
 *          getLength();
 * 5,释放资源 
 *          
 * **/

public class Udp {

	public static void main(String[] args) throws IOException {
		System.out.println("接收方启动中");
		  // 1,使用 DatagramSocket指定端口 创建服务端
		 DatagramSocket server=new DatagramSocket(8888);
		// 2,准备容器 封装称Datagrampacket包裹, 需要指定目的地
		 while (true) {
			 
		
		  byte[] container =new byte[60*1024];
		  DatagramPacket dpDatagramPacket= new DatagramPacket(container, 0,container.length);
		// DatagramPacket 
		// 3. 阻塞失接受包裹receive(Datagrampacket p)
		  server.receive(dpDatagramPacket);
		// 4,分析数据
		//   date[] getData();
		//        getLength();
		  byte[] datas= dpDatagramPacket.getData();
		  int len =dpDatagramPacket.getLength();
		  String dataString = new String(datas,0,datas.length);
		  System.out.println(dataString);
		  if(dataString.equals("bye")) {
				 break;
			 }
		 }
		// 5,释放资源
		  server.close();
	}

}

**********************

面向对象写法实现 双向聊天

封装两个类 

扫描二维码关注公众号,回复: 8936080 查看本文章

1,聊天发送类

package networkCoding;

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;

public class TalkClient implements Runnable {
	private DatagramSocket client;
	private String toAddress;
	private int toPort;
	
	public TalkClient(int port, String toAddress,int toPort) throws SocketException {
		  // 1,使用 DatagramSocket指定端口 创建服务端
		this.client = new DatagramSocket(port);
		this.toAddress =  toAddress;
		this.toPort = toPort;
	}
	public static void main(String[] args) throws IOException {
		
		
	}

	@Override
	public void run () {
		// 2,准备数据  转换成字节数组
				 BufferedReader bufferedReader= new BufferedReader(new InputStreamReader(System.in));
				 while (true) {
					String string;
					try {
						string = bufferedReader.readLine();
						byte[] bs= string.getBytes();
					// 3. 准备容器 封装称Datagrampacket包裹, 需要指定目的地
					 DatagramPacket  dp = new DatagramPacket(bs, 0,bs.length,new InetSocketAddress(this.toAddress,this.toPort));
					// 4,准备发送包裹 send(Datagrampacket p)
					 this.client.send(dp);
					 if(string.equals("bye")) {
						 break;
					 }
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					
				}
				
				// 5,释放资源 
				 this.client.close();
	}
}

2,聊天接收类

package networkCoding;

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

public class ReceiveClient implements Runnable {
	private DatagramSocket server;
	private String name;
	public ReceiveClient(int port,String name) throws SocketException {
		 // 1,使用 DatagramSocket指定端口 创建服务端
		this.server = new DatagramSocket(port);
		this.name= name;
	}
	public static void main(String[] args) throws IOException {
		
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		// 2,准备容器 封装称Datagrampacket包裹, 需要指定目的地
				 while (true) {
				  byte[] container =new byte[60*1024];
				  DatagramPacket dpDatagramPacket= new DatagramPacket(container, 0,container.length);
				// DatagramPacket 
				// 3. 阻塞失接受包裹receive(Datagrampacket p)
				  try {
					this.server.receive(dpDatagramPacket);
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				// 4,分析数据
				//   date[] getData();
				//        getLength();
				  byte[] datas= dpDatagramPacket.getData();
				  int len =dpDatagramPacket.getLength();
				  String dataString = new String(datas,0,len);
				  System.out.println(this.name+":"+dataString);
				  if(dataString.equals("bye")) {
						 break;
					 }
				 }
				// 5,释放资源
				  this.server.close();
		
	}
}

然后 角色上场

杨子荣

package networkCoding;

import java.net.SocketException;

public class ZiRongYang {
	public static void main(String[] args) throws SocketException {
		new Thread(new ReceiveClient(8888,"座山雕")).start();
		new Thread(new TalkClient(5555, "localhost", 6666)) .start();
	}
}

座山雕

package networkCoding;

import java.net.SocketException;

public class ZuoShanDiao {
	public static void main(String[] args) throws SocketException {
		new Thread(new TalkClient(9999, "localhost", 8888)) .start();
		new Thread(new ReceiveClient(6666,"杨子荣")).start();
		}
}
发布了189 篇原创文章 · 获赞 10 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/wangrong111222/article/details/103192402
今日推荐