项目功能:

实现了多线程下的发送接收,比较好

希望可以加入GUI,类似聊天软件一样,有一个消息输入框,捕获输入消息,作为发送线程

                  有一个显示消息框,接收消息并显示,作为接收线程

不知道的是,当在线程中使用UI的gettext(),settext()时,是否子线程和UI线程冲突,赶紧学习下。

代码:

 import java.net.*;
import java.io.*;
/*
编写一个聊天程序。
有收数据的部分,和发数据的部分。
这两部分需要同时执行。
那就需要用到多线程技术。
一个线程控制收,一个线程控制发。 因为收和发动作是不一致的,所以要定义两个run方法。
而且这两个方法要封装到不同的类中。 */
class Send implements Runnable
{
private DatagramSocket ds;
//构造方法
public Send(DatagramSocket ds){
this.ds=ds;
} public void run() { try{
//使用控制台输入
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line =null; while((line=bufr.readLine())!=null){ byte[] buf =line.getBytes();
DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.103"),10005); ds.send(dp);
//如果输入内容是"886",跳出循环
if("886".equals(line))
break;
} //4.关闭连接
ds.close(); }catch(Exception e){
throw new RuntimeException("发送端失败");
}
}
} class Recv implements Runnable
{
private DatagramSocket ds;
//构造方法
public Recv(DatagramSocket ds){
this.ds=ds;
} public void run() {
try{
while(true){
//2,创建数据包
byte[] buf =new byte[1024];
DatagramPacket dp =new DatagramPacket(buf,buf.length); //3,使用接收的方法将数据包存储到数据包中
ds.receive(dp);//阻塞式 //4.通过数据包对象的方法,解析其中的数据,比如端口,地址,内容等
String ip = dp.getAddress().getHostAddress();
int port = dp.getPort();
String content = new String(dp.getData(),0,dp.getLength());
System.out.println(ip+"::" +port+":"+content);
if(content.equals("886")){
System.out.println(ip+"有人退出..." );
break;
} }
//满足886跳出循环后,退出
ds.close();
}catch(Exception e){
throw new RuntimeException("接收端失败");
}
}
} public class ChatDemo
{
public static void main(String[] args) throws IOException{
DatagramSocket send =new DatagramSocket(); DatagramSocket recv =new DatagramSocket(10005); new Thread(new Send(send)).start();
new Thread(new Recv(recv)).start();
}
}

注意:Send、Recv类前面是不能加修饰符public的,否则会报错

毕向东udp学习笔记3多线程聊天的更多相关文章

  1. 毕向东udp学习笔记1

    参看了毕向东老师的视频教程,准备直接用EditPlus记事本来直接敲Java代码,好好学习一下udp部分,GUI部分,线程部分,加油 项目功能: 实现udp简单的发送接收功能. 当使用EditPlus ...

  2. 毕向东udp学习笔记2

    项目功能:  发送端读取控制台输入,然后udp发送 接收端一直接收,直到输入为886 相对于笔记1,修改了发送端代码,实现发送控制台的内容,接收端循环接收,当输入886时,停止发送 发送端: impo ...

  3. 毕向东tcp学习笔记1

    项目功能: 实现一次发送和接收,服务器接收客户端发送的内容并打印出来 用最通俗的语言讲解下,上图中大椭圆是服务器,A.C是客户端,当客户端和服务器通过socket建立连接后 1.两者之间形成一个通道, ...

  4. 孙鑫VC学习笔记:多线程编程

    孙鑫VC学习笔记:多线程编程 SkySeraph Dec 11st 2010  HQU Email:zgzhaobo@gmail.com    QQ:452728574 Latest Modified ...

  5. NDK学习笔记-JNI多线程

    前面讲到记录到ffmpeg音视频解码的时候,采用的是在主线程中进行操作,这样是不行的,在学习了POSIX多线程操作以后,就可以实现其在子线程中解码了,也可以实现音视频同步了 简单示例 在native实 ...

  6. Python Web学习笔记之多线程编程

    本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...

  7. 学习笔记-java 多线程

    背景说明: 多线程并发与管理,是java基础知识里的重点,本文根据<java核心技术第八版>中的多线程技术的学习,对知识点进行整理:这里只对基础知识点进行简单罗列,以达到对知识点有网状关联 ...

  8. Java基础学习笔记: 多线程,线程池,同步锁(Lock,synchronized )(Thread类,ExecutorService ,Future类)(卖火车票案例)

    多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念.进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线 ...

  9. JUC学习笔记--Thread多线程基础

    实现多线程的两种方法 java 实现多线程通过两种方式1.继承Thread类 ,2.实现Runnable接口 class Newthead extends Thread{ public void ru ...

随机推荐

  1. VS2010打开旧版本MFC工程无对话框

    解决方案: 左侧有个"资源视图",打开,里面就能找得到对话框,如果没有资源视图,就在菜单的视图选项里打开资源视图!

  2. EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)

    源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计

  3. iOS制作毛玻璃效果

    //添加一个图片 UIImageView *imageview = [[UIImageView alloc]init]; imageview.frame = CGRectMake(10, 100, 3 ...

  4. js - AO链 与 function

    先来看一下demo,如果你已经看出三个console.log分别输出什么.那直接关闭此笔记 function t(age) { console.log(age); var age = 99; cons ...

  5. doxygen 生成源码文档

    使用doxygen 生成源代码的文档是相当方便的,本文就简单整理下doxygen的使用说明 1. 安装 关于安装的问题不做特殊的说明,这里直接使用命令安装, 源码安装不做介绍 ubuntu: sudo ...

  6. eclipse 如何debug jdk源码(转)

    转:http://blog.csdn.net/cherrycheng_/article/details/51004386 原英文地址:http://stackoverflow.com/question ...

  7. JS 中 Class - 类创建

    Class - 类创建 Class类实现了在JavaScript中声明一个新的类, 并通过构造函数实例化这个类的机制.通过使用Class.create()方法, 你实际上声明了一个新的类, 并定义了一 ...

  8. 创建sqlserver函数

    CREATE FUNCTION getsort (@first varchar(100),@second varchar(100))RETURNS  intASBEGIN declare @rv in ...

  9. 报错:Can't bind to local 8647 for debugger

    修改8600为8601,并且勾上Use ADBHOST

  10. 详解Grunt插件之LiveReload实现页面自动刷新(两种方案)

    http://www.jb51.net/article/70415.htm    含Grunt系列教程 这篇文章主要通过两种方案详解Grunt插件之LiveReload实现页面自动刷新,需要的朋友可以 ...