基于JavaSocket多客户端并发通信聊天程序的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

软件设计开发本栏目责任编辑:谢媛媛

基于JavaSocket多客户端并发通信聊天程序的设计与实现

莫足琴,欧阳艳阶,马康

(十堰职业技术学院计算机工程系,湖北十堰442000)

摘要:随着网络技术与计算机开发语言的发展,越来越多的程序员利用Java来编写网络程序。本文介绍了Socket的通信机制,并使用Java语言、套接字接口(SocketAPI)技术和多线程相结合的模式实现了多客户端与服务器的并发通信的多人聊天系统。

关键词:Java;Socket;多客户并发;网络通信

中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)20-30253-03

Design&ImplementofChatSystemBasedonSocketMulti-userParallelCommunication

MOZu-qin,OUYANGYan-jie,MAKang

(DeptofComputerEng,ShiyanTechnicalInstituteEng,Shiyan442000,China)

Abstract:Asinternettechnicandcomputerlanguagedevelop,moreandmoreprogrammersmakeuseofJavatocompilenetprogramme.ThispaperintroducesthemechanismofcommunicationsandusingthecombinationofJavalanguage,SocketAPItechnicandthemulti-threadingtoimplementchatsysteminwhichmulti-userandservercancommunicateparallel.

keywords:Java;Socket;multi-usersendparallel;Netcommunication

1引言

Java是一种可以编写跨平台应用软件的面向对象的程序设计语言,网络应用是Java语言取得成功的领域之一,它已经成为现在Internet上最流行的一种编程语言。网络编程的目的就是直接或间接地通过网络协议与其它计算机进行通讯。两台计算机通讯需解决两个主要问题:一是如何准确定位网络上的主机;二是找到主机后如何可靠有效地进行数据传输。

Java语言作为网络编程语言,提供了强大的网络编程接口。针对网络通信的不同层次,Java提供的网络功能有四大类:InetAd-dress、URL、Socket、Datagram。Socket是Internet使用的协议组TCP/IP的组合,实现了两台主机之间通过端口进行网络通信。Java.net包中提供Socket类,隐藏了Socket的实现细节,不需要开发者编写接口程序,而可以快速的实现网络的通信。[1]

2Socket的通信

2.1Socket通信机制

在Java中,可以使用两种Socket方式,即流式Socket和数据报式Socket。流式Socket提供了双向的、有序的、无重复、可靠的的数据流服务,采用的是一种TCP协议。数据报式Socket支持双向的数据流,但不保证是可靠的、有序的、无重复的传输,采用的是UDP协议。[1]两种Socket相比较而言,流式Socket具有较高的安全性,但有一定的额外开销。而数据报式Socket与之相反。笔者根据实际情况采用的是流式Socket方式。

基于TCP协议的流式Socket实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。无论一个Socket通信程序的功能多么齐全,程序多么复杂,Socket基本

结构都是一样的,都包括以下四个基本步骤:

(1)在客户端和服务器端创建Socket和ServerSocket实例;

(2)打开连接到Socket的输入/输出流;

(3)利用输入/输出流,按照一定的协议对Socket进行读/写操作;

(4)关闭输入/输出流和Socket。

Socket通信机制框图见图1。

图1Socket通信机制框图

收稿日期:2008-02-24

作者简介:莫足琴(1973-),女,十堰职业技术学院计算机工程系讲师,工学硕士;欧阳艳阶(1974-),男,十堰职业技术学院计算机工程系讲师,工程硕士;马康(1976-),男,十堰职业技术学院计算机工程系讲师。

253

软件设计开发

本栏目责任编辑:谢媛媛2.2Socket的多客户端并发通信

支持多个客户端的Socket通信实现方法有多种:方法一,在一台计算机上一次启动多个服务器程序(端口号必须不同);方法二,将服务器程序写成多线程的,不同处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。

实现多个客户与服务器并发通信,就像服务器与自己连接一样,笔者认为最好引入多线程机制。多线程正好是Java提供的一个重要机制,支持多个程序并发执行。服务器端每当建立一个新的Socket连接,主线程就启动一个新的线程,负责服务器与客户端的通信;而主线程继续等待下一个客户端的连接。当客户端断开连接后,子线程释放其占用的所有Socket资源[3]。多线程支持多客户端的具体框图见图2。

图2多客户端并发通信

3多客户端聊天程序的设计

系统主要分为两大部分:TCP服务器Server和客户端Client。

3.1服务器端程序编写

服务器端等待用户连接,如有用户发送连接请求后,创建一个用户实例,记录客户端的相关信息,维护与该用户的连接。根据聊天的接收人信息,再将接收的数据传输给客户端。当用户断开连接时,关闭用户实例,断开此用户连接。[2]主要步骤如下:(1)启动服务器

try{

server=newServerSocket(port);//初始化服务器套接字

while(true){socket=server.accept();//等待客户连接

System.err.println(socket.getInetAddress()+"连接\n");//得到客户机地址

Clientclient=newClient(socket);//实例化一个客户线程

clients.addElement(client);//增加客户线程到向量中

client.start();//启动线程

notifyChatRoom();//监视聊天室连接变化

}}catch(Exceptionex){

ex.printStackTrace();//输出出错信息}

(2)更新在线用户

for(inti=0;i<clients.size();i++)//Vector类的size方法返回该向量的大小

{//elementAt方法返回在特定位置的元素,返回的元素为Object对象

Clientc=(Client)clients.elementAt(i);

newUser.append(":"+c.name);//客户端姓名字符串,取得客户端的名字

}sendClients(newUser);//把取得的客户端名字发送给每个客户端

(3)多线程的实现

聊天室的服务器采用多线程实现,每当一个新的用户连接到服务器时,就实例化一个新的线程来与该客户端通信。Client类负责维护客户端的相关信息,比如IP地址、聊天室中的用户名、连接端口等,并实现了信息发送的send方法。主要代码如下。

//得到输入流

BufferedReaderreader=newBufferedReader(newInputStreamReader(s.getInputStream()));

PrintStreamps=newPrintStream(s.getOutputStream());//得到输出流

Stringinfo=reader.readLine();//读取接受到的信息

ps.println(msg);//输出信息

ps.flush();

publicvoidrun(){while(true){

Stringline=null;

try{line=reader.readLine();//读取数据流

}catch(IOExceptionex){

ex.printStackTrace();//输出错误信息

MyChatServer.disconnect(this);//断开连接

MyChatServer.notifyChatRoom();//更新信息

return;}

……

3.2客户端程序编写

254

相关文档
最新文档