基于JavaSocket多客户端并发通信聊天程序的设计与实现_第1页
基于JavaSocket多客户端并发通信聊天程序的设计与实现_第2页
基于JavaSocket多客户端并发通信聊天程序的设计与实现_第3页
基于JavaSocket多客户端并发通信聊天程序的设计与实现_第4页
基于JavaSocket多客户端并发通信聊天程序的设计与实现_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

11引言Java是一种可以编写跨平台应用软件的面向对象的程序设计语言,网络应用是Java语言取得成功的领域之一,它已经成为现在Internet上最流行的一种编程语言。网络编程的目的就是直接或间接地通过网络协议与其它计算机进行通讯。两台计算机通讯需解决两个主要问题:一是如何准确定位网络上的主机;二是找到主机后如何可靠有效地进行数据传输。Java语言作为网络编程语言,提供了强大的网络编程接口。针对网络通信的不同层次,Java提供的网络功能有四大类:InetAddress、URL、Socket、Datagram。Socket是Internet使用的协议组TCP/IP的组合,实现了两台主机之间通过端口进行网络通信。J包中提供Socket类,隐藏了Socket的实现细节,不需要开发者编写接口程序,而可以快速的实现网络的通信。[1]Socket的通信Socket通信机制在Java中,可以使用两种Socket方式,即流式Socket和数据报式Socket。流式Socket提供了双向的、有序的、无重复、可靠的的数据流服务,采用的是一种TCP协议。数据报式Socket支持双向的数据流,但不保证是可靠的、有序的、无重复的传输,采用的是UDP协议。[1]两种Socket相比较而言,流式Socket具有较高的安全性,但有一定的额外开销。而数据报式Socket与之相反。笔者根据实际情况采用的是流式Socket方式。基于TCP协议的流式Socket实现网络通信的类有两个:在客户端的Socket类和在服务器端的ServerSocket类。无论一个Socket通信程序的功能多么齐全,程序多么复杂,Socket基本结构都是一样的,都包括以下四个基本步骤:(1在客户端和服务器端创建Socket和ServerSocket实例;(1(1启动服务器(2打开连接到Socket的输入/输出流;(3利用输入/输出流,按照一定的协议对Socket进行读/写操作;(4关闭输入/输出流和Socket。Socket通信机制框图见图1。Socket的多客户端并发通信支持多个客户端的Socket通信实现方法有多种:方法一,在一台计算机上一次启动多个服务器程序(端口号必须不同;方法二,将服务器程序写成多线程的,不同处理线程为不同的客户服务,主线程只负责循环等待,处理线程负责网络连接,接收客户输入的信息。实现多个客户与服务器并发通信,就像服务器与自己连接一样,笔者认为最好引入多线程机制。多线程正好是Java提供的一个重要机制,支持多个程序并发执行。服务器端每当建立一个新的Socket连接,主线程就启动一个新的线程,负责服务器与客户端的通信;而主线程继续等待下一个客户端的连接。当客户端断开连接后,子线程释放其占用的所有Socket资源[3]。多线程支持多客户端的具体框图见图2。多客户端聊天程序的设计系统主要分为两大部分:TCP服务器Server和客户端Client。服务器端程序编写服务器端等待用户连接,如有用户发送连接请求后,创建一个用户实例,记录客户端的相关信息,维护与该用户的连接。根据聊天的接收人信息,再将接收的数据传输给客户端。当用户断开连接时,关闭用户实例,断开此用户连接。[2]主要步骤如下: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{//elementAt方法返回在特定位置的元素,返回的元素为Object对象Clientc=(Clientclients.elementAt(i;newUser.append(":"+;〃客户端姓名字符串,取得客户端的名字}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(3监听线程的实现(1界面设计(代码略(2事件处理建立连接的事件处理代码:try{if(socket==null{socket=newSocket(InetAddress.getLocalHost(,5656;//实例化一个套接字ps=newPrintStream(socket.getOutputStream(;〃获取输出流StringBufferinfo=newStringBuffer("INFO:";Stringuserinfo=jTextField1.getText(+":"+InetAddress.getLocalHost(.toString(;ps.println(info.append(userinfo;//输出信息ps.flush(;listen=newListen(this,jTextField1.getText(,socket;//实例化监听线程listen.start(;/启动线程}}catch(Exceptionex{}发送信息的代码:if(socket!=null{StringBuffermsg=newStringBuffer("MSG:";Stringmsgtxt=newString(jTextField2.getText(;ps.println(msg.append(jTextField2.getText(;//发送信息ps.flush(;Listen类用于与服务器进行通信,并维护一些连接信息。部分代码如下。publicListen(MyChatClientp,Stringn,Sockets{publicvoidrun({Stringmsg=null;while(socket!=null{try{msg=reader.readLine(;〃读取服务器端传来信息}catch(IOExceptionex{client.disconnect(;//出错则断开连接}if(msg==null{/从服务器传来的信息为空则断开此次连接client.listen=null;client.socket=null;client.list1.removeAll(;return} }}运行

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论