网络聊天室(Java)
来源:互联网 发布:阿里云的dns是多少 编辑:程序博客网 时间:2024/05/21 09:35
本文阐述了基于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();
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分类放置。
Ø sock = new Socket(ipAddress, DEFAULT_PORT); //新建一个socket if(sock!=null) //连接成功 processMsg(); isFromServer=new BufferedReader(); //新建一个接收变量 osToServer = new PrintWriter(); //新建一个输出变量 osToServer.println("[NAME]" + name); //发名字 catch(IOException ex) readThread=new Thread(this); //通过Runnable实现 readThread.start();
Ø 通过SendInformation()方法实现数据的发送,实现函数原型如下:
osToServer.println("[WHISPERMESSAGE]" + message);//发送私聊信息 osToServer.println("[MESSAGE]" + message); //发送群聊信息 osToServer.flush();
Ø 当程序退出,或者服务器退出,线程应该结束运行。客户端,通过重载Thread的run方法实现,函数的原型如下:
osToServer.flush(); catch(Exception exc){} isFromServer.close(); //输入缓冲关闭 osToServer.close(); //输出缓冲关闭 System.exit(0);
à 在退出应用程序之前,向服务器端发送[QUIT]命令字,实现聊天室的更新。
à 客户端退出要将socket关闭,要将输入和输出的数据流关闭。
à 最后将执行finally块程序,最后调用System的exit的函数退出应用程序。
Ø Server相对与客户端更加的复杂,要主动监听客户端发送的连接请求,创建不同的线程,来应答客户的请求。创建的线程,接受客户发送的数据的处理。
Ø 服务端使用serverListen()函数开始监听端口,其函数原型如下:
chatAcceptThread = new Thread(this); //创建一个监听线程 chatAcceptThread.start(); broadcastThread = new BroadcastThread(this); //创建广播线程 broadcastThread.start();
Ø ServerJFrame是通过Runnable接口来创建的线程。其run函数实现客户端的接受并创建一个新的线程:
clients = new java.util.Vector(); //分配一个栈,用于存储用户线程 serverSock=new ServerSocket(DEFAULT_PORT); //新建一个Socket catch(IOException e){} 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函数原型如下:
boolean startBroadcast = chatFrame2.getBroadcastStart(); if (!startBroadcast) 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); 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); 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网络聊天室程序
- Java网络聊天室GUI
- 【JAVA】多线程网络通信---聊天室
- 基于java网络聊天室---前言
- 基于java网络聊天室--服务器端
- 基于java网络聊天室--客户端
- java网络编程之聊天室客户端(二)
- JAVA网络聊天室的设计与实现
- 06 java GUI 网络编程:图形界面聊天室
- Java Web入门之网络聊天室
- Java WebSocket实现网络聊天室(群聊+私聊)
- Java的网络编程之聊天室功能
- Java NIO示例:多人网络聊天室
- Java NIO示例:多人网络聊天室
- Java制作网络聊天室(section1)
- Java NIO示例:多人网络聊天室
- 基于java网络聊天室--截图实现
- RoyalAjax(二),对HttpRequest的封装
- “创网”的人脉网络,如何养成?
- 一个c#上传的程序,可以生成缩略图也可以自由添加水印效果
- “创网”的黏度——公平地“竞争创业资金”
- 说说如何写分析类文章
- 网络聊天室(Java)
- 第三方点评如何发展
- Arm7TDMI开发板的flash分配
- 入门的 Class 文章 [收藏]
- gdb(windows)下载
- 类的接口与代码模块化
- 类的接口与代码模块化
- Something About Pretect Mode
- 我是设计师 别TMD碰我的显示器