#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多人群聊聊天室...相关推荐

  1. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

  2. java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署

    java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 java计算机毕业设计vue开发一个简单音乐播放器MyBatis+系统+LW文档+源码+调试部署 本源 ...

  3. 将Java程序变成可执行文件的一个简单方法

    将Java程序变成可执行文件的一个简单方法 运行Java程序(SWING或SWT的桌面程序)可以直接执行.class文件或将所有的.class文件及相关的其他文件压缩成.jar文件,然后使用javaw ...

  4. java计算机毕业设计vue开发一个简单音乐播放器(附源码、数据库)

    java计算机毕业设计vue开发一个简单音乐播放器(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Ec ...

  5. java 语言 写字板_一个简单的java语言写字板.docx

    一个简单的java语言写字板.docx 一个简单的JAVA语言写字板一.需求分析1.需求分析:现在网络上各种文档编辑器数不胜数.功能也是应有尽有,有能改变字体的,有可以改变字体颜色的,但是,这些软件有 ...

  6. java聊天室论文,JAVA聊天室毕业论文

    JAVA聊天室毕业论文 毕业设毕业设计计 姓 名 学 号 系 部 信息工程系信息工程系 专 业 软件技术软件技术 设计题目 聊天室(聊天室(JavaJava)) 指导教师 职 称 2012 年 07 ...

  7. 【计算机网络作业】Java UDP聊天 和 Socket编写一个简单的Web服务器

    1-1 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与Da ...

  8. java 缓存方法_Java实现一个简单的缓存方法

    Java实现一个简单的缓存方法 发布时间:2020-09-07 21:39:55 来源:脚本之家 阅读:99 作者:BrightLoong 缓存是在web开发中经常用到的,将程序经常使用到或调用到的对 ...

  9. java实现编译器_实现一个简单的编译器

    简单的说 编译器 就是语言翻译器,它一般将高级语言翻译成更低级的语言,如 GCC 可将 C/C++ 语言翻译成可执行机器语言,Java 编译器可以将 Java 源代码翻译成 Java 虚拟机可以执行的 ...

最新文章

  1. paramiko监控 windows服务器 被监控服务器只需要安装openssh服务即可基于wmic完成大部分监控...
  2. 功率谱有什么用_马达品牌不同,功率一样,变频器互相不能用,是什么原因
  3. 重拾python Day 1
  4. 教育部:浙江大学等35所高校新增人工智能本科专业
  5. VUE 项目如何快速优化?| 原力计划
  6. Ubuntu 14.04 网卡网关配置修改
  7. 计算机知识提炼,2017计算机考研:操作系统复习策略及重要知识点提炼
  8. vim字符串全局替换
  9. 【转载】android开发笔记之fastboot的使用
  10. mkvtoolnix视频转换 v51.0.0中文版
  11. 为什么哪些90后程序员年薪50万+,他们经历了啥?
  12. FPGA实现AM调制
  13. [期货系列]期货择时策略-基于Hurst指数的分型策略研究
  14. 利用Rstudio对考试成绩进行数据分析
  15. 杂评 360和腾讯之争
  16. linux下显示隐藏文件
  17. 服务器开机一进系统就黑屏,win7系统开机在欢迎界面直接黑屏怎么办
  18. python统计红楼梦人物出场次数_《红楼梦》人数统计,人物,出场,次数
  19. Python 手把手教你爬取淘宝的笔记本电脑数据
  20. 数字信号处理——FFT

热门文章

  1. 比大衣保暖,比羽绒服显瘦!这件高级反貂绒毛衣火了!不起球不掉毛,明明毛茸茸的却巨显瘦,舒适又保暖....YYDS!...
  2. 基于二手车价格预测——特征工程
  3. (附源码)springBoot高校宿舍交电费系统 毕业设计 031552
  4. tcpdump抓取网络
  5. 像哆啦A梦懂大雄一样懂客户,我们也会拥有百宝箱
  6. 电脑快捷键快速关机方法,电脑如何快速关机
  7. 房贷还款方式等额本息等额本金比较和这两种提前还款的区别
  8. Springboot 服务端为App集成支付宝支付
  9. android银行卡输入密码,android 仿微信添加银行卡时输入支付密码
  10. 示波器如何设置实现单次触发