1、辽宁工程技术大学毕业设计(论文) I 摘要 随着时代的发展,人们互相交流的方式也在逐渐变化,从原来的面对面,到电话 、手机 , 然后到短信 、 E-mail,再到现在的 QQ、 微信,聊天变得越来越具有实时性和有效性。但是现在聊天软件都必须连接到 Internet 后才能够让人们相互交流。如果用户在工作时候连接网络,有可能因为网络的关系使得工作效率变低;也有可能因为网络的关系,让公司内部的资料被泄露出去,使公司收到损失。因此进行一个在局域网下的聊天工具的设计是很有必要的。 本文介绍了在局域网内实现相互收发消息的基本流程,并且编写了一个基于Socket 的聊天窗口。这个简单的软件采用的是 C/S
2、 结构模式,即客户端 /服务器模式。这个软件可以让 客户端和客户端能够进行通信,服务器端也能够对客户端进行发消息,还能够进行监听客户端的所有消息。 不足之处是只能够启动一个服务器,所有的客户端只能够通过一个端口连接服务器进行通信。如果让客户端不看到不属于这个端口的其它客户发的消息,必须重新定义 Server 端,更改端口。 本文用到了 Sock 编程、多线程、 TCP/IP协议还有图形界面设计的控件编程的知识。 通过对程序进行测试,发现 程序能够在同一个局域网下实现多人通信。 我们也许通过路由器分配的 IP,也可以利用现在流行的“免费 WiFi”,让所有人连接 WiFi,这样,也会给每个客户端
3、分配 IP 地址,这样也就有了局域网,它并不需要外网的帮助。 关键词:局域网; Socket;多线程; TCP/IP 常城: 基于 Java_Socket 通信程序设计 II Abstract With the development of the times, the communication mode of people is changed gradually. Yesterday, we communicated with each other face to face, then we tell something to others using telephone, cellph
4、one, and then using message, e-mail. Now we tell something to each other with QQ, MSN and wechat. Communication becomes more and more real-time and ephemeral. But the software we used should depend on the Internet. If not, they are nothing. If we connect the Internent during working, we may not devo
5、te ourself into our jobs. And also, the important information may be leaked to let the company lost money. So it is important to design a software about chating in the LAN but not on the Internet. This paper intruduce that people send messages to each other in the local area network. And Programming
6、 the chat window based on the Socket. This simple application use the C/S model. The C/S model is Client/Server model. This application can let the different client sends or receives messages. Server can send message to every client and it can get all messages of every client sends. There is a weak
7、point that people can just start one server. All clients should use the port the server given. If we want to divide people, we should change the port and copy another “Server” code to start new server, then some people use this server and others use another server. This paper uses the knowledges abo
8、ut the Socket programming, multithreading, TCP/IP protocol and the control programming about the GUI. When tested, the application can let multi clients send or receive messages. We may use the IP that the router gives us, we can also use the “Free-WiFi” that is popular now to let everyone connect t
9、he WiFi, then everybody has one IP. People have a local area network and it does not need the Internet. Key words: Local Area Network; Socket; Multithreading; TCP/IP 辽宁工程技术大学毕业设计(论文) 目录 引言 . 1 1 实现原理 . 2 1.1 C/S 结构 . 2 1.2 TCP/IP 协议 . 4 1.3 套接字 . 5 1.4 多线程 . 6 1.5 Socket的同步和异步方式 . 8 1.6 用 Socket开发的
10、C/S 模型 . 8 2 总体设计 . 9 2.1 程序实现原理 . 9 2.2 C/S 架构设计 .10 2.3 数据流图 .11 3 模块设计 .12 3.1 系统的总体流程图 .12 3.3 上传文件 .14 3.4 下载文件 .15 3.5 服务器和客户端图形界面的的详细设计 .17 3.6 服 务器等待连接的详细设计 .20 3.7 监听端的详细设计 .21 3.8 客户端发送消息内容以及连接服务器程序 .22 3.6 获得客户端 ip.22 4 系统测试 .23 4.1 聊天程序测试 .23 常城: 基于 Java_Socket 通信程序设计 4 4.2 上传与下载程序测试 .26
11、 致谢 .28 参考文献 .29 附录 A .30 附录 B .43 辽宁工程技术大学毕业设计(论文) 1 引言 近年来,随着科技的不断进步,网络也在快速向前发展着。 企业为了高效迅速并且安全地处理各种事情,它们越来越多地使用局域网来工作而不用外部网路。因为局域网能够提高信息传输效率,简化信息的传递途径,这样便能够提高工作效率。还有一个原因是使用 Internet 传递信息,这些信息有可能会泄露出去,对企业产生危害。基于这种情况,局域网聊天工具就出现了。 本文的通信程序设计采用的是基于 Socket 的局域网通信工具的设计。如果通信软件是基于 Socket 的,那么它可以利用局域网传递信息,给
12、企业提供高效率、安全的通信机制。还有一个优点是,使用基于 Socket 的软件可以不需要对企业原有的网络进行改动,因此不需要什么实现的成本 1。 Socket 其实不仅能够用于传递文字信息,还能够传输文件,这样的话,它也就可以对视频、音频进行传输。因此它的应用范围就不会那么局限了。这也是它能够让大众接受的原因之一。 当下有很多聊天软件,例如腾讯 QQ、 微信 、 MSN。 QQ 在前几年到现在都是很受欢迎的软件,基本每个人都会有至少一 个 QQ 账号。在此,就选取它来进行大体研究,看看它是如何实现单人和单人以及在组群中聊天的。 通过网络上的信息,可以了解到 QQ 是以多服务器提供服务、服务器总
13、控客户端、客户端之间 UDP 直接通信的,并且 仅仅是在两个客户端之间没有建立过连接时候,才会利用服务器对客户端的信息进行转发。在这种模式下,服务器主要是用来处理客户端各种状态的控制,这么做能够很大程度上减少服务器的工作量。但是这里面的实现是比较复杂的。此次课程设计完成了一个 Server 可以让多个 Client 和它建立链接并且相互发送信息的程序,并不需要那么复杂,因 此还是利用了这种 C/S结构。 常城: 基于 Java_Socket 通信程序设计 2 1 实现原理 本次通信程序的实现用的是 Java 语言。 Java 是一种可以编写跨平台应用软件的面向对象的程序设计语言,网络应用是 J
14、ava 语言取得成功的领域之一,它己经成为现在Internet 上最流行的一种编程语言。网络编程的目的就是直接或间接地通过网络协议与其它计算机进行通讯。两台计算机通讯需解决两个主要问题:一是如何准确定位网络上的主机;二是找到主机后如何可靠有效地进行数据传输 。 2 Java 语言作为网络编程语言,提供了强大的网络编程接口。针对网络通信的不同层次, Java 提供的网络功能 的类有四种,它们分别是 InetAddress、 URL、 Socket 和Datagramo。 Socket 是 Internet 使用的协议组 TCP/IP 的组合,实现了两台主机之间通过端口进行网络通信。 J 包中提供
15、 Socket 类,隐藏了 Socket 的实现细节,不需要开发者编写接口程序,而可以快速的实现网络的通信。 3 1.1 C/S 结构 Client/Server 结构 ( C/S 结构) 是大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到 Client 端和Server 端来实现,降低了系统的通讯开销。 当下的很多软件 都是 基于 Client/Server 形式的两层结构, 这是因为现在的软件和应用系统都在想着分布式的 Web 应用发展,而C/S 结构对此很有优势。举个例子,大家都只到 QQ,那么也应该知道 WebQQ。如果QQ 需
16、要更新,那么我们每个客户端都需要进行接入网络然后进行更新,才可以享用新版本,但是 WebQQ 只需要服务器端进行更新即可,根本不需要使用者做更新的操作。专业地来讲, Web 和 Client/Server 应用都可以进行同样的业务处理,应用不同的模块共 享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。C/S 结构的优点是能充分发挥客户端 PC 的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。缺点主要有以下几个: (1)只适用于局域网。而随着互联网的飞速发展,
17、移动办公和分布式办公越来越普及,这需要我们的系统具有扩展性。这种方式远程访问需要专门的技术,同时要对系统进行专门的设计来处理分布式的数据。 (2)客户端需要安装专用的客户端软件 。首先涉及到安装的辽宁工程技术大学毕业设计(论文) 3 工作量,其次任何一台电脑出问题,如病毒、硬件损坏,都需要进行安装或维护。还有,系统软件升级时,每一台客户机需要重新安装,其维护和升级成本非常高。 (3)对客户端的操作系统一般也会有限制。可能适应于 Win2000 或 WindowsXP,但不能用于Windows7。或者不适用于微软新的操作系统等等,更不用说 Linux、 Unix等。 4 C/S 架构软件的优势与
18、劣势:( 1)应用服务器运行数据负荷较轻。最简单的 C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。 二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。( 2)数据的储存管理功能较为透明。在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独
19、立进行的,前台应用可以违反的规则,并且通常 把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在 C/S 体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。( 3) C/S 架构的劣势是高昂的维护成本且投资大。首先,采用 C/S 架构,要选择适当的数据库 平台来实现数据库数据的真正“
20、统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。其次,传统的 C/S 结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要 5。 常城: 基于 Java_Socket 通信程序设计 4 1.2 TCP/IP 协议 网际协议 IP 是 T
21、CP/IP 的心脏,也是网络层中最重要的协议。 IP 层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层 -TCP(The Transmission Control Protocol)或 UDP(User Datagram Protocol)层;相反, IP 层也把从 TCP 或 UDP 层接收来的数据包传送到更低层。 IP 数据包是不可靠的,因为 IP并没有做任何事情来确认数据包是否按顺序发送的或者被破坏。 IP 数据包中含有发送它的主机地址(源地址)和 接收它的主机的地址(目的地址)。如果 IP 数据包中有已经封好的 TCP 数据包,那么 IP 将把他
22、们向 上 传送到 TCP 层。 TCP 将包排序并进行错误检查,同时实现虚电路间的连接。 TCP 数据包中包括序号和确认,所以未按照顺序收到的包可以被排序,而损坏的包可以被重传。 UDP 与 TCP 位于同一层,但对于数据包的顺序错误或重发。因此, UDP 不被应用于那些使用虚电路的面向连接的服务 UDP主要用于那些面向查询应答的服务。 TCP 和 UDP 服务通常有一个客户 /服务器的关系 6。 端口被客户程序或服务进程用来发送和接收信息。一个端口对应一个 16 比特的数。服务进程通常使用一个固定的端口,例如, SMTP 使用 25。这些端口号是“广为人知”的,因为在建立与特定的主机或服务的
23、连接时,需要这些地址和目的地址进行通讯。 程序中,下载文件的程序设计用的是 UDP 协议,因此有时候会传输失败,这是有原因的。 ( 1) 发送频率过高导致丢包。很多人会不理解发送速度过快为什么会产生丢包,原因就是 UDP 的 SendTo 不会造成线程阻塞,也就是说, UDP 的 SentTo 不会像TCP 中的 SendTo 那样,直到数据完全发送才会 return回调用函数,它不保证当执行下一条语句时数据是否被 发送。( SendTo 方法是异步的)这样,如果要发送的数据过多或者过大,那么在缓冲区满的那个瞬间要发送的报文就很有可能被丢失。至于对“过快”的解释,作者这样说:“ A few p
24、ackets a second are not an issue; hundreds or thousands may be an issue.”(一秒钟几个数据包不算什么,但是一秒钟成百上千的数据包就不好办了)。 ( 2) 报文过大丢包。至于报文过大的问题,可以通过控制报文大小来解决,使得每个报文的长度小于 MTU。以太网的 MTU通常是 1500 bytes,其他一些诸如拨号连接的网络 MTU 值为 1280 bytes,如果使用 speaking 这样很难得到 MTU的网络,那么最好将报文长度控制在 1280 bytes 以下。 ( 3) 发送方丢包。发送方丢包:内部缓冲区( inter
25、nal buffers)已满,并且发送速度过快(即发送两个报文之间的间隔过短);接收方丢包: Socket 未开始监听; 虽然 UDP 的报文长度最大可以达到 64 kb,辽宁工程技术大学毕业设计(论文) 5 但是当报文过大时,稳定性会大大减弱。这是因为当报文过大时会被分割,使得每个分割块(翻译可能有误差,原文是 fragmentation)的长度小于 MTU,然后分别发送,并在接收方重新组合( reassemble),但是如果其中一个报文丢失,那么其他已收到的报文都无法返回给程序,也就无法得到完整的数据了 7。 1.3 套接字 套接字 (Socket)是通信的基础,它是支持 TCP/IP 协
26、议的网络通信基本单元。我们可以将套接字看作为不同的主机进行双向通信的端点,它让主机间产生了联系。套接字存在于通信域里。通信域通常和与它在同一个域里的套接字交换数据。各种进程利用相同的域通过 Internet协议簇进行通信。 套接字可以根据通信性质分类,这种性质对 于用户是可见的。应用程序一般仅在同一类的套接字间进行通信。不过只要底层的通信协议允许,不同类型的套接字间也照样可以通信 8。套接字有三种不同的类型:流套接字、数据报套接字和原始套接字。流套接字( SOCK_STREAM):流套接字用于提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。流套接字之
27、所以能够实现可靠的数据服务,原因在于其使用了传输控制协议,即 TCP 协议。数据报套接字( SOCK_DGRAM):数据报套接字提供了一种无连接的服务。该服务并不能保证数据传输的可靠 性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。数据报套接字使用 UDP 协议进行数据的传输。由于数据包套接字不能保证数据传输的可靠性,对于有可能出现的数据丢失情况,需要在程序中做相应的处理。原始套接字( SOCK_RAW)与标准套接字(标准套接字指的是前面介绍的流套接字和数据报套接字)的区别在于:原始套接字可以读写内核没有处理的 IP 数据包,而流套接字只能读取 TCP 协议的数据,数
28、据报套接字只能读取 UDP 协议的数据。 9因此,如果要访问其他协议发送数据必须使用原始套接字。套接字的工作原理 可以简单描述:要通过互联网进行通信,你至少需要一对套接字,其中一个运行于客户机端,我们称之为 ClientSocket,另一个运行于服务器端,我们称之为 ServerSocket。根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。所谓服务器监听,是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。所谓客户端请求,常城: 基于 Java_Socket 通信程序设计 6 是指由客户端的
29、套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它 要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。所谓连接确认,是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处 于监听状态,继续接收其它客户端套接字的连接请求 10。 1.4 多线程 CPU 生产商为了提高 CPU 的性能,通常做法是提高 CPU 的时钟频率和增加缓存容量。不过目前 CPU的频率越来越快,如果
30、再通过提升 CPU频率 和增加缓存的方法来提高性能,往往会受到制造工艺上的限制以及成本过高的制约。尽管提高 CPU 的时钟频率和增加缓存容量后的确可以改善性能,但这样的 CPU 性能提高在技术上存在较大的难度。实际上在应用中基于很多原因, CPU 的执行单元都没有被充分使用。如果CPU 不能正常读取数据(总线 /内存的瓶颈),其执行单元利用率会明显下降。另外就是目前大多数执行线程缺乏 ILP( Instruction-Level-Parallelism,多种指令同时执行)支持。 11这些都造成了目前 CPU 的性能没有得到全部的发挥。因此, Intel 则 采用另一个思路去提高 CPU 的性能
31、,让 CPU 可以同时执行多重线程,就能够让 CPU 发挥更大效率,即所谓“超线程 ” ( Hyper-Threading,简称“ HT”) 技术。超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了 CPU 的闲置时间,提高的 CPU的运行效率。采用超线程即是可在同一时间里,应用程序可以使用芯片的不同部分。虽然单线程芯片每秒钟能够处理成千上万条指令,但是在任一时刻只能够对一条指令进行操作。而超线程技术可以使芯片 同时进行多线程处理,使芯片性能得到提升。超线程技术是在一颗 CPU同时执行多个程序而共同分享一颗 CPU内的资源,理论上要像两颗 CPU 一样在同一时间执行两个线程, P4 处理器需要多加入一个 Logical CPU Pointer(逻辑处理单元)。因此新一代的 P4HT的 die的面积比以往的 P4增大了 5%。而其余部分如 ALU(整数运算单元)、 FPU(浮点运算单元)、 L2Cache(二级缓存)则保持不变,这些部分是被分享的。虽然采用超线程技术能同时执行两个线程,但它