网络聊天室(Java)
本文阐述了基于Linux环境,Java语言实现的基本聊天室功能,涉及Linux下的Java 语言的Socket编程。以及Java语言的多线程编程。
Ø TCP (Transmission Control Protocol)基础
Ø UDP(User Datagram Protocol) 基础
Ø Socket(Java)
Java支持流套接字(steam socket)和数据报套接字(datagram socket)。流套接字使用TCP协议(Transmission Control Protocol, 传输控制协议)进行数据的传输,而数据报套接字使用UDP协议(User Datagram Protocol, 用户数据报协议)。因为TCP能够探测丢失的数据传输并重新提交它们,因此传输的数据不会丢失,是可靠的。相比之下,UDP协议不能保证无损失传输。所以,采用TCP协议通信可以保证数据的正确传输。
Ø 客户/服务器模式
ServerSocket server = new ServerSocket(port);1 |
Socket connectToClient = server.accept(); |
Socket connectToServer = new Socket(ServerName, port); |
InputStream isFromServer = connectToServer.getInputStream();
OutputStream osToServer = connectToServer.getOutputSteam();
|
InputStream 和 OutputSteam是用户读写字节。可以使用DataInputStream、DataOutputSteam、BufferReader 和 PrintWriter包装InputStream和OutputSteam,读取double、int、String之类的数据值。可以使用readLine方法读入一行数据,使用println向端口写入一行。
Ø 线程有五种状态:新建、就绪、运行、阻塞、结束。
Ø Thread类包括以下的几种控制方法:
public static void sleep(long millis) throws InterruptedException 方法,可以将在运行的线程置为休眠状态,休眠时间为指定的毫秒。
¨ Linux Platform - J2SE(TM) and NetBeans(TM) IDE Bundle NB 4.1 / J2SE 5.0 Update 4 [4]
¨ Rat Hat Linux 9.0
在Linux采用J2SE和NetBeans可以很容易的开发面向Linux的应用程序,可以移植到windows平台下运行。其中NetBean 是Sun公司开发的免费Java图形用户界面编辑器。(如图1-4)可以很轻松的实现界面的设计,它将控件以Swing, awt, JavaBean分类放置。
[MESSAGE] :表示接下来的一句话是消息
|
|
[NAME]: 表示接下来的一句话是名字
|
[FIRSTNAME] :用于程序逻辑控制,表示第一个
|
[SYSTEM]: 系统消息
|
[Server exit!] : 服务器退出
|
[WHISPERMESSAGE] :私聊控制字
|
|
[QUIT] : 表示客户端退出聊天室
|
Ø
public void startConnect()
{
try
{
sock = new Socket(ipAddress, DEFAULT_PORT); //新建一个socket if(sock!=null) //连接成功
{
processMsg();
}
isFromServer=new BufferedReader(); //新建一个接收变量 osToServer = new PrintWriter(); //新建一个输出变量 osToServer.println("[NAME]" + name); //发名字
osToServer.flush(); //刷新数据缓冲
}
catch(IOException ex)
{
}
readThread=new Thread(this); //通过Runnable实现 readThread.start();
}
|
Client端通过方法startConnect(),尝试连接服务器端,其函数原型如下:
Ø 通过SendInformation()方法实现数据的发送,实现函数原型如下:
public void sendInformation()
{
if(私聊)
{
osToServer.println("[WHISPERMESSAGE]" + message);//发送私聊信息
osToServer.flush();
}
else
{
osToServer.println("[MESSAGE]" + message); //发送群聊信息 osToServer.flush();
}
}
|
Ø 当程序退出,或者服务器退出,线程应该结束运行。客户端,通过重载Thread的run方法实现,函数的原型如下:
public void exit()
{
try
{
osToServer.println("[QUIT]"); //向服务器发送退出命令字
osToServer.flush();
}
catch(Exception exc){}
try
{
sock.close(); //关闭socket
isFromServer.close(); //输入缓冲关闭 osToServer.close(); //输出缓冲关闭
}
catch(IOException ioe){}
finally //不管异常是否发生都将执行
{
System.exit(0);
}
}
|
à 在退出应用程序之前,向服务器端发送[QUIT]命令字,实现聊天室的更新。
à 客户端退出要将socket关闭,要将输入和输出的数据流关闭。
à 最后将执行finally块程序,最后调用System的exit的函数退出应用程序。
Ø Server相对与客户端更加的复杂,要主动监听客户端发送的连接请求,创建不同的线程,来应答客户的请求。创建的线程,接受客户发送的数据的处理。
Ø 服务端使用serverListen()函数开始监听端口,其函数原型如下:
private void serverListen()
{
chatAcceptThread = new Thread(this); //创建一个监听线程 chatAcceptThread.start(); broadcastThread = new BroadcastThread(this); //创建广播线程 broadcastThread.start();
}
|
Ø ServerJFrame是通过Runnable接口来创建的线程。其run函数实现客户端的接受并创建一个新的线程:
public void run()
{
clients = new java.util.Vector(); //分配一个栈,用于存储用户线程
clientsInfor = new java.util.Vector(); //用于存储用户名
try
{
serverSock=new ServerSocket(DEFAULT_PORT); //新建一个Socket
}
catch(IOException e){}
try
{
while(true)
{
Socket clientSock = serverSock.accept(); CommunicateThread ct = new CommunicateThread(); //实例化通信类 boolean addSucOrNot = clients.add(ct); //将当前的进程压入堆栈
}
}
catch(IOException e){}
}
|
为了后面能够将数据广播出去,和实现私聊,必须要得到响应的线程,所以在向堆栈压入线程的时候,需要有一个变量(index)来指示线程, index 不会随着客户的退出而删除 [9] ,而是逐次累加,那么当客户退出时,要将此进程在堆栈中的位置设置为[EMPTY],来表示一个客户端已经退出,此时,服务器端要结束和这个客户端连接的线程。
Ø 那么当用户发来数据的时候,并且命令字为[MESSAGE]的时候,服务器需要将这条信息广播出去,这个由Broadcast来处理,其中的run函数原型如下:
public void run()
{
try
{
while(true)
{
//若消息堆栈为空,或者没有当前信息需要发送
boolean startBroadcast = chatFrame2.getBroadcastStart(); if (!startBroadcast)
{
try
Thread.sleep(500); // 线程睡眠500毫秒后重新检测 catch(InterruptedException ex){} continue;
}
int lengthOfChatClients = chatClients.size(); //线程个数 for(int i=0; i < lengthOfChatClients; i++) //对每个线程进行操作
{
if(chatClients.get(i).equals("[EMPTY]")) //若是退出进程 continue; comThread1 = (CommunicateThread)chatClients.get(i);
msgStack = comThread1.inforStack;
int lengthOfMsgStack = msgStack.size(); //对消息堆栈进行广播 for(int j=0; j<lengthOfMsgStack; j++)
{
string = (String)msgStack.get(j); broadcastInfor = string; broadcast("[MESSAGE]" + broadcastInfor); boolean temp = msgStack.removeElement(string);
}
}
try
{
chatFrame2.stopBroadcast(); //停止广播 Thread.sleep(1000);
}
catch(InterruptedException ex) {}
}
}
catch(Exception e){}
}
|
Ø 程序可以实现公聊和私聊 [10] ,公聊在服务器端将加入聊天记录,私聊则只是发给指定用户,服务器端不保留聊天信息。
Ø 收到系统消息,和用户变化都会有声音提示。
Ø 完全可以单机来调试信息,也试过在Linux下运行服务器端,在Windows下使用客户端进行访问,访问方式没有区别,通信也没有故障。
Ø 当服务器退出时,或者说用户端失去服务器连接时,用户将需要重新连接,当然也可以实现超时退出的方式,这样可以实现重新连接。
Ø 可扩展功能:系统可以选择需要发送的系统消息的对象,这样可以使系统消息发送更加灵活。
Ø 用户可以通过右边的list得到当前的在线用户的状况
Ø 用户可以通过左边的textArea得到当前群中用户所发送的消息的记录 [11] 。
Ø 当用户连接失败,可以选择重新登陆,重新登陆就不需要重新输入用户名。
Ø 假如用户登陆时,没有指定连接地址,将默认为localhost地址 [12] 。
Ø 用户可以通过直接按Enter键发送消息 [13] 。
m Ineroduction to Java Programming Third Editon : Y.Daniel Liang
m Linux Platform - J2SE(TM) and NetBeans(TM) IDE : http://java.sun.com
m Java sockets 101: http://www.ibm.com/developerWorks
m Building a Java chat server: http://www.ibm.com/developerWorks
m Beej网络socket编程指南: http://www.ecst.csuchico.edu/%7Ebeej/guide/net/
m UML参考手册 : James Rumbaugh
[1] 如果试图在被占用的端口上创建一个服务器套接字,将引起java.net.BindException 实时错误
[4] Website: https://jsecom15d.sun.com/ECom/EComActionServlet;jsessionid=6596D10F28E751B8FD7981BCCB5E02DA#http://192.18.97.252/ECom/EComTicketServlet/BEGIN6596D10F28E751B8FD7981BCCB5E02DA/-2147483648/957453423/1/626894/626858/957453423/2ts+/westCoastFSEND/jdk-1.5.0_04-nb-4.1-oth-JPR/jdk-1.5.0_04-nb-4.1-oth-JPR:2/jdk-1_5_0_04-nb-4_1-linux.bin
[5] 图中所示的界面是Windows平台的界面效果,Linux(Rad hat Linux 9.0)下的执行界面的布局方式是大致相同的。
[8] 在实现用,我并没有这样做,而是将其赋离线常量(String), 这样的目的,在后面将叙述到
网络聊天室(Java)相关推荐
- 视频教程-网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天-Java
网络聊天室Java基础版(Socket_Swing编程)仿QQ聊天 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富 ...
- 基于Java socket的网络聊天室的设计与实现
目 录 摘要 I Abstract II 目 录 III 1 引言 1 2 网络聊天室的简介 2 2.1网络聊天室现状和发展 2 3 完成网络聊天室的技术以及环境 4 3.1 Java的介绍 4 3. ...
- 网络聊天室(linux,java,Android)
如果追忆会荡起涟漪,那么今天的秋红落叶和晴空万里都归你 艾恩凝 个人博客 https://aeneag.xyz/ 前几天在他人那里看到了网络聊天室的文章,想起了自己几年前也认认真真写过相关编程,实现了 ...
- java聊天室测试_Java网络聊天室实训能力测试
1填空题(2*12=24,每空2分).1)C/S结构是指___客户机/服务器_____,请例举除网络聊天室之外的基于C/S结构的应用程序____________________.2)套接字(socke ...
- 【完整代码及文档】基于Java的网络聊天室系统的设计与实现
摘 要 计算机从出现到现在有了飞速的发展,现阶段的计算机已经不单单是用于进行运算的独立的个体了,跟随计算机一同发展的还有互联网技术,经过了长久的发展,互联网技术有了日新月异的发展,它的发展速度和计算机 ...
- Java网络聊天室---个人博客
Java网络聊天室 ---个人博客 一.项目简介 功能描述: 使用图形用户界面和socket通信,能实现一个聊天室中多人聊天,可以两人私聊,可以发送文件. 实现类似QQ用户注册.登录.聊天等功能. 参 ...
- 视频教程-Java基础中国象棋和网络聊天室Swing开发-Java
Java基础中国象棋和网络聊天室Swing开发 IT行业资深从业者,7年资深Java高级开发,Java架构师.曾就职银行.电信等行业多家上市公司.担任项目负责人,软件架构师.有丰富的高并发.分布式系统 ...
- [源码和文档分享]基于java语言的C/S模式网络聊天室软件
一 需求分析 采用C/S模式,基于TCP协议编程的方式,使得各个用户通过服务器转发实现聊天的功能 分为三大模块:客户端模块.服务器端模块和公共辅助类模块 客户端模块的主要功能: 登陆功能:用户可以注册 ...
- 小浩的JAVA网络聊天室
案例:在线聊天室 需求:使用TCP的Socket实现一个聊天室 服务器端:一个线程专门发送消息,一个线程专门接收消息 客户端:一个线程专门发送消息,一个线程专门接收消息 实现:具有 注册 登录 功能的 ...
最新文章
- css的几种使用方式有哪些,引入CSS的方式有几种?
- 发送Request Payload数据演示
- pandas使用query函数查询dataframe指定数据列的内容(数值)不包含在特定列表中的数据行(not contain in list)
- php directoryiterator,PHP DirectoryIterator getBasename()用法及代码示例
- 进阶的“车厘子自由”,进化的“淘宝特价版”
- Effective C# 第二章:.Net资源管理(翻译)
- 高通量数据中批次效应的鉴定和处理(二)
- 新手学Python, 如何从入门到入土变为从入门到快速上车?
- python2 使用matplotlib
- 《UNIX网络编程 卷2:进程间通信(第2版)》——1.4 名字空间
- 2021东华杯misc详解
- Python代码缩进
- java实现一个录像大师
- 离散数学耿素云计算机,离散数学,屈婉玲,耿素云,张立昂编著_考研教材_考试点...
- 无法获得下列许可solidworks standard无效的(不一致的)使用许可号码(-8,544,0) solidworks2020 (亲测有效)
- 学习继电器的工作原理及作用
- TrustedInstaller
- js身份证号校验方法(转载我的请注明哈哈)
- 1905. 统计子岛屿
- C语言C++编程学习:排序原理分析