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

建立一个类:

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

 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. Java学习之网络编程实例

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

  5. Java进阶之网络编程

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

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

    1. 通过多线程改进刚才的聊天程序,这样我就可以实现在一个窗口发送和接收数据了 2.  代码示例: (1)SendThread.java,如下: package com.himi.udpDemo2; ...

  7. java基础知识——网络编程、IO流

    IO流 字节流:处理字节数据的流对象,计算机中最小数据单元就是字节.InputStream OutputStream 字符流:字符编码问题,将字节流和编码表封装成对象就是字符流.Reader Writ ...

  8. Java中的网络编程

    ​ Java中的网路编程主要是Java的Socket编程,属于JavaEE中的高级的部分,以下内容是对java网路编程的一个小结,代码都是经过编译调试的 C/S程序应用:客户/服务器模式,如QQ客户端 ...

  9. Java基础之网络编程

    网络编程:1.网络编程概述 (1)网络模型 OSI参考模型 TCP/IP参考模型 (2)网络通讯要素 IP地址 端口号 传输协议 (3)网络通讯前提: **找到对方IP **数据要发送到指定端口.为了 ...

随机推荐

  1. bzoj3744 Gty的妹子序列

    我是萌萌的传送门 感觉这题还是不错的--虽然其实算是比较水的题= = 首先分块,令f[i][j]表示第i块到第j块的逆序对数,询问的时候直接计算不完整块与完整块以及不完整块之间的逆序对. 不完整块之间 ...

  2. front-end plugin, generate pdf with html5 and jquery

    http://www.jqcool.net/jquery-jspdf.html[from this site] <html> <head></head> <s ...

  3. linux sort,uniq,cut,wc命令详解

    linux sort,uniq,cut,wc命令详解 sort sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出.如果 File 参数指定多个文件,那么 sort 命令将这些 ...

  4. iOS 杂笔-23(区分各种空值)

    iOS 杂笔-23(区分各种空值) nil是一个对象指针为空 Nil是一个类指针为空 NULL是基本数据类型为空 NSNull空对象(是可以放在数组里的)

  5. nginx 学习笔记(9) 配置HTTPS服务器--转载

    HTTPS服务器优化SSL证书链合并HTTP/HTTPS主机基于名字的HTTPS主机带有多个主机名的SSL证书主机名指示兼容性 配置HTTPS主机,必须在server配置块中打开SSL协议,还需要指定 ...

  6. python核心编程第六章练习6-14

    随机数.设计一个“石头.剪子.布”游戏,有时又叫“Rochambeau”,你小时候可能玩过,下面是规则.你和你的对手,在同一时间做出特定的手势,必须是下面一种:石头.剪子.布.胜利者从下面的规则产生, ...

  7. MAC OS设置JDK小结

    开始折腾mac pro,在网上找了些资料,自己也尝试了一下,特在这里做个小结. mac中JDK的位置 OSX默认的JDK /System/Library/Frameworks/JavaVM.frame ...

  8. VS2010设置C++包含目录和库目录

    视图-属性管理器-随便选择一个项目例如MyProject-Debug|Win32-Microsoft.Cpp.Win32.user-右键“属性”-VC++目录 Release同理

  9. if条件语句

    第四天 XMind 思维导图复习之前知识 数据类型-变量常量-运算符(表达式)-语句(顺序.分支.循环)-数组-函数 1.if语句格式 if(表达式) { 语句 } 注意: 1.如果,表达式成立,只执 ...

  10. js里面引入js

    document.write('<script src="http://js.xcar.com.cn/bbs/sidebar/js/publicSidebar.js"> ...