JAVA网络编程 -UDP篇(简单实现网络聊天)

本文介绍了一种使用UDP协议实现的网络聊天室系统。系统通过两个独立的多线程——发送线程和接收线程,实现了客户端之间的即时消息传递。发送线程负责将用户输入的消息打包并发送给指定的目标IP和端口,而接收线程则负责监听特定端口,接收来自其他客户端的消息。

通过UDP实现网络聊天

多线程实现UDP网络聊天

1. 编写UDP发送线程UdpSendThread


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;

public class UdpSendTread implements Runnable{
    DatagramSocket datagramSocket = null;
    BufferedReader bufferedReader = null;
    InetSocketAddress inetSocketAddress = null;

    public UdpSendTread(int fromPort, int toPort, String toIp) {
        // 创建 upd socket
        try {
            // 指定当前用户的Socket端口
            datagramSocket = new DatagramSocket(fromPort);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        // 创建读入流
        bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        // 发送信息的目标ip地址和端口号
        inetSocketAddress = new InetSocketAddress(toIp, toPort);
    }


    @Override
    public void run() {
        while (true) {
            try {
                // 读入行
                System.out.println(datagramSocket.getLocalSocketAddress() + ": ");
                String data = bufferedReader.readLine();
                byte[] datas = data.getBytes();
                // 创建udp发送包
                DatagramPacket datagramPacket = new DatagramPacket(datas, datas.length, inetSocketAddress);
                // udp 发送
                datagramSocket.send(datagramPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2. 编写UDP接受线程 UdpReceiveThread


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

public class UdpReceiveTread implements Runnable {

    DatagramSocket datagramSocket = null;

    public UdpReceiveTread(int port) {
        // 当其用户socket端口
        try {
            datagramSocket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                // 创建接受udp socket包
                byte[] container = new byte[1024];
                DatagramPacket datagramPacket = new DatagramPacket(container, container.length);
                // 阻塞式接受udp数据
                datagramSocket.receive(datagramPacket);
                // DatagramPacket 获取接受到的数据
                byte[] data = datagramPacket.getData();
                // byte 转换 String 并输出
                String string = new String(data, 0, data.length);
                System.out.println(datagramSocket.getLocalSocketAddress() + ":" + string);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3. 编写用户1 Costomer_1

public class Costomer_1 {
    public static void main(String[] args) {
        // Udp 发送线程
        UdpSendTread sendTread = new UdpSendTread(8888, 9999, "127.0.0.1");
        // Udp 接受线程
        UdpReceiveTread receiveTread = new UdpReceiveTread(7777);
        new Thread(sendTread).start();
        new Thread(receiveTread).start();
    }
}

4. 编写用户2 Constomer_2

public class Costomer_2 {
    public static void main(String[] args) {
        // Udp 发送线程
        UdpSendTread sendTread = new UdpSendTread(6666, 7777, "127.0.0.1");
        // Udp 接受线程
        UdpReceiveTread receiveTread = new UdpReceiveTread(9999);
        new Thread(sendTread).start();
        new Thread(receiveTread).start();
    }
}

注意,用户类中的发送线程fromPort != 接受线程的port

5. 结果

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值