Java基础知识强化之网络编程笔记05:UDP之多线程实现聊天室案例
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之多线程实现聊天室案例相关推荐
- Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...
1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...
- Java基础知识强化之网络编程笔记04:UDP之发送端的数据来自于键盘录入案例
1. 数据来自于键盘录入 键盘录入数据要自己控制录入结束. 2. 代码实现: (1)发送端: 1 package com.himi.updDemo1; 2 3 import java.io.IOExc ...
- Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源 UDP协议接 ...
- Java基础知识强化之集合框架笔记76:ConcurrentHashMap之 ConcurrentHashMap简介
1. ConcurrentHashMap简介: ConcurrentHashMap是一个线程安全的Hash Table,它的主要功能是提供了一组和Hashtable功能相同但是线程安全的方法.Conc ...
- 【Linux网络编程】基于UDP实现多人聊天室
文章目录 一.UDP的概念 1.1 UDP 1.2 UDP特点 二. 采用UDP实现多人聊天室原因 三.多人聊天室项目功能 四.实现多人聊天室项目流程分析 4.1 前期准备 4.1.1 定义结构体 4 ...
- Java基础知识强化之IO流笔记03:throws的方式处理异常
1. 什么时候使用throws ? (1)定义功能方法时候,需要把出现的问题暴露出来,让调用者去处理.那么就通过throws在方法上标识. (2)有时候,我们是可以对异常进行处理的,但是又有些时候,我 ...
- Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)...
1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中 数据源: a.txt -- 读取数据 ...
- Java基础知识强化之IO流笔记32:转换流之OutputStreamWriter的使用
1. OutputStreamWriter的使用 OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 OutputStreamWriter ...
- Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMapString,Student)的案例...
1. HashMap集合(HashMap<String,Student>)的案例 HashMap是最常用的Map集合,它的键值对在存储时要根据键的哈希码来确定值放在哪里. HashMap的 ...
最新文章
- 3、ACE-实用生活口语---讲打电话Talking on the phone
- 能跑java的服务器_一台java服务器可以跑多少个线程?
- 干货!这可能是最全的IntelliJ IDEA For Mac快捷键说明,建议收藏!
- Python学习入门基础教程(learning Python)--1.2.1 Python输出语句print基本使用 .
- matlab的syntax简记
- 关于python的垃圾回收机制_Python的垃圾回收机制
- Day9-HTML body属性
- 在Ubuntu18.04上安装Nvidia驱动
- 向园子里的朋友探讨一个问题:如果判定一个对象已被处置
- FileInputStream实现读取文件内容并输出到屏幕上
- BootDo平台数据库使用Oracle
- 数值计算之第二期:误差分析
- setSingleChoiceItems和setPositiveButton两者触发时期
- SEO网站内容优化的6点干货分享分享-飞鱼SEO
- NIO核心设计与原理
- WordPress 实战:在wordpress文章中加入分享到微博及社交网站的按钮(代码实现,非插件)
- signal函数详细用法
- servicecomb-pack
- Silverlight5_Tools安装出错解决办法
- 【CSS 教程系列第 13 篇】什么是 CSS 中的通配符选择器
热门文章
- android怎样判断插入数据是否成功_MySQL一个表的自增id用完了,背井大佬让我用这些姿势再往里插数据...
- 深度优先搜索重要模板
- nfc sim android8,Android NFC相关资料之MifareClassic卡(读写)
- 基于javaweb(springboot+mybatis)网站建设服务管理系统设计和实现以及文档报告设计
- c语言程序设计实验实训教程公众号,C语言程序设计基础知道答案公众号
- 新版opencv兼容旧版_【标准换版】关于家用和类似用途电器用外置电源适配器、充电器和内置开关电源产品认证执行新版标准的通知...
- android无法自动旋屏,Android 手动设置屏幕方向后不能自动转屏问题
- 马匹赛跑java_java模拟龟兔赛跑
- MySql数据类型介绍
- 手把手教你爬虫requests实战演练——python篇