平时聊天都是在同一个窗口的,所以,这个窗口同时实现发送数据和接收数据,这时就需要多线程实现。

建立一个类:

  把聊天的发送端和接收端放在同一个类,启动一个窗口

 public class CharRoom {

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

             //创建socket发送对象和接收对象
DatagramSocket send = new DatagramSocket();
DatagramSocket receive = new DatagramSocket(10010); //用多线程同时运行2个
SendThread st = new SendThread(send);
ReceiveThread rt = new ReceiveThread(receive); Thread stThread = new Thread(st);
Thread rtThread = new Thread(rt); //启动线程
stThread.start();
rtThread.start(); }

再建立发送类:

  

 public class SendThread implements Runnable {

     // 构造传参
private DatagramSocket ds; public SendThread(DatagramSocket ds) {
this.ds = ds;
} public void run() { try { // 键盘输入的内容,进行数据打包
// 创建键盘输入对象,IO流
BufferedReader br = new BufferedReader(new InputStreamReader(
System.in));
// 读取输入的数据
String line = null;
while ((line = br.readLine()) != null) {
// 设定退出条件
if (line.endsWith("886")) {
break;
} // String转换成byte,打包
byte[] bys = line.getBytes();
// 发送数据
DatagramPacket dp = new DatagramPacket(bys, bys.length,
InetAddress.getByName("172.19.xx.xxx"), 10010); ds.send(dp); }
// 释放资源
ds.close(); }
// 处理异常
catch (IOException e) {
e.printStackTrace();
}
}
}

接收端:(要一直启动,所以无需释放资源)

 public class ReceiveThread implements Runnable {

     // 构造方法接收
private DatagramSocket ds; public ReceiveThread(DatagramSocket ds) {
this.ds = ds;
} // 接收数据
public void run() { try {
// 接收端一直启动
while (true) {
// 创建数据包
byte[] bys = new byte[1000];
DatagramPacket dp = new DatagramPacket(bys, bys.length); // 接收数据包
ds.receive(dp); // 解析数据包
String result = new String(dp.getData(), 0, dp.getLength());
// 获取发送端的机器名称
String name = dp.getAddress().getHostName(); // 打印到控制台
System.out.println("从" + name + "发送: " + result);
}
}
// 处理异常
catch (IOException e) {
e.printStackTrace();
} }
}

根据这些,建立GUI,再加优化,就可以做一个聊天室

java 25 - 5 网络编程之多线程实现聊天室的更多相关文章

  1. java 25 - 1 网络编程的概述

    网络编程概述 计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. ...

  2. Java 网络编程 -- 基于TCP 实现聊天室 群聊 私聊

    分析: 聊天室需要多个客户端和一个服务端. 服务端负责转发消息. 客户端可以发送消息.接收消息. 消息分类: 群聊消息:发送除自己外所有人 私聊消息:只发送@的人 系统消息:根据情况分只发送个人和其他 ...

  3. java 25 - 2 网络编程之 网络通信三要素

    网络通信三要素 IP地址: InetAddress 网络中设备的标识,不易记忆,可用主机名(计算机的标识号) 端口号: 用于标识进程的逻辑地址,不同进程的标识(正在运行的软件的标识号) 传输协议: 通 ...

  4. 黑马程序员:Java基础总结----网络编程

    黑马程序员:Java基础总结 网络编程   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 网络编程 网络通讯要素 . IP地址 . 网络中设备的标识 . 不易记忆,可用 ...

  5. 20165324 Java实验五 网络编程与安全

    20165324 Java实验五 网络编程与安全 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:何春江 学号:20165324 指导教师:娄嘉鹏 实验日期:2018年5月28日 实 ...

  6. Java学习:网络编程总结

    Java网络编程总结 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备( ...

  7. Java之HTTP网络编程(一):TCP/SSL网页下载

    目录 一.简介:HTTP程序设计 1.HTTP系统设计 2.HTTP客户端工作过程 3.HTTP服务端工作过程 二.基于TCP Socket的HTTP网页下载 三.基于SSL Socket的HTTPS ...

  8. Java学习之网络编程实例

    转自:http://www.cnblogs.com/springcsc/archive/2009/12/03/1616413.html 多谢分享 网络编程 网络编程对于很多的初学者来说,都是很向往的一 ...

  9. Java进阶之网络编程

    网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...

随机推荐

  1. JSOM 中对各种字段操作

     function createListItem() {     var clientContext = new SP.ClientContext(_spPageContextInfo.siteAbs ...

  2. BiliBili 第三方 Android 客户端应用源码

    基于 Material Design 的 BiliBili 第三方 Android 客户端,我们知道这个APP目前比较流行,所以大家也比较喜欢模仿,需要的参考一下 文档共享 : https://dri ...

  3. 【读书笔记】iOS-ARC-环境下如何查看引用计数的变化

    一,新建立一个工程,用于测试引用计数的变化. 二,找到如下路径Build Phases---->Compile Sources---->AppDelegate.m 三,选中AppDeleg ...

  4. JavaScript Patterns 5.4 Module Pattern

    MYAPP.namespace('MYAPP.utilities.array'); MYAPP.utilities.array = (function () { // dependencies var ...

  5. Review 代码

    最近需要 Review 代码,学习了<代码整洁之道>.<代码质量>等书籍. 把对这些代码之道的学习心得整理成文

  6. Linux笔试常见填空题

    一.填空题: 在Linux系统中,以 文件 方式访问设备 . Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. Linux文件系统中每个文件用 i节点 来标识. 全部磁盘块 ...

  7. eclipse 启动报错\workspace\.metadata\.log

    eclipse启动报错,让查看.metadata\.log日志 eclipse启动不了,让查看.metadata\.log日志,上面为日志中的错误提示. 解决办法:删除 .metadata\.plug ...

  8. SQLITE配置环境变量

      SQLITE配置环境变量和Java的配置其实是一样的,不过好像每个人配的时候不完全相同, 有的机器可以,另外一些机器同样的方法却行不通,总之思路是一样的多试几种,总有合适的参数 下面是我在配置时截 ...

  9. 在Ubuntu上安装docker常见问题

    安装完docker之后,发现docker是装好了,但是运行docker就会报“Segmentation Fault or Critical Error encountered. Dumping cor ...

  10. HTML 头部标记

    HTML头部标记放在<head></head>中,一般包括标题.基底信息.元信息等. <base>        当前文档的URL全称(基底网址) <base ...