【网络编程】练习——UDP协议控制台聊天程序

需求:通过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();
    }

}

总结:

  1. 该练习是通过UDP协议的网络通信,是无连接的传输方式。
  2. 通过发送/接受数据报/包的套接字类DatagramSocket,以及数据报包类DatagramPacket实现数据封包、拆包。
  3. 该练习是通过两个线程实现发送数据、接收数据同时进行。
  4. 在程序中涉及到IOException,SocketException和UnknownHostException等异常。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值