/**
* 在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:端口号
*
运行结果:
三、开启线程实现两个客户端之间能够聊天
客户端二:
实验效果图:
* 在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;
}
@Override
public 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();
}
}
}
实验效果图: