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

建立一个类:

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

 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 25 - 2 网络编程之 网络通信三要素

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

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

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

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

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

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

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

  6. Java进阶之网络编程

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

  7. 第84节:Java中的网络编程(中)

    第84节:Java中的网络编程(中) 实现客户端和服务端的通信: 客户端需要的操作,创建socket,明确地址和端口,进行键盘录入,获取需要的数据,然后将录入的数据发送给服务端,为socket输出流, ...

  8. 第78节:Java中的网络编程(上)

    第78节:Java中的网络编程(上) 前言 网络编程涉及ip,端口,协议,tcp和udp的了解,和对socket通信的网络细节. 网络编程 OSI开放系统互连 网络编程指IO加网络 TCP/IP模型: ...

  9. 第62节:探索Java中的网络编程技术

    前言 感谢! 承蒙关照~ 探索Java中的网络编程技术 网络编程就是io技术和网络技术的结合,网络模型的定义,只要共用网络模型就可以两者连接.网络模型参考. 一座塔有七层,我们需要闯关. 第一层物理层 ...

随机推荐

  1. CSS字符编码引起乱码

    乱码引起的CSS失效原理:     由于一个中文是两个字符组成,在编码不一致的情况下会引发字符的“重新”组合,(半个汉字的编码字符与后面的字符组合生成新的“文字”)引发原本的结束符合“变异”,从而导致 ...

  2. Codeforces Round #368 (Div. 2)A B C 水 图 数学

    A. Brain's Photos time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  3. 文本框限制输入类型<input>的输入框

    最近在开发完一个项目后,又测试人员测试bug,然后我根据他们测试出来的bug一个一个的改,然后就遇到了一个问题,文本框是用来搜索,但是,比如这个文本框是用来搜索年龄的区间,输入条件的时候,如果输入了非 ...

  4. 数据库存储过程 — Sql Server

    Mysql.Oracle等主流关系型数据库基本都支持存储过程,这里使用Sql Server为例进行说明. 存储过程的概念: Sql Server存储过程 SQL Server 中的存储过程是由一个或多 ...

  5. Hadoop 7、MapReduce执行环境配置

    MR执行环境有两种:本地测试环境,服务器环境 本地测试环境(windows,用于测试) 1.下载Winddows版的Hadoop程序,解压后在Hadoop目录的bin目录放置一个winutils.ex ...

  6. 关于t00ls的挂机脚本

    0x00 前言 今天早上发现t00ls上有人发了个挂机脚本,二十四小时刷时间以及刷Tubi. 轻轻松松升级,坐收Tubi成富翁. 代码很简单,就是带上cookie每隔一段时间(比如60秒)去请求一下某 ...

  7. Linux下Oracle client客户端安装

    0.zip格式 (0)下载地址: a.Oracle官网 (1)安装过程: a.将zip文件分别解压到/software/下,放在同一个目录instandclient_11_2/下 b.在/softwa ...

  8. Oracle创建表空间、表、一级用户授权

    ---恢复内容开始--- 1. 安装: 百度一下你就知道 2. sqlplus登录/sqlplus命令登录 在安装Oracle时,你需要记住设置的“全局数据库名”(默认为orcl) 和 口令,在以两种 ...

  9. hadoop:如何运行自带wordcount

    1.在linux系统创建文件 vi aa.txt   --------i 进行编辑  输入  内容(多个单词例如:aa bb cc aa) 2.在HDFS上面创建文件夹 hdfs dfs -mkdir ...

  10. javascript 函数的4种调用模式

    1. 函数模式 // this 指向 window 全局对象 2. 方法模式 // this 指向调用这个方法的对象 3. 构造函数模式 // this 指向 new 新创建出来的实例 4. 上下文模 ...