需求:通过UDP传输方式,实现一个简单的控制台聊天程序
思路:
发送端:
1.建立UDP的socket服务
2.提供数据 并将数据封装到数据包中
3.通过socket服务的发送功能将数据包发出
4.关闭资源
接收端:
1.建立UDP的socket服务,设置端口号
2.定义一个数据包,存储接收到的字节数据
3.将受到的数据存入已定义好的数据包中
4.通过数据包对象的特有功能,将不同的数据取出,打印在控制台上
5.关闭资源
代码实现:
发送端:
/*
这是一个发送线程类
*/
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class Send implements Runnable{
Scanner sc = new Scanner(System.in);
private DatagramSocket ds; //建立一个Socket引用
//通过构造方法接受一个Socket对象
public Send(DatagramSocket ds)
{
this.ds = ds;
}
@Override
public void run(){
while (sc.hasNext())
{
try {
String str = sc.next(); //输入内容
byte[] buf = str.getBytes(); //输入内容的字节缓冲转化
/*建立一个数据包,封装要发送的数据
指定参数为字节缓冲数组,数据长度,目的ip地址,目的端口号
*/
DatagramPacket dp = new DatagramPacket(buf,buf.length,
InetAddress.getByName("192.168.0.255"),11000);
ds.send(dp);//通过send方法将数据包发送出去
}
catch (Exception e)
{
throw new RuntimeException();
}
}
//关闭资源
sc.close();
ds.close();
}
}
接收端:
/*
这是一个接收线程类
*/
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class Receive implements Runnable{
private DatagramSocket ds;//建立一个Socket引用
//通过构造方法接受一个Socket对象
public Receive(DatagramSocket ds)
{
this.ds = ds;
}
public void run() {
while (true)
{
//创建一个字节缓冲数组,用于接收数据
byte buf[] = new byte[1024];
//创建一个数据包对象,用于存储数据
DatagramPacket dp = new DatagramPacket(buf,buf.length);
try {
//使用receive方法 将接受的数据存入包中
ds.receive(dp);
} catch (IOException e) {
e.printStackTrace();
}
//获取包中的ip地址对象中的ip地址
String ip = dp.getAddress().getHostAddress();
//以字符串的形式获取对方发送的数据
String data = new String(dp.getData(),0,dp.getLength());
//打印到控制台上
System.out.println(ip+"说: "+data);
}
}
}
测试类:
/*
开启线程的测试类
*/
import java.net.DatagramSocket;
public class Main {
public static void main(String[] args) throws Exception{
//创建一个发送端的Socket对象(随机端口)
DatagramSocket sendSocket = new DatagramSocket();
//创建一个接收端的Socket对象(指定端口为11000)
DatagramSocket receiveSocket = new DatagramSocket(11000);
/*
开启线程
等价于:
Send s = new Send(sendSocket);
创建发送线程类对象,通过构造方法传入发送端Socket对象
Thread tSend = new Thread(s); 创建发送线程对象
tSend.start(); 开启发送线程
Receive r = new Receive(receiveSocket);
创建发送线程类对象,通过构造方法传入发送端Socket对象
Thread tReceive = new Thread(r); 创建发送线程对象
tReceive.start(); 开启发送线程
*/
new Thread(new Send(sendSocket)).start();
new Thread(new Receive(receiveSocket)).start();
}
}
总结:
- 该练习是通过UDP协议的网络通信,是无连接的传输方式。
- 通过发送/接受数据报/包的套接字类DatagramSocket,以及数据报包类DatagramPacket实现数据封包、拆包。
- 该练习是通过两个线程实现发送数据、接收数据同时进行。
- 在程序中涉及到IOException,SocketException和UnknownHostException等异常。