文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java网络编程实例——简单模拟在线聊天

2024-04-02 19:55

关注

1、前提知识

需要知道简单的IO流操作,以及简单的UDP发送数据包的原理。

需要用到的类:DatagramSocket、DatagramPacket

UDP数据包基于DatagramSocket发送和接收,DatagramPacket用于封装数据包

看下案例:

客户端发送消息:

正常情况下从控制台读信息,封装到DatagramPacket之中,再由DatagramSocket的send方法发出

读取到bye的时候退出聊天


public class UdpOnlineClient {

    public static void main(String[] args) throws IOException {
        
        DatagramSocket socket = new DatagramSocket(10000);

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));

        while (true) {

            String data = bufferedReader.readLine();
            byte[] datas = data.getBytes();

            DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 9999));

            socket.send(packet);

            if (data.equals("bye")){
                break;
            }

        }
        socket.close();
    }

}

服务端接收消息:

DatagramSocket的receive方法接收客户端发送的消息,打印到控制台,如果信息是bye则退出聊天


public class UdpOnlineServer {

    public static void main(String[] args) throws IOException {

        DatagramSocket socket = new DatagramSocket(9999);

        while (true){

            byte[] buffer = new byte[1024];

            DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

            socket.receive(packet);
            String msg = new String(packet.getData(), 0, packet.getLength());

            System.out.println(msg);

            if(msg.equals("bye")){
                break;
            }
        }
        socket.close();

    }

}

试验:正常开启客户端和服务端后:

客户端发送消息:

服务端接收到信息即成功:

有了这个思路,我们只需要把发送和接收封装成发送类和接收类,使用多线程即可实现聊天了

2、实现思路:

创建UDP发送实现类TaskSend、UDP接收实现类TaskReceive,以及模拟多线程通信的通信类ChatThread1、ChatThread2

UDP发送实现类TaskSend:


public class TaskSend implements Runnable{
	
    private String sendIP;
    //自己的服务端口
    private int ownPort;
    private int sendPort;
    //读取控制台输入流
    private BufferedReader bufferedReader;
    private DatagramSocket socket;

    public TaskSend(String sendIP, int ownPort, int sendPort) {
        this.sendIP = sendIP;
        this.sendPort = sendPort;
        try {
            socket = new DatagramSocket(ownPort);
            bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        } finally {
        }
    }

    //发送消息
    public void run() {
        while (true) {

            try {
                String data = bufferedReader.readLine();
                //打印自己的消息
                System.out.println("我:"+data);
                byte[] datas = data.getBytes();

                DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,new InetSocketAddress(sendIP,sendPort));

                socket.send(packet);
                if (data.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
        }
        socket.close();
    }
}

UDP接收实现类TaskReceive:


public class TaskReceive implements Runnable{

    private int ownPort;
    //发送信息的人
    private String msgOwner;
    private DatagramSocket socket;

    public TaskReceive(int ownPort, String msgOwner) {
        this.msgOwner = msgOwner;
        try {
            socket = new DatagramSocket(ownPort);
        } catch (SocketException e) {
            e.printStackTrace();
        } finally {
        }
    }
	
    //接收消息
    public void run() {
        while (true) {
            try {
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
                socket.receive(packet);
                String msg = new String(packet.getData(), 0, packet.getLength());
                System.out.println(msgOwner+":"+msg);

                if (msg.equals("bye")) {
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
            }
        }
        socket.close();
    }
}

之后使用两个通信类开启多线程模拟一下:

模拟老师


public class ChatThread1 {

    public static void main(String[] args) {
        new Thread(new TaskSend("localhost",9999,10000)).start();
        new Thread(new TaskReceive(9998,"老师")).start();
    }

}

模拟学生


public class ChatThread2 {

    public static void main(String[] args) {

        new Thread(new TaskReceive(9999,"学生")).start();
        new Thread(new TaskSend("localhost",9998,10001)).start();
    }

}

实例:

学生

老师

到此简单的在线聊天功能就完成了,可以巩固一下之前学习的网络知识

以上就是Java网络编程实例——简单模拟在线聊天的详细内容,更多关于Java 模拟在线聊天的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯