当前课程知识点:JAVA程序设计进阶 >  第五章 网络编程(下) >  5.1 Socket 多客户端通信实现 >  Video

返回《JAVA程序设计进阶》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《JAVA程序设计进阶》慕课在线视频列表

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

来实现多客户端的同时聊天

JAVA程序设计进阶课程列表:

第一章 线程(上)

-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

第六章 Java虚拟机

-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

第七章 深入集合Collection

-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

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。