当前课程知识点:JAVA程序设计进阶 > 第五章 网络编程(下) > 5.1 Socket 多客户端通信实现 > Video
这一节我们将介绍
如何通过Socket来实现多客户端的通讯
尤其是实现多客户端的聊天程序
我们有些同学有很超强的能力
就说同时和多个人聊天
那这个时候
如果我们想写一个多人聊天的
这个程序怎么实现呢
比如说我们在服务端
一直有一个serverSocket
在等待的有客户端
来去和我们的服务端
发起请求要聊天
那我们这有一个Client A
它这个发起请求
想和我们的服务端聊天
那这个时候呢我们怎么办呢
其实我们的服务端的话
可以实例画出一个线程
让这个线程来处理
和Client A聊天相关的事情
然后呢我们又可以这个
有另外一个客户端
Client B也发出请求
想和我们这个服务端聊天
那我们处理方法就说
我也构造出一个线程来去跟它聊
那还有第三个客户端想来聊
怎么办 如法炮制
我们也构造出一个线程
来跟它聊天
那下面我们看
怎么能够把我们刚才的程序
改造成为多客户端的聊天程序
我们先看一下这个客户端吧
MultiTalkClient
那我们看它这个里面
一个成员变量int num
是要为了做技术用的
我们看它的主方法
public static void main方法
那里面我们首先
这个构造一个socket对象
目标的服务器就是我们的本机
端口号是4700
那这时候呢我们又构造了三个流
一个是键盘输入流
第二个是这个socket输出流
第三个流是socket输入流
这三个流其实和刚才上面那个例子
是这个一模一样的
紧接着我们就开始读取键盘输入
然后把我们读到的内容
判断一下不是goodbye
那我就给它发送到网络上
发给对方
发完以后
再接收来自对方的这个信息
依此循环
直到最后我们在键盘上敲出bye
最后我们关闭我们的输入输出流
关闭我们socket
大家可以看到在这个例子当中
我们的客户端
基本上和原来没有太多的变化
那我们看一下服务端有什么变化
服务端是public class MultiTalkServer
在里面有一个static int clientnum=0
这是一个静态的成员变量
主要是用来统计一下
到底有多少个客户端
向我们服务端发起了连接请求
容我们看一下我们的这个主方法
主方法里面定义了ServerSocket serverSocket=null
然后我们有一个boolean listening=true
一直设置为真
然后再由于它是server端
所以我们构造了一个serverSocket对象
然后端口号是4700
然后下面一直在循环while(listening)
也就是说我是一个无限循环
因为我们listening实际上是true
然后实际上我们这个方法就
它相当于是一个主方法
一直在循环等什么呢
等待有客户端有socket请求
一有socket请求
我就要实例画出一个线程
来去和它聊天
那怎么实例画出一个线程呢
大家看这个while(listening)
里面的第一句话new ServerThread
我要构造出一个server端的线程
它有两个参数
第一个叫serverSocket.accept
那大家还记得serverSocket.accept
这个方法它返回对象是什么类型吗
实际上它返回的就是socket对象
然后clientnum
就是我们给这个客户端的这个编号
那我们构造完这么一个serverThread
这个线程以后
得让它start方法让它开始启动
然后这时候clientnum++这个编号+1
这个是一个无限循环
只要等到有可能
有人把这个listening这个true设成false以后
整个这个循环才结束
那最后我们就可以关闭这个serverSocket了
那这里面有很多重要的功能
都放在了serverThread
这个类当中去实现
那我们看一下serverThead
到底干了哪些事情
我们看一下这个类
public class ServerThread extends Thread
继承于Thread类
然后socket socket= null
然后int clinetnum
我们看它的构造方法
构造方法有两个参数
第一个参数就是这个socket对象
第二个参数就是它的这个编号
那我们现在看一下
这个类的它的run方法
那在run方法里面
首先定了一个字符串line
这里面又定义了三个流
为什么是三个流
大家觉得好熟悉
因为刚才我们所有例子
定义都是三个流
那其实这三个流
分别是socket输入流
然后是socket输出流
以及键盘输入流
大家可能都猜到了
其实键是聊天嘛
实际上和刚才一样
就是说用一个流
读取我们键盘上的用户输入
然后呢再用一个输出流
把这个信息发给网络上的对方
然后再构造一个输入流
获得网络上发回来的信息
那这个三个流
我们看它是怎么用的呢
我们看一下它首先打印出
System.out.print In
client加clientnum加冒号
再加is点readLine
它首先是这个
获得我们从网络上传来的这个信息
打印出这是哪
第几个客户发过来的信息
然后紧接着line等于sin.readLine
也就是说我要从服务端的
这个键盘上获得这个敲入的信息
如果敲入的信息不等于bye
也就是line.equals(bye)并不成立的话
那说明聊天继续
那我们就把从键盘上
得到的信息line就往外发呗
怎么发
os.print 然后os.flush
发完了以后我们就显示说
Server他刚才聊天聊了什么呢
那就Server加上他输入的信息
紧接着又打印出Client+clientnum
然后再通过我们网络输入流is.readLine
又读取到网络上客户端
某客户端发过来信息
然后把它显示出来
这时候我们又继续循环的
读取我们键盘输入
如此循环以复
最后一直等到
我们键盘上输入的是这个bye
那整个才结束
那聊天结束以后
我们关闭我们的输出流
关闭我们的输入流
然后关闭我们的socket
所以这几个程序的话
我们可以在自己的这个电脑上运行
只不过运行的时候
是要求大家先启动一个虚拟机
运行一下你的server端程序
其次再启动第二个虚拟机
去运行一下你的第一个Client程序
再启动我们第三个虚拟机
去运行一下你的第二个Client程序
这样的话的你就能看到三个人
就是说一个服务端两个客户端
同时进行聊天的场景
那这个例子主要想向大家说明
如何实现多客户端的编程
这一节我们通过一个例子
介绍了如何通过socket
来实现多客户端的同时聊天
-1.0 导学
--Video
-1.1 线程的基本概念
--Video
-1.1 线程的基本概念--作业
-1.2 通过Thread类创建线程
--Video
-1.2 通过Thread类创建线程--作业
-1.3 线程的休眠
--Video
-1.3 线程的休眠--作业
-1.4 Thread类详解
--Video
-1.5 通过Runnable接口创建线程
--Video
-1.5 通过Runnable接口创建线程--作业
-1.6 线程内部的数据共享
--Video
-2.0 导学
--Video
-2.1 线程同步的思路
--Video
-2.2 线程同步的实现方式—Synchronization
--Video
-2.3 线程的等待与唤醒
--Video
-2.4 后台进程
--Video
-2.5 线程的生命周期与死锁
--Video
-2.6 线程的调度
--Video
-3.0 导学
--Video
-3.1 线程安全与线程兼容与对立
--Video
-3.2 线程的安全实现-互斥同步
--Video
-3.3 线程的安全实现-非阻塞同步
--Video
-3.4 线程的安全实现-无同步方案
--Video
-3.5 锁优化
--Video
-4.0 导学
--Video
-4.1 URL对象
--Video
-4.2 URLConnection对象
--Video
-4.3 Get请求与Post请求
--Video
-4.4 Socket通信原理
--Video
-4.5 Socket通信实现
--Video
-5.0 导学
--Video
-5.1 Socket 多客户端通信实现
--Video
-5.2 数据报通信
--Video
-5.3 使用数据报进行广播通信
--Video
-5.4 网络聊天程序
--Video
-6.0 导学
--Video
-6.1 Java虚拟机概念
--Video
-6.2 Java虚拟机内存划分
--Video
-6.3 Java虚拟机类加载机制
--Video
-6.4 判断对象是否存活算法及对象引用
--Video
-6.5 分代垃圾回收
--Video
-6.6 典型的垃圾收集算法
--Video
-6.7典型的垃圾收集器
--Video
-7.0 导学
--Video
-7.1 集合框架与ArrayList
--Video
-7.2 LinkedList
--Video
-7.3 HashMap与HashTable
--Video
-7.4 TreeMap与LinkedHashMap
--Video
-7.5 HashSet
--Video
-8.0 导学
--Video
-8.1 Java反射机制
--Video
-8.2 Java静态代理
--Video
-8.3 Java动态代理
--Video
-8.4 Java 反射扩展-jvm加载类原理
--Video
-8.5 Java进阶课程总结
--Video