Java之网络编程(二)UDP

来源:互联网 发布:ios常用多线程编程组件 编辑:程序博客网 时间:2024/04/28 01:21
/**
 * 在java中网络通讯也称作为Socket(套接字)通讯,要求通讯的两台机器都必须安装Socket
 * 不同的协议有不同的Socket
 * 
 * UDP通讯协议的特点:
 * 1.将数据及其原源和目的封装为数据包,不需要建立连接
 * 2.每个数据包大小限制在64k
 * 3.因为无连接,所以不可靠
 * 4.因为不需要建立连接,所以速度快
 * 5.UDP通讯是不分服务端与客户端的,只分发送端与接收端
 * 如:人说话、CS等
 * 
 * TCP通讯协议的特点:
 * 1.面向连接,有特有的通道
 * 2.在连接中传输大数据量
 * 3.通过三次握手机制连接,可靠协议
 * 4.通信前必须建立连接,效率稍低
 * 如:打电话、文件的传送
 * 
 * UDP协议下的Socket:
 * DatagramSocket(UDP插座服务)
 *  DatagramPacket(数据包类)
 *   DatagramPacket(buf, length, address, port)
 *     buf:发送的是数据内容
 *     length:发送数据内容大小
 *       address:发送的目的IP地址对象
 *       pprt:端口号
 * 

 * */

一、实现接收端接收数据,发送端发送数据

package com.shuhuadream.udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;//UDP 接收端 接收数据public class MyReceiver {public static void main(String[] args) {try {//1.创建接收端对象DatagramSocket socket = new DatagramSocket(6565);//2.创建byte数组容器,封装为数据包用于存放数据byte[] buf = new byte[1024];DatagramPacket packet = new DatagramPacket(buf,buf.length);//3.调用UDP的服务接收数据socket.receive(packet);//receive是一个阻塞方法,没有接收到数据一直继续等待,数据实际上就是存储到了byte的字节数组中//4.处理数据System.out.println("发送端传来的数据:"+new String(buf,0,packet.getLength()));//5.关闭资源socket.close();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
package com.shuhuadream.udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;//UDP 发送端 发送数据public class MySender {public static void main(String[] args) {try {//1.创建发送端发送对象DatagramSocket socket = new DatagramSocket(7777);//2.准备数据,并将数据封装到数据包内String msg = "生当作人杰,死亦为鬼雄";byte[] data = msg.getBytes();DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getLocalHost(),6565);//3.调用udp服务发送数据包socket.send(packet);//4.关闭资源--实际上是释放占用的端口号socket.close();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

运行结果:

二、实现发送端单项多次给接收端发送信息

package com.shuhuadream.udp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;//发送端public class ChatSender {public static void main(String[] args) {try {//创建发送端对象DatagramSocket socket = new DatagramSocket(2443);//明确要发送的数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));while(true){String line = br.readLine();byte[] data = line.getBytes();//将数据打包DatagramPacket packet = new DatagramPacket(data,data.length,InetAddress.getByName("10.41.151.14"),6565);//发送数据socket.send(packet);if(line.equals("bye")){break;}}//关闭发送端资源br.close();socket.close();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}
package com.shuhuadream.udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.SocketException;//接收端public class ChatReceiver {public static void main(String[] args) {try {//1.创建接收端对象DatagramSocket socket = new DatagramSocket(6565);//2.创建byte数组容器,封装为数据包用于存放数据byte[] buf = new byte[1024];while(true){DatagramPacket packet = new DatagramPacket(buf,buf.length);//3.调用UDP的服务接收数据socket.receive(packet);//4.处理数据System.out.println(packet.getAddress().getHostAddress()+":"+new String(packet.getData(),0,packet.getLength()));}////5.关闭资源//socket.close();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}


三、开启线程实现两个客户端之间能够聊天

package com.shuhuadream.udp2;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;public class UDPSendThread extends Thread{private DatagramSocket socket;//发送端对象private InetAddress address;//目标地址private int port;//端口号public UDPSendThread(DatagramSocket socket, InetAddress address, int port) {super();this.socket = socket;this.address = address;this.port = port;}public void run() {//获取要发送的数据BufferedReader br = new BufferedReader(new InputStreamReader(System.in));while(true){try {String line = br.readLine();byte[] data = line.getBytes();//将数据打包DatagramPacket packet = new DatagramPacket(data,data.length,address,port);//发送数据socket.send(packet);} catch (IOException e) {e.printStackTrace();}}}}
package com.shuhuadream.udp2;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;public class UDPReceiverThread extends Thread{private DatagramSocket socket;//接收端对象public UDPReceiverThread(DatagramSocket socket) {super();this.socket = socket;}@Overridepublic void run() {while(true){//准备容器,封装为数据包用于存放数据byte[] buf = new byte[1024*16];DatagramPacket packet = new DatagramPacket(buf,buf.length);try {//接收数据socket.receive(packet);//处理数据System.out.println(packet.getAddress().getHostAddress()+":"+new String(packet.getData(),0,packet.getLength()));} catch (IOException e) {e.printStackTrace();}}}}
接下来两个客户端都开启接收和发送线程

客户端一:

package com.shuhuadream.udp2;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class UDPClient01 {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(8888);InetAddress address = InetAddress.getByName("10.41.151.14");//创建发送、接收线程UDPSendThread sendThread = new UDPSendThread(socket, address, 4444);UDPReceiverThread receiverThread = new UDPReceiverThread(socket);//开启线程sendThread.start();receiverThread.start();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();}}}

客户端二:

package com.shuhuadream.udp2;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;public class UDPClient02 {public static void main(String[] args) {try {DatagramSocket socket = new DatagramSocket(4444);InetAddress address = InetAddress.getByName("10.41.151.63");//创建发送、接收线程UDPSendThread sendThread = new UDPSendThread(socket, address, 8888);UDPReceiverThread receiverThread = new UDPReceiverThread(socket);//开启线程sendThread.start();receiverThread.start();} catch (SocketException e) {e.printStackTrace();} catch (UnknownHostException e) {e.printStackTrace();}}}

实验效果图:



原创粉丝点击