您的当前位置:首页正文

用Java Socket实现网络聊天室

2022-12-16 来源:钮旅网
维普资讯 http://www.cqvip.com

嗣曩时叠  ̄3ava Socket IRC服务器上,就可阻与登录在同一IRC 服务器上的客户进行交谈.这也就是平 实现网络聊天宣 Socket是进行网络通信编程的 API.也是unix、1inux、wi ndows等 常所说的聊天室,其大部分是由cgi或 asp开发的,java socket编写的聊天 室程序应该与它们的运行机翩是相同 的,只是实现方法不同 井绑定到一个端L『,开始监听客户的请 求。 ServerS0cket server=nul1: Socket socket=nul1, 首先分析一下聊天室的基本功能需 求 操作系统的通用网络编程标准。在网络 编程中最常用的方案便是客户/服务器模 1 服务器端:等待用户进入, 型。奉文提出了在客户机/服务器模型 下用java socket实现Internet巾常见 的聊天室软件的解决方案。 一、Socket简介 Socket实际在计算机中提供了一个 通信端口,可以通过这个端口与任何一 个具有Socket接口的计算机通信。『盏用 程序在网络上传输,接收的信息都通过 这个Socket接口来实现。在应用开发中 就像使用文件句柄一样,可以对Socket 旬柄进行读.写操作。 Socket的原意为插口的意思.就 像电源插座,当插头插入插座,就建 立了连接,相应的电器就可以工作了。 Socket服务程序也是一样的,当客户 端程序连接到服务端程序时,也就建立 了一个双向通信连接,客户就可以访问 服务器的资源.同时得到相应的服务。 如睹络上最通用的te1net、ftp等.就 是基于socket的服务程序,同一台主机 可以提供多种服务,但他们并不冲突. 只因为他们的通信端口不同,如http服 务的端口为80端口.telnet为23端口, ftp为21端口。通常.从0—1023的端 L『号为系统保留.大于1023提供给应用 程序使用。 Java是如夸睹络中最风靡的一种语 言,不论是其语言的面向对象设计思 想、其相关睹络开发工具:J S P、 serv1et、javaBean,还是结构体系如 rmi、Ejb、J2EE等,都对网络的发展 起到了巨大的推进作用 与此同时JDK 开发工具包对socket编程提供了强有力 的支持。使程序员更容易编写socket的 客户/服务器程序,不必再面对利用C 语言进行socket的编程时的多而复杂的 函数。我们只需要简单的利用java net包下的Socket和ServerSocket 类,就完垒可以了。 二、基于JAVA SOCKET的客户服务 程序 首先,ServerSocket粪实例化, tryi server tlew ServerSocket (44O0): SOCket server.aceept(). }catch(Exception e)I System.out.println( Error: e : } 然后,客户端实例Socket类.同 时传入主机的ip地址和服务端u号,此 时客户端向主机发送连接请求 tryI Socket cLlent=new Socket ( LocalHost .44O0): }catch(Exception e){ System out.priatln( Error: e): } 如主机接收到此请求.则通信建 立.服务端产生一个Socket实例.同 此客户端进行通信,如上。 然后客户端和服务端分别打开相应 的输入输出流进行数据传送。 PrintStre&hi os:new FrintStream(new BufferedoutputStream (socket.getOutputStream 0)): DatalnputStream is new DatalnputStrea ̄l(socket getlnputStream()): 在会话结束时,要关闭相应的输入 输出流和各自的Socket,以正常退出连 接。 os.c1ose0: iS.C1ose0 ocket.c1ose(): 其结构模式,在各种客户/服务器 程序中是基本相同的.不同的只是如何 处理输入、输出流进行数据交换。 三、聃天室应用程序的功能分析 Internet上可以提供一种叫IRC的 服务。使用者通过客户端的程序登录到 如果有新用户登陆,在服务器端注册此 用户,同时产生一个Session(会话)维 持与用户连接。如果有用户说话,则 将说话的内容发送给每一个在线的用 户 当用户差闭客户端退出时.结束 与用户的会话.在服务器端注销此用 户 2.客户端:提供良好的用户界 面.便于用户进行连接、交谈 当与 服务器建立连接后.告诉服务器自己的 用户名,同时自动告知服务器新用户进 入,当j黾出时自动告知服务器用户退 出。此外客户端还必须时刻检铡服务器 端有无数据发出,如有则接收数据, 更新显示。 四、聊天室应用程序类音9规划 经过分析笔者主要确定了如下类: 服务器端: SocketServer类:服务器端的主 服务类.是服务器程序的入口。等待 客户端的连接.对客户进行注册和注 销,维护所有客户端的会话,以及客 户端、服务器端会话线程的启动。 Sessi0R类:客户端、服务器端 会话主体.本身是个线程,可以由 socketserver启动。通过对输入输出流 的控制来处理与客户端的信息交互.负 责把每个客户的信息发布给所有在线的 客户.在客户端差闭时结束服务器端的 Socket。 客户端 oScketClient类:客户端的主服 务类,负责向服务器申请连接、发送 交谈信息.在客户端关闭时结束客户端 的Socket。 C1i entFrame类 用户界面类. SocketC1 lent类的子类,是客户端程序 的入I]。处理所有用户输入校验,及 对事件进行相应处理.接收服务器消息 线程的启动。 C1ientReceiver类:接收服务器消 息类,当收到数据时更新界面显示. ● 维普资讯 http://www.cqvip.com

曩蠕时寰 国内著名服务器厂商深圳宝德科技 宣布即将推出Powtel系列服务器新品, 这些服务器全部基于Intel至强(Xeon) 处理器,是全球新一代至强服务器,预 计将有3个系列15款服务器产品面市。 基于新至强的Powtel服务器的推出,标 志着全球第一台新一代至强服务器在中 国的诞生。 必定会影响到世界服务器厂商的产品取 向。 能。它的二级高速缓冲存储器,其运 行速度与处理器内核相同,这使得向处 在与I ntel多年合作的基础上,宝 德科技与Intel的研发部门多次沟通, 经过潜心研究开发出了基于新至强 (x e o n)的服务器产品 据悉,宝德 此次推出的新品在技术上作了很多改 理器内核传送的数据量达到了前所未肯 的程度 通过高容量的多事务处理系统 新Intel至强处理器是完仝采用 总线,实现了与系统其它部分的数据麸 享:而多任务处理系统总线是一项突破 性的技术,使系统的其余部分也有可能 l ̄tel P4架构体系 以Foster为核心 的全新服务器处理器据舟绍,2002年 Intel重新规划了其计算机芯片的蓝围, 拉开主要面向桌面个人电脑的Pentium系 列处理器和主要针对服务器和专业工作 站市场的至强(xeon)处理器之阃在 进,例如,在此之前的至强服务器部 是基于4U产品,因为工作功率、电 压、散热等方面部达不到要求,只能 采用插槽式架构.这就造成产品体积过 大。而现在宝德在散热、核心技术和 实现较高的处理速度。可供寻址和高速 缓存用的内存容量更高,从而提高对绝 大多数高级应用软件的处理性能和数据 吞吐量 系统总线支持同时处理多项未 完成事务,从而使可用带宽增加 支 持多达8个处理器的多处理系统,而且 各个处理器都能充分发挥效率 这样的 系统总线宴现了低成本的4通道、8通 道对称多处理,并使得针对多任务操作 系统和多线程应用软件的性能得到大幅 度加强。另外, 强(X e o n)还具 性能上的距离,使它们各有所专,各 犀其用。在推出面向个人电脑的 Pentium 4之后,Intel针对服务器和 工作站市场专门开发了新一代至强 (Xeon)处理器,也称Fost er 与 服务器整体架构设计等方面部有了报大 提高,将产品改成钳插槽式,将双路 至强压到i u、2u中 宝德新一代至强 服务器有2路、4路、8路产品可供选 择。 基于新 强(Xeon)处理器的服 PentiumⅢ至强相比,Foster在性能上 有了革命性的变化。业内人士认为: 新至强(Xeon)将会成为IA服务器今 务器能在具有可扩展性和可维护性的结 构中为执行大量计算任务提供更高的性 有先进的管理特性,譬如:热敏传感 器、控错纠错(ECc)、功能冗余检查、 系统管理总线等等。 后的一个新标准,Intel的芯片新蓝图 本身是个线程,可以由C1ientFrame启 动 整体框架如下图所示: &l S口, r 一Session S=new Session 流将消息发出。当客户端退出时调用 SocketServer的静态方法unreg ̄ster 0, 从SoeketServer中的hashtable中注销 客户。 客户端实例化SocketClient类,初 (socket): String user=s.readWords(): Integer sessioolD=new Integer (number++): s.setUserName(user): S setSessi0nID(sessionlD): 始化界面 当用户申请连接时,客户端 实例化SocketCl ient类并连接到服务器 然后实例 ClientReceiver类,并启 动线程,监听所有的服务器消息,当用 if(regi ster(session[D,s)){ Thread thread new Thread(s): thread.start(): 户发信息时,调用SocketClient中的 sendMsg 0方法发出 客户端的界面,及实现后的结果如 图所示: 五、聊天室应用程序的实现 当某~个Session实例,监听到客 服务器端实倒化ServerSocket类, 然后调用accept 0方法,等待客户端的 户发言后,需要把其发布给所有在线客 户,如下: Rashtable h SocketServer. elients: 连接。如有客户申请连接,就创建一 个Sessio[]实例,然后调用readWords ()方法取得用户的同名,同时为用户分 配一个唯一的会话号sessionlD,将网 Enumeration e=h.keys【): while(e.has ̄oreElements()){ Integer id=(Integer)e. nextElement() 名和会话号存入Session实例中。接着 调用register()方法把Session实例登 记到服务器中,笔者用一个公麸静态的 陆shtab1e来存放与所有客户联接的 Session实例,其key值是sessionlD, value值是Session实饿。当注册成功, 启动Session线程与客户通信。代码如 下: Sessio[]s=(Session)h.get(id) s.writeWords(user ̄ : ): } 其中elients为SocketServer中的 Hashtable实例,保存所有客户的 Session。wr itelords 0方法调用输出 (程海鹰刘华毅) o 

因篇幅问题不能全部显示,请点此查看更多更全内容