1. 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了

2.  代码示例:

(1)SendThread.java,如下:

 1 package com.himi.udpDemo2;
 2
 3 import java.io.BufferedReader;
 4 import java.io.IOException;
 5 import java.io.InputStreamReader;
 6 import java.net.DatagramPacket;
 7 import java.net.DatagramSocket;
 8 import java.net.InetAddress;
 9
10 public class SendThread implements Runnable {
11
12     private DatagramSocket ds;
13
14     public SendThread(DatagramSocket ds) {
15         this.ds = ds;
16     }
17
18     public void run() {
19         try {
20             // 封装键盘录入数据
21             BufferedReader br = new BufferedReader(new InputStreamReader(
22                     System.in));
23             String line = null;
24             while ((line = br.readLine()) != null) {
25                 if ("886".equals(line)) {
26                     break;
27                 }
28
29                 // 创建数据并打包
30                 byte[] bys = line.getBytes();
31                 // DatagramPacket dp = new DatagramPacket(bys, bys.length,
32                 // InetAddress.getByName("192.168.12.92"), 12345);
33                 DatagramPacket dp = new DatagramPacket(bys, bys.length,
34                         InetAddress.getByName("49.123.72.145"), 12306);
35
36                 // 发送数据
37                 ds.send(dp);
38             }
39
40             // 释放资源
41             ds.close();
42         } catch (IOException e) {
43             e.printStackTrace();
44         }
45     }
46
47 }

(2)ReceiveThread.java,如下:

 1 package com.himi.udpDemo2;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6
 7 public class ReceiveThread implements Runnable {
 8     private DatagramSocket ds;
 9
10     public ReceiveThread(DatagramSocket ds) {
11         this.ds = ds;
12     }
13
14     public void run() {
15         try {
16             while (true) {
17                 // 创建一个包裹
18                 byte[] bys = new byte[1024];
19                 DatagramPacket dp = new DatagramPacket(bys, bys.length);
20
21                 // 接收数据
22                 ds.receive(dp);
23
24                 // 解析数据
25                 String ip = dp.getAddress().getHostAddress();
26                 String s = new String(dp.getData(), 0, dp.getLength());
27                 System.out.println("from " + ip + " data is : " + s);
28             }
29         } catch (IOException e) {
30             e.printStackTrace();
31         }
32     }
33
34 }

(3)聊天室程序CharRoom.java,调用上面两个线程工具类,代码如下:

 1 package com.himi.udpDemo2;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramSocket;
 5
 6 /*
 7  * 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了
 8  */
 9 public class ChatRoom {
10     public static void main(String[] args) throws IOException {
11         DatagramSocket dsSend = new DatagramSocket();
12         DatagramSocket dsReceive = new DatagramSocket(12306);
13
14         SendThread st = new SendThread(dsSend);
15         ReceiveThread rt = new ReceiveThread(dsReceive);
16
17         Thread t1 = new Thread(st);
18         Thread t2 = new Thread(rt);
19
20         t1.start();
21         t2.start();
22     }
23 }

运行效果如下:

转载于:https://www.cnblogs.com/hebao0514/p/4859593.html

Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例相关推荐

  1. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...

    1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...

  2. Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例

    1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: 1 package com.himi.updDemo1; 2 3 import java.io.IOExc ...

  3. Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

    1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接 ...

  4. Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介

    1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...

  5. 【Linux网络编程】基于UDP实现多人聊天室

    文章目录 一.UDP的概念 1.1 UDP 1.2 UDP特点 二. 采用UDP实现多人聊天室原因 三.多人聊天室项目功能 四.实现多人聊天室项目流程分析 4.1 前期准备 4.1.1 定义结构体 4 ...

  6. Java基础知识强化之IO流笔记03:throws的方式处理异常

    1. 什么时候使用throws ? (1)定义功能方法时候,需要把出现的问题暴露出来,让调用者去处理.那么就通过throws在方法上标识. (2)有时候,我们是可以对异常进行处理的,但是又有些时候,我 ...

  7. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)...

    1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中  数据源: a.txt -- 读取数据 ...

  8. Java基础知识强化之IO流笔记32:转换流之OutputStreamWriter的使用

    1. OutputStreamWriter的使用 OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 OutputStreamWriter ...

  9. Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMapString,Student)的案例...

    1. HashMap集合(HashMap<String,Student>)的案例 HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap的 ...

最新文章

  1. 3、ACE-实用生活口语---讲打电话Talking on the phone
  2. 能跑java的服务器_一台java服务器可以跑多少个线程?
  3. 干货!这可能是最全的IntelliJ IDEA For Mac快捷键说明,建议收藏!
  4. Python学习入门基础教程(learning Python)--1.2.1 Python输出语句print基本使用 .
  5. matlab的syntax简记
  6. 关于python的垃圾回收机制_Python的垃圾回收机制
  7. Day9-HTML body属性
  8. 在Ubuntu18.04上安装Nvidia驱动
  9. 向园子里的朋友探讨一个问题:如果判定一个对象已被处置
  10. FileInputStream实现读取文件内容并输出到屏幕上
  11. BootDo平台数据库使用Oracle
  12. 数值计算之第二期:误差分析
  13. setSingleChoiceItems和setPositiveButton两者触发时期
  14. SEO网站内容优化的6点干货分享分享-飞鱼SEO
  15. NIO核心设计与原理
  16. WordPress 实战:在wordpress文章中加入分享到微博及社交网站的按钮(代码实现,非插件)
  17. signal函数详细用法
  18. servicecomb-pack
  19. Silverlight5_Tools安装出错解决办法
  20. 【CSS 教程系列第 13 篇】什么是 CSS 中的通配符选择器

热门文章

  1. android怎样判断插入数据是否成功_MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据...
  2. 深度优先搜索重要模板
  3. nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)
  4. 基于javaweb(springboot+mybatis)网站建设服务管理系统设计和实现以及文档报告设计
  5. c语言程序设计实验实训教程公众号,C语言程序设计基础知道答案公众号
  6. 新版opencv兼容旧版_【标准换版】关于家用和类似用途电器用外置电源适配器、充电器和内置开关电源产品认证执行新版标准的通知...
  7. android无法自动旋屏,Android 手动设置屏幕方向后不能自动转屏问题
  8. 马匹赛跑java_java模拟龟兔赛跑
  9. MySql数据类型介绍
  10. 手把手教你爬虫requests实战演练——python篇