多人群聊聊天室java_#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室...
#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室
学习本文须要先准备的知识点:队列(或数组)、类与对象、线程、InputStream和OutputStream的使用。java
1.前期准备(新知识点讲解)
(1)、认识Telnet数组
a、关于Telnet服务器
Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式。它为用户提供了在本地计算机上完成远程主机工做的能力。在终端使用者的电脑上使用telnet程序,用它链接到服务器。终端使用者能够在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入同样。能够在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登陆服务器。Telnet是经常使用的远程控制Web服务器的方法。网络
b、telnet的工做过程:函数
(a)、本地与远程主机创建链接。该过程其实是创建一个TCP链接,用户必须知道远程主机的Ip地址或域名;学习
(b)、将本地终端上输入的用户名和口令及之后输入的任何命令或字符以NVT(Net Virtual Terminal)格式传送到远程主机。该过程其实是从本地主机向远程主机发送一个IP数据包;this
(c)、将远程主机输出的NVT格式的数据转化为本地所接受的格式送回本地终端,包括输入命令回显和命令执行结果;.net
(d)、最后,本地终端对远程主机进行撤消链接。该过程是撤销一个TCP链接。线程
(以上关于telnet的内容摘自百度百科)code
咱们须要作的,就是写一个服务器,使用户可以链接上咱们的服务器,并且咱们的服务器可以对用户发送的消息进行处理。
(2)、BufferedReader类:用于从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。此类的对象建立时,须要传入一个InputStream对象。
此类的部分相关方法:
read(); // 读取单个字符。
readLine(); //读取一个文本行,程序运行到这里时须要用户输入,将用户输入的数据读取。
例如:
bs = new BufferedReader(new InputStreamReader(in));
String name = bs.readLine();
(3)、ServerSocket类:此类实现服务器套接字。服务器套接字等待请求经过网络传入。它基于该请求执行某些操做,而后可能向请求者返回结果。简而言之,就是在指定端口建立一个服务器。此类的对象建立时,须要传入的数字就是端口。
此类的相关方法:
accept(); //侦听并接受到此套接字的链接。此方法在链接传入以前一直阻塞。即接受用户链接,在用户未链接时程序会在此暂停。其返回值是一个Socket对象。
例如:
//在6666端口建立一个服务器,等待用户链接(虽然建立了,但不会对用户的链接做出反应)。
ServerSocket sever = new ServerSocket(6666);Socket sk = sever.accept();
(4)、Socket类:此类实现客户端套接字(也能够就叫“套接字”)。套接字是两台机器间通讯的端点。 能够利用Socket对象与客户端进行交互。
此类的相关方法:
getOutputStream(); //返回此套接字的输出流。即返回用户端的输出流,能够借助此输出流显示传递给用户的信息。
getInputStream(); //返回此套接字的输入流。即返回用户端的输入流,能够借助此输入流获取用户端的输入信息。
2.思路分析
(1)、创建一个服务器,实现相应的端口,在用户链接的时候启动一个线程,用于获取用户的输入和输出,为了可以让多个用户链接,能够将侦听用户链接的代码放在一个while(true)循环里面(侦听的语句在没有用户链接的时候会在此暂停,不用担忧死循环形成的程序卡顿等问题):
//创建一个Message对象的队列,用于储存用户的信息,Message对象将会在后面介绍
static ArrayList m = new ArrayList<>();
static ServerSocket sever;
public static void main(String[] args) {
try {
//建立一个服务器,实现6666端口
sever = new ServerSocket(6666);
System.out.println("服务器已开启。");
while (true) {
//侦听用户链接,没有用户链接的时候会在此停留
Socket sk = sever.accept();
//有用户链接,建立一个线程控制用户的输入输出
Sever ss = new Sever(m,sk);
Thread ts = new Thread(ss);
//启动线程
ts.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
(2)、创建一个对象,储存用户输入的信息,而且执行改用户的输出操做
public class Message {
//msg用于储存用户输入的消息
private String msg;
//name储存用户姓名
private String name;
//判断用户有没有输入
private boolean isNewPut = true;
//判断用户是否是第一次进入
private boolean isNewJoin = true;
//用于控制线程的开始中止
private boolean start = true;
public void setName(String name) {
this.name = name;
}
public boolean getStart() {
return start;
}
public String getName() {
return name;
}
public Message() {
msg = new String();
}
//获取用户输入的信息,将判断是否有用户输入的boolean值改成true,这个值为true时,下面介绍的的Together线程将会向全部用户输出此用户的消息
public void addMsg(String msg) {
this.msg = msg;
isNewPut = true;
}
public String getMsg() {
return msg;
}
public void setIsNewPut(boolean s) {
isNewPut = s;
}
public boolean getIsNewPut() {
return isNewPut;
}
public void setIsNewJoin(boolean j) {
isNewJoin = j;
}
public boolean getIsNewJoin() {
return isNewJoin;
}
//用户退出时,将strat、isNewPut改为false
public void exit() {
start = false;
isNewPut = false;
}
}
(3)、编写控制用户输入输出的线程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
public class Sever implements Runnable {
//用于储存用户的Message队列
private ArrayList msg;
private Socket sk;
private Message m;
//count可用做区分用户的索引
private int count;
private OutputStream out;
private BufferedReader bs;
private InputStream in;
public Sever(ArrayList msg, Socket sk, int count) {
this.msg = msg;
this.sk = sk;
this.count = count;
}
public void run() {
recieve();
}
//将用户的输出传给全部用户,并在全部用户的控制台输出
public void setMsg(BufferedReader bs) throws IOException {
while (msg.get(count).getStart()) {
String strMsg = bs.readLine();
if (strMsg != null)
msg.get(count).setMsgAll(msg.get(count).getName() + " said:" + strMsg + "\r\n");
}
}
//接受用户输入并处理
public void recieve() {
try {
//获取用户控制台的输入输出流
out = sk.getOutputStream();
in = sk.getInputStream();
out.write("welcome!Please enter your username:\r\n".getBytes());
bs = new BufferedReader(new InputStreamReader(in));
//获取用户输入,若是用户没有按回车,程序会在此暂停
String name = bs.readLine();
out.write(("Your username is:" + name + "\r\n").getBytes());
//初始化Message对象,并将用户的姓名、输出流、消息储存进用户的Message对象
m = new Message(name, out, msg);
//用于区分用户的索引,好比第一个用户登陆时这个值为0,第二个用户时这个值为2
count = msg.size();
//将Message对象m存入Message队列的第count处
msg.add(count, m);
//在全部用户的控制台输入XXX已经上线
msg.get(count).setMsgAll(name + " is on line.\r\n");
//此函数会循环获取用户输入并在全部用户的控制台输出
setMsg(bs);
//跳出上面的函数说明用户已经下线,则关闭全部的流、用户对应的Socket对象,从Message队列移除上线的用户
out.close();
in.close();
sk.close();
msg.remove(count);
} catch (IOException e) {
e.printStackTrace();
}
}
}
多人群聊聊天室java_#java 聊天室(一)—— 实现一个简单Telnet多人群聊聊天室...相关推荐
- java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署
java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...
- java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署
java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...
- 将Java程序变成可执行文件的一个简单方法
将Java程序变成可执行文件的一个简单方法 运行Java程序(SWING或SWT的桌面程序)可以直接执行.class文件或将所有的.class文件及相关的其他文件压缩成.jar文件,然后使用javaw ...
- java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)
java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...
- java 语言 写字板_一个简单的java语言写字板.docx
一个简单的java语言写字板.docx 一个简单的JAVA语言写字板一.需求分析1.需求分析:现在网络上各种文档编辑器数不胜数.功能也是应有尽有,有能改变字体的,有可以改变字体颜色的,但是,这些软件有 ...
- java聊天室论文,JAVA聊天室毕业论文
JAVA聊天室毕业论文 毕业设毕业设计计 姓 名 学 号 系 部 信息工程系信息工程系 专 业 软件技术软件技术 设计题目 聊天室(聊天室(JavaJava)) 指导教师 职 称 2012 年 07 ...
- 【计算机网络作业】Java UDP聊天 和 Socket编写一个简单的Web服务器
1-1 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与Da ...
- java 缓存方法_Java实现一个简单的缓存方法
Java实现一个简单的缓存方法 发布时间:2020-09-07 21:39:55 来源:脚本之家 阅读:99 作者:BrightLoong 缓存是在web开发中经常用到的,将程序经常使用到或调用到的对 ...
- java实现编译器_实现一个简单的编译器
简单的说 编译器 就是语言翻译器,它一般将高级语言翻译成更低级的语言,如 GCC 可将 C/C++ 语言翻译成可执行机器语言,Java 编译器可以将 Java 源代码翻译成 Java 虚拟机可以执行的 ...
最新文章
- paramiko监控 windows服务器 被监控服务器只需要安装openssh服务即可基于wmic完成大部分监控...
- 功率谱有什么用_马达品牌不同,功率一样,变频器互相不能用,是什么原因
- 重拾python Day 1
- 教育部:浙江大学等35所高校新增人工智能本科专业
- VUE 项目如何快速优化?| 原力计划
- Ubuntu 14.04 网卡网关配置修改
- 计算机知识提炼,2017计算机考研:操作系统复习策略及重要知识点提炼
- vim字符串全局替换
- 【转载】android开发笔记之fastboot的使用
- mkvtoolnix视频转换 v51.0.0中文版
- 为什么哪些90后程序员年薪50万+,他们经历了啥?
- FPGA实现AM调制
- [期货系列]期货择时策略-基于Hurst指数的分型策略研究
- 利用Rstudio对考试成绩进行数据分析
- 杂评 360和腾讯之争
- linux下显示隐藏文件
- 服务器开机一进系统就黑屏,win7系统开机在欢迎界面直接黑屏怎么办
- python统计红楼梦人物出场次数_《红楼梦》人数统计,人物,出场,次数
- Python 手把手教你爬取淘宝的笔记本电脑数据
- 数字信号处理——FFT
热门文章
- 比大衣保暖,比羽绒服显瘦!这件高级反貂绒毛衣火了!不起球不掉毛,明明毛茸茸的却巨显瘦,舒适又保暖....YYDS!...
- 基于二手车价格预测——特征工程
- (附源码)springBoot高校宿舍交电费系统 毕业设计 031552
- tcpdump抓取网络
- 像哆啦A梦懂大雄一样懂客户,我们也会拥有百宝箱
- 电脑快捷键快速关机方法,电脑如何快速关机
- 房贷还款方式等额本息等额本金比较和这两种提前还款的区别
- Springboot 服务端为App集成支付宝支付
- android银行卡输入密码,android 仿微信添加银行卡时输入支付密码
- 示波器如何设置实现单次触发