基于TCPIP的局域网多用户通信
- 格式:doc
- 大小:83.00 KB
- 文档页数:10
TCPIP协议介绍协议名称:TCP/IP协议1. 引言TCP/IP协议是互联网上最常用的协议之一,它是一个基于分组交换网络的通信协议集合。
本协议旨在提供可靠的数据传输和网络通信,使得不同计算机和网络设备能够相互通信并共享资源。
2. 协议概述TCP/IP协议是由两个主要协议组成的,即传输控制协议(TCP)和互联网协议(IP)。
TCP负责数据传输的可靠性和流控制,而IP则负责数据在网络中的路由和寻址。
3. TCP/IP协议的层次结构TCP/IP协议采用了分层结构,共分为四个层次,分别是应用层、传输层、网络层和数据链路层。
3.1 应用层应用层提供了各种网络应用程序的接口,例如HTTP、FTP、SMTP等。
它负责处理应用程序之间的通信和数据交换。
3.2 传输层传输层主要负责提供端到端的数据传输服务。
其中最常用的协议是TCP和UDP。
TCP提供了可靠的、面向连接的数据传输服务,而UDP则提供了无连接的、不可靠的数据传输服务。
3.3 网络层网络层负责数据在网络中的路由和寻址。
其中最常用的协议是IP协议。
IP协议使用IP地址来标识网络中的设备,并通过路由器将数据包从源地址传输到目的地址。
3.4 数据链路层数据链路层负责将数据包从一个节点传输到相邻节点。
它负责将数据包封装成帧,并通过物理介质进行传输。
4. TCP/IP协议的特点4.1 网络互连性TCP/IP协议具有很强的网络互连性,可以连接不同类型的计算机和网络设备,实现网络的互联互通。
4.2 可靠性TCP/IP协议通过TCP协议提供可靠的数据传输服务。
TCP使用序列号和确认机制来确保数据的完整性和可靠性。
4.3 灵活性TCP/IP协议具有很高的灵活性,可以根据不同的需求进行配置和扩展。
它支持各种应用层协议,并且可以在不同网络环境中运行。
4.4 开放性TCP/IP协议是一个开放的协议,它的标准和规范公开可用,并且可以由任何人进行实现和使用。
5. TCP/IP协议的应用TCP/IP协议广泛应用于互联网和局域网中。
计算机网络中的TCPIP协议计算机网络中的TCPIP协议是一种基于互联网通信的协议套件。
它由两个独立的协议组成,分别是传输层协议TCP(Transmission Control Protocol)和网络层协议IP(Internet Protocol)。
这两个协议相互配合,共同实现数据在网络中的传输和路由功能。
一、TCP/IP协议的起源和发展TCP/IP协议套件起源于20世纪70年代的美国,当时主要用于军事和科研领域的计算机网络。
随着互联网的迅猛发展,TCP/IP协议逐渐成为网络通信的标准,广泛应用于全球范围内的计算机网络中。
二、TCP/IP协议的基本原理TCP/IP协议是一种面向连接的协议,主要用于保证数据在传输过程中的可靠性和完整性。
它通过数据分段和流量控制等机制,确保数据能够有效地从发送方传输到接收方。
同时,TCP/IP协议也支持多种应用层协议,如HTTP、FTP、SMTP等,使得不同类型的数据能够在网络中得到传输和处理。
三、TCP/IP协议的分层结构TCPIP协议按照不同的功能划分为四个层次,分别是物理层、数据链路层、网络层和传输层。
物理层主要负责将数据转化为适合传输的信号,数据链路层实现数据的分组和传输,网络层负责数据的路由和转发,传输层则负责数据的可靠传输和错误控制。
四、TCP/IP协议的工作原理TCP/IP协议的工作原理可以简单概括为以下几个步骤:首先,应用层将数据传输给传输层,传输层通过将数据分段,并为每个数据段加上序号和检验码等信息,以确保数据的完整性和正确性;接着,网络层将传输层的数据段封装成IP包,并通过路由选择算法确定数据包的传输路径;最后,数据链路层将IP包封装成帧,并利用物理层的传输介质将数据发送给接收方。
五、TCP/IP协议的优势和应用TCP/IP协议具有以下几个优势:首先,它是一种开放标准,可以用于不同类型的计算机和操作系统;其次,TCP/IP协议具有较强的可靠性和可扩展性,能够应对复杂的网络环境;此外,TCP/IP协议还支持多种应用层协议,使得不同种类的数据都能够在网络中传输和处理。
TCP/IP 机器参数设置机器TCP/IP 模块的MAC 地址机器TCP/IP 模块的IP 获取方式, 0-Disabled 为关闭自动获取方式,Enabled 为开启自动获取方式机器TCP/IP 模块里的IP 地址机器TCP/IP 模块的通讯端口机器TCP/IP 模块的通讯方式连接超时设置,默认为5机器TCP/IP 模块的设备模式,0-Server 为服务器模式,1-Server or client 为服务器和客户端模式,2-Client 为客户端模式,默认值为0-Server 模式TCP/IP 模块的串口波特率,默认为9600bpsTCP/IP 模块的串口校验,默认为3-MarkTCP/IP 模块的串口数据位,默认值为1-8bist设备从串口获取多少字符后,将数据打包后发送到网络中,默认值为255TCP/IP模块字符间延时,默认为2以上参数匀为默认出厂设置;1.客户要设置只需要改机器模块的IP地址及端口号即可。
2.如要设为升级模式,只要将机器模块通讯方式改成0-UDP的方式即可。
3.机器模块的子网掩码为默认当前网段下的子网掩码一样。
4.设置完以上图中的参数后即可以在同网段下通讯。
二、跨网段设置以TCP/IP方式与上面设置差不多一样,只需要将TCP/IP模块的MAC地址转换成十六进制的MAC地址给网管设置三层交换机里的通行MAC即可。
(注:我们机器的TCP/IP模块里的MAC以十进制的MAC地址表达。
)IP 地址由网管分给后将IP设置到机器的TCP/IP模块中的IP地址即可。
1.如客户需要用到自动获取IP方式只需将DHCP设置项设为Enabled即可。
三、使用TCP/IP通讯方式跨网关或internet(互连网)连接需要在路由路内设通行IP和通行时间段,还要在路由里设端口映射。
具体路由设置以TP-LINK402路由讲解;连接图如下图:CT机器端1.需要在B网关做路由通行IP及通行时间和端口映射,具体设置如下图:通行IP设置,要使机器IP有上互连网的权限,如图的192.168.1.209和192.168.1.210路由IP过滤功到此映身已完成:端口映射所需的端口,这里做了两个端口分别为5000和5001,这里的端口要与机器内所使用的通讯端口一样,分别对应不同的机器IP对应映射端口的IP ,即要映射机器的内网IP 地址设置完后请启用然后保存路由器外网的IP ;由ISD 服务商分配给CT 机器的机号, 这里为5号和6号机机器所在位置的外网IP 地此 这里外网IP 为113.78.0.57机器内的使用端口及映射所用的端器2.内网连接测试点在线检测及取回时间3.外网连接测试点在线测试及取回时间到此所有设置全部完成:这样我们的设备就可以跨互连网连接;。
tcp服务器端使用多线程技术同时与多个客户通信的编程方法在TCP服务器端使用多线程技术同时与多个客户通信,通常需要使用一些编程语言和框架来实现。
以下是一个使用Python和其标准库中的socket 和threading模块来实现的简单示例:```pythonimport socketimport threading创建一个socket对象server_socket = (_INET, _STREAM)绑定到特定的IP地址和端口server_(('',监听连接,最大连接数为10server_(10)存储线程的列表threads = []def handle_client(client_socket):"""处理客户端连接的函数"""while True:接收客户端发送的数据data = client_(1024)if not data:break处理数据...print(f"Received from client: {()}")关闭客户端连接client_()while True:接受客户端的连接请求,并返回一个新的socket对象(用于与该客户端通信)client_socket, address = server_()print(f"Connection from {address} has been established!") 创建新线程来处理这个客户端的连接thread = (target=handle_client, args=(client_socket,))() 开始线程(thread) 将线程添加到线程列表中等待所有线程完成(即等待所有客户端连接关闭)for thread in threads:()关闭服务器端socketserver_()```这个示例创建了一个TCP服务器,它监听本地的12345端口。
基于TCP/IP的局域网聊天室的设计与实现摘要随着计算机网络技术的发展,各种各样基于网络的应用也随之诞生,比如基于互联网的信息发布,通信,数据共享等等。
局域网的发展也同样迅速。
很多政府机构,企业,学校,都是先以一个统一的局域网联结在一起,再分别接入INTERNET.因此基于局域网的即时通信工具,就这样应运而生了。
所以本文提出了一个更加合理的设计,并在WINDOWS平台上加以了实现.在本实现内将客户端和服务端综合在一个程序之内,用多线程实现不同的并行任务。
并进行了人性化的界面设计,使用起来更加简单方便,并且功能十分合理,又易于扩展以及个性化定制。
本文通过局域网聊天系统来具体共享内存实现进程间的数据交换,利用windows消息机制实现进程间的同步,两种机制结合使用。
局域网聊天室作为一种新型的聊天工具可以提供更为及时、可靠、突破了必须有外界网络接入等优点,具有极其广泛的发展前景。
本文介绍了采用JAVA编程开发局域网聊天系统的一套比较常用的解决方案。
采用TCP模式进行文字聊天, 在客户端之间点对点(C/C)的进行。
本系统采用典型的C/S(客户端/服务器)的框架模式,在该方案中采用Socket (套接字)原理实现网络通信,最终实现了通过服务器中转的文字聊天、文件传输功能,从而大大降低了程序的开发难度。
本系统主要包括登陆、聊天、好友列表和服务器管理几个部分。
本系统从需求分析、系统的设计、功能的实现都严格遵循了软件工程设计的思想。
【关键词】Socket;TCP/IP;C/S;局域网聊天室AbstractWith the development of computer network technology, a variety of Web-based applications also will be the birth, such as Internet-based information release, communications, data sharing, and so on. LAN development is quickly. Many government agencies, businesses, schools, are first linked together in a unified LAN, respectively connected to the INTERNET, LAN-based instant messaging tool, and thus came into being. In this paper, a more rational design, in WINDOWS platform to achieve integrated in this realization of the client and server in different parallel tasks within a program, multi-threaded. And the design of user-friendly interface, easy to use and very reasonable, and easy expansion and customization. LAN chat system to a specific shared memory data exchange between process and use the windows message mechanism to achieve inter-process synchronization, the two mechanisms used in conjunctionLAN chat room as a new chat tool that can provide the advantages of more timely, reliable, broke the need of outside network access, has a very wide range of development prospects.This article describes a JA V A Programming LAN chat system, a more common solution. TCP mode, text chat, peer-to-peer (C / C) between the client. The system uses the framework of a typical C / S (Client / Server) mode, the program using the Socket (socket) the principle of network communication, and ultimately the transit through the server, text chat, file transfer capabilities, which greatly reduces the difficulty of program development.The system includes landing, chat, friend lists, and server management of several parts. The system needs analysis, system design, the realization of functions strictly follow the idea of software engineering.【Key words】Socket;TCP/IP;C/S;Local Area Network Chat Room目录第1章引言 (1)1.1课题背景 (1)1.2国内外研究现状 (2)1.3主要内容 (3)第2章局域网聊天室系统分析 (4)2.1系统需求分析 (4)2.1.1功能需求 (4)2.1.2系统基本流程图 (4)2.1.3性能要求 (5)2.1.4测试环境规定 (5)2.2可行性研究 (5)2.2.1成本可行性分析 (5)2.2.2技术可行性分析 (5)2.3系统开发环境的分析 (6)2.4数据流图 (6)2.4.1顶层数据流图 (6)2.4.2一层数据流图 (6)第3章系统设计 (7)3.1设计目标 (7)3.2构建开发环境 (7)3.3系统模块流程图 (7)3.4系统功能模块图 (9)第4章基于Eclipse的聊天室的分析与设计 (10)4.1 TCP套接字的运用 (10)4.2 TCP三次握手协议 (11)4.3程序结构 (11)4.3.1多用户在线方案 (11)4.3.2软件框架 (12)4.4代码实现 (12)4.4.1用户登陆模块 (12)4.4.2用户列表模块 (13)4.4.3文本聊天模块 (15)4.4.4文件传输模块 (17)第5章局域网聊天室系统测试 (20)5.1系统测试结果与分析 (20)5.1.1用户登陆以及用户列表 (20)5.1.2文本聊天 (21)5.1.3文件传输功能 (24)5.2本章小结 (25)结束语 (26)参考文献......................................................... .27致谢. (29)第1章引言1.1课题背景近年来,随着全球信息化进程的不断发展,网络的发展也非常迅速。
TCPIP协议详解及应用随着网络技术的发展,TCP/IP协议成为了互联网的核心协议之一。
本文将对TCP/IP协议进行详细解析,并探讨其在实际应用中的重要性和应用场景。
一、TCP/IP协议概述及工作原理TCP/IP协议是互联网通信的基础协议,它由两个部分组成:传输控制协议(TCP)和互联网协议(IP)。
TCP负责数据的可靠传输,而IP则负责数据包的路由和寻址。
TCP/IP协议的工作原理如下:发送端将数据分割成小的数据包,每个数据包都会被添加上源地址和目标地址等必要的信息。
然后,这些数据包通过IP协议进行传输,根据目标地址信息找到合适的路径进行传送。
接收端根据源地址和目标地址信息,将接收到的数据包重新组装,最终将完整的数据传递给应用程序。
二、TCP/IP协议的主要特点1. 可靠性:TCP通过使用序列号、确认应答、重传机制等方式,确保数据的可靠传输。
2. 高效性:TCP通过流量控制和拥塞控制等算法,避免网络拥塞,提高网络的传输效率。
3. 全球性:TCP/IP协议是全球通用的协议,不受地域限制,可以在任何地方进行通信。
4. 灵活性:TCP/IP协议支持多种网络设备和技术,适用于各种场景,包括局域网、广域网、无线网络等。
5. 扩展性:TCP/IP协议是分层设计的,每一层都可以进行扩展和改进,以满足不同需求。
三、TCP/IP协议的应用场景1. 互联网通信:TCP/IP协议是互联网通信的基础,包括网页浏览、电子邮件、文件传输等,都是基于TCP/IP协议进行传输和交互的。
2. 远程登录:通过TCP/IP协议,用户可以通过网络远程登录到其他计算机,进行远程管理和操作。
3. 文件共享:TCP/IP协议支持文件共享,用户可以通过TCP/IP协议共享和访问其他计算机上的文件和资源。
4. 实时通信:TCP/IP协议也可以用于实时通信应用,如语音、视频会议等,保证通信的实时性和稳定性。
5. 无线网络:TCP/IP协议在无线网络中也起着重要作用,如无线局域网(WLAN)和移动通信网络,都是基于TCP/IP协议进行通信的。
说如何解决多个设备使用同一IP地址的问题IP地址是互联网中设备进行通信的唯一标识,但在一些特殊情况下,多个设备可能会共享同一个IP地址。
这种情况下,会出现一些问题,例如设备之间的通信冲突和数据传输的混乱。
为了解决这个问题,可以采取以下方法:1. 使用网络地址转换(NAT)技术:NAT技术可以将多个设备的私有IP地址转换为公共IP地址。
这样,即使多个设备共享同一个IP地址,也可以在互联网上正常进行通信。
NAT技术的实现可以使用专门的硬件设备,如路由器或防火墙,也可以使用软件解决方案。
2. 使用代理服务器:代理服务器可以充当设备与互联网之间的中间人。
当多个设备使用同一个IP地址时,可以将它们的请求发送到代理服务器上,然后代理服务器将请求转发到目标服务器。
这样可以避免设备之间的冲突,并提高整体的网络性能。
3. 实施子网划分:将局域网划分为多个子网,每个子网使用不同的IP地址范围。
这样,多个设备可以在同一个局域网内使用不同的IP地址,避免冲突。
子网划分可以通过路由器或交换机来实现,并确保子网之间通过路由器进行通信。
4. 使用动态主机配置协议(DHCP):DHCP可以为网络中的设备分配IP地址。
当多个设备共享同一个IP地址时,可以设置DHCP服务器,为每个设备分配独立的IP地址。
这样可以确保设备之间的通信正常进行。
5. 使用虚拟专用网络(VPN):VPN可以在公共网络上创建一个私密的通信通道。
当多个设备使用同一个IP地址时,可以在VPN中为每个设备分配独立的虚拟IP地址。
这样可以实现设备之间的安全通信,并避免IP地址冲突。
以上是解决多个设备使用同一IP地址的几种常见方法。
在实际应用中,可以根据具体需求选择适合的解决方案,并根据网络规模和设备数量进行合理配置和管理,以确保网络的正常运行和设备的正常通信。
通过合理的IP地址管理和网络设置,可以避免设备之间的冲突,提高网络性能和通信效率。
支持多用户的无线通信技术随着移动设备的普及和需求不断增加,无线通信技术成为人们生活和工作中必不可少的一部分。
而随着互联网时代的到来,人们对无线网络的使用需求也越来越多样化,不仅是普通用户,还包括企业、学校、医院等机构,这就需要一种可以支持多用户使用的无线通信技术。
多用户通信技术在无线领域中已经发展了很长一段时间,例如无线局域网和蜂窝网络等,都已经支持多用户连接。
但是我们要讨论的是,如何在无线领域中更好地支持多用户连接,使得用户可以更加轻松地进行网络应用和数据传输。
当前,最为流行的无线通信技术是Wi-Fi和蜂窝网络。
在Wi-Fi中,虽然一个Wi-Fi路由器可以与多个设备建立连接,但如果连接的设备太多,路由器的性能就会受到限制,并且干扰也会增加。
在蜂窝网络中,多用户连接同样会导致网络拥塞和维护成本增加的问题。
那么,我们需要怎样的无线通信技术来解决这些问题呢?有一个新兴的无线通信技术,叫做“多用户多输入多输出”(MU-MIMO)技术。
MU-MIMO技术是一种可以让多个设备同时获取数据传输的技术,可以大大提高网络的吞吐量和性能。
MU-MIMO技术的原理是,通过使用多个天线和信道,将数据分发给多个设备。
与传统的MIMO技术相比,MU-MIMO技术可以同时给多个设备传输数据,且不会降低网络性能。
这极大地提高了网络的传输效率,可以让更多的设备连接到同一个网络上,而不会带来过多的干扰和拥塞。
MU-MIMO技术在无线局域网中的应用已经得到了广泛的认可,主流的路由器和无线接入点都已经开始采用这种技术。
但是在蜂窝网络中的应用还相对较少,主要是因为蜂窝网络的复杂性和多样性使得改变网络架构和升级基站的成本较高。
但是随着5G技术的发展,MU-MIMO技术在蜂窝网络中的应用也将得到更广泛的推广。
总的来说,支持多用户的无线通信技术是未来网络发展的必然趋势。
MU-MIMO技术是目前最为先进的技术之一,可以大大提高网络的吞吐量和性能,为未来的无线通信提供了良好的发展方向。
tcp服务器端使用多线程技术同时与多个客户通信的编程方法-回复TCP服务器端使用多线程技术同时与多个客户通信的编程方法随着互联网的快速发展,网络通信已经成为人们生活中不可或缺的一部分。
TCP(Transmission Control Protocol,传输控制协议)是一种可靠的、面向连接的协议,被广泛用于实现网络通信。
在很多情况下,服务器需要同时与多个客户进行通信,因此,编写一个TCP服务器端程序来实现多客户端的并发访问是非常重要的。
一个常见的解决方案是使用多线程技术。
多线程是指在一个程序中可以同时执行多个线程,每个线程都可以独立地执行指定的任务。
在TCP服务器端程序中,每个客户端连接都可以有一个单独的线程来处理,这样可以同时与多个客户端进行通信,提高服务器的并发处理能力和资源利用率。
下面,我们将一步一步地介绍如何编写一个TCP服务器端程序,使用多线程技术同时与多个客户端通信。
第一步:导入必要的类和库在编写TCP服务器端程序之前,我们首先需要导入必要的类和库。
在Java 语言中,我们需要导入包中的ServerSocket类和Socket类,以及java.io包中的InputStream类和OutputStream类,用于实现Socket的输入输出功能。
第二步:创建服务器端套接字首先,我们需要创建一个ServerSocket对象,用于监听指定的端口号,并等待客户端的连接请求。
例如,可以使用如下代码创建一个服务器端套接字:ServerSocket serverSocket = new ServerSocket(port);其中,port为服务器监听的端口号。
创建服务器端套接字后,服务器就可以开始等待客户端的连接请求。
第三步:等待客户端连接使用accept()方法来监听并接受客户端的连接请求。
该方法将会一直阻塞,直到客户端与服务器建立连接。
一旦接受到客户端的连接请求,accept()方法将返回一个Socket对象,用于与客户端进行通信。
TCP通信服务器连接多个终端的工作原理主要遵循客户端-服务器模型。
服务器作为中央节点,负责处理来自多个终端(客户端)的请求。
以下是其主要步骤:
1. 服务器在特定端口上监听可能的客户端连接。
服务器通过套接字(socket)与端口绑定,进入监听状态。
2. 客户端通过套接字与服务器建立连接。
客户端使用服务器的IP地址和端口号发起连接请求。
3. 服务器接收客户端的连接请求,并建立一个新的套接字与客户端进行通信。
此时,服务器可以继续监听其他客户端的连接请求。
4. 客户端和服务器之间通过新的套接字进行数据传输。
双方可以发送和接收数据,实现双向通信。
5. 当通信结束后,客户端和服务器关闭套接字连接。
资源被释放,以便再次使用。
在这个过程中,TCP协议负责提供可靠的、面向连接的通信服务,确保数据包的正确传输。
服务器通过循环监听和处理来自多个终端的请求,实现与多个终端的通信。
基于TCP/IP的局域网多用户通信作者:华东船舶工业学院机械系袁渊下载本文示例源代码摘要:基于TCP/IP的网络通信技术实现了面向连接的用户与服务器间点对点异步通信,本文在该基础上应用了多线程以及共享数据结构技术,使网络服务器具有了多用户间数据转发的功能,进而解决了局域网多用户间的通信问题。
关键词:TCP/IP;多线程;共享;通信;网络引言由于因特网的迅速流行,越来越多的应用程序具备了在网上与其它程序通信的能力。
从WIN95开始微软把网络功能融进了它的操作系统,使得应用程序网络通信能力更为普及。
因此,微软的TCP/IP协议也就成为网络应用程序基于的首选协议。
一般采用TCP/IP协议的应用程序只实现了单用户与服务器间点对点的连接,而本文在VC6.0的环境下,运用了了多线程以及共享数据结构技术,不仅实现了多用户与服务器间的连接,而且解决了多用户间信息互发问题----依靠服务器的转发功能。
通过本文的阐述,希望能对那些需要编写多用户网络通信程序的读者以启发。
一、技术概述1.1 基于TCP/IP的通信技术基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。
下面简要地讲一下设计思路(VC6.0下):第一部分服务器端一、创建服务器套接字(create)。
二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
三、接受来自用户端的连接请求(accept)。
四、开始数据传输(send/receive)。
五、关闭套接字(closesocket)。
第二部分用户端一、创建用户套接字(create)。
二、与远程服务器进行连接(connect),如被接受则创建接收进程。
三、开始数据传输(send/receive)。
四、关闭套接字(closesocket)。
通过以上设计思路,我们可以创建一个简单的面向连接的单用户程序。
下面,将介绍多线程技术,以使程序支持多用户。
1.2 多线程技术我们可以把线程看成是一个进程(执行程序)中的一个执行点,每个进程在任何给定时刻可能有若干个线程在运行。
一个进程中的所有线程共享该进程中同样的地址空间,同样的数据和代码,以及同样的资源。
进程中每个线程都有自己独立的栈空间,和其它线程分离,并且不可互相访问。
每个线程在本进程所占的CPU 时间内,要么以时间片轮换方式,要么以优先级方式运行。
如果以时间片轮换方式运行,则每个线程获得同样的时间量;如果以优先级方式运行,则优先级高的线程将得到较多的时间量,而优先级低的线程只能得到较少的时间量。
方式的选择主要取决于系统时间调度器的机制以及程序的实时性要求。
现在,运用多线程技术就可以实现对多用户的支持。
即在服务器端,使接收来自用户端的连接请求(accept)这步无限循环,每接收一个用户请求,产生两个线程(send和receive线程),用来管理服务器与该用户的通信任务。
下面,运用共享数据结构技术,就可以实现本问所要解决的关键技术---服务器转发技术。
1.3 共享数据结构技术同一进程中的多个线程共存于单一的线性地址空间,因此,在多线程间共享数据结构是非常容易且方便的。
但必须注意的是,对数据结构的访问必须是多线程互斥的,否则数据任意更改将导致不可预料的结果。
本文所阐述的服务器转发技术也就是通过共享数据结构实现线程间的互相通信。
二、实现方案整体方案的构思图如下:通过上图,我们可以看到整个系统分为三个相关的程序,即注册/登陆服务器、通信服务器以及用户程序。
其中,注册/登陆服务器负责用户的注册、登陆以及数据库管理;通信服务器负责完成数据转发以及共享数据结构的管理;用户端则完成注册、登陆和通信功能。
为什么要把服务器分为两部分呢?主要是考虑到服务器的用户容量问题,以及对通信服务器的保护,只有在通过验证后,用户在能与通信服务器连接。
由此可见,整个系统通信任务的实现还是很复杂的。
用户端首先必须注册自己,等待注册成功;然后根据自己的注册信息进行服务器登陆,登陆成功后才能与通信服务器连接,进行用户间通信。
注册/登陆服务器接收到用户端的信息后,首先判断是注册信息还是登陆信息。
如果是注册信息,则将该数据按预定的格式写入数据库,然后返回注册成功的消息,期间有任何异常产生,服务器都会返回注册失败消息,提示用户重新注册;如果是登陆信息,则从数据中提取用户名和ID与数据库中的内容进行比较,如果该用户存在,则返回登陆成功消息,反之,返回登陆失败消息。
通信服务器所完成的主要功能是数据转发,这是通过与图中的共享数据结构进行交互完成的。
服务器接收到用户端发来的消息后,提取消息的一部分与共享数据结构存储的内容进行比较,确定所要转发的对象,最后通过多线程及其通信机制完成数据转发。
下面,我们将分三部分来讨论系统的具体实现过程。
三、具体实施3.1 注册/登陆服务器注册/登陆服务器程序是基于对话框的,该程序使用I/O端口56789与用户端连接。
首先,在对话框初始化的同时完成网络初始化,即执行Init_net()函数,代码(不完整)如下:BOOL CServerDlg::Init_net(){////////////////////////网络初始化///////////////////////////////addrLen=sizeof(SOCKADDR_IN);status=WSAStartup(MAKEWORD(1, 1), &Data);………memset(&serverSockAddr, 0, sizeof(serverSockAddr));/*以下指定一个与某个SOCKET连接本地或远程地址*/serverSockAddr.sin_port=htons(PORT);serverSockAddr.sin_family=AF_INET;serverSockAddr.sin_addr.s_addr=htonl(INADDR_ANY);serverSocket=socket(AF_INET, SOCK_STREAM, 0);//初始化SOCKET………status=bind(serverSocket,(LPSOCKADDR)&serverSockAddr,sizeof(s erverSockAddr)); //将SOCKET与地址绑定………status=listen(serverSocket, 5); //开始监听………return true;}接着按下RUN键开始服务器功能,执行Reg_Load()函数,使服务器始终处于等待连接状态,但这样也使该线程始终阻塞。
当有用户连接时,该函数创建一个任务用于处理与用户及数据库的事务。
具体任务函数略(详见原始代码文件)。
void CServerDlg::Reg_Load(){while(1){CWinThread* hHandle;clientSocket=accept(serverSocket,(LPSOCKADDR)&clientSo ckAddr,&addrLen); //等待连接,阻塞hHandle=AfxBeginThread(talkToClient,(LPVOID)clientSock et);//有连接时,创建任务………}}任务函数在接收到消息时,要对数据库进行操作,由于数据库较简单,采用ODBC 连接ACCESS数据库(将netuser.mdb在ODBC数据管理器中安装成同名数据源)具体代码略。
3.2 通信服务器通信服务器是本程序实现的关键,它运用共享数据结构技术及多线程技术,通过I/O端口56790与用户端连接,实现了数据转发功能。
首先,程序初始化网络Init_net(),接着当用户连接到服务器时,创建接收线程和发送线程,这样就可以实现数据转发。
最后,当用户断开连接时,服务器关闭与他的连接,并结束相应的线程。
下面我们来看一下本程序中的共享数据结构的具体内容与使用方法以及多线程的相关内容与实现。
● 共享数据结构本程序的共享数据结构一共有两个,即socket_info和send_info。
前者包含了所有登陆用户的一些基本资料,后者则包含了当前服务器接收到的用户端所发送的信息资料。
详细内容及注释如下:struct socket_info{SOCKET s_client; //用户的SOCKET值u_long client_addr; //用户网络地址CString pet; //用户昵称CWinThread* thread; //为该用户创建的发送线程对象的指针};struct send_info{CString data; //用户端发送的数据内容(经过编辑)CWinThread* thread; //需要发送数据的任务指针};在程序中,定义两个全局变量,用来在线程间共享:send_info info_data; CList<socket_info,socket_info&>s_info;每当有用户连接到服务器,服务器就将用户端的一些信息以socket_info结构体的形式存入s_info列表中;而当服务器接收到用户端发送过来的数据时,就将数据格式化后存入结构体info_data,通过与结构体列表比较,确定需要恢复的发送线程(所有发送线程在创建时都被挂起)。
这样,服务器就准确地转了发数据。
●多线程每当服务器上有用户连接成功,服务器都会为其创建两个线程:接收线程(RecvData)和发送线程(SendData),并且接收线程在创建后处于可执行状态,而发送线程则阻塞,等待服务器将其唤醒。
这两个线程都执行一个无限循环的过程,只有当通信出现异常或用户端关闭连接时,线程才被自身所结束,并且,这两个线程一定是同时生成,同时结束的。
很显然,每个连接产生两个线程,使得数据转发变的简单,但同时又使得服务器的任务加重。
因此,用户端的连接数量有所限制,视服务器软、硬件能力而定。
同时,由于多线程对结构体info_data都需要操作,所以线程间必须同步。
这儿,我定义了互斥量CMutex m_mutex,用它的方法Lock()和Unlock()来完成同步。
我们首先来看一下接收线程(RecvData):(不完整代码)UINT RecvData(void* cs){SOCKET clientSocket=(SOCKET)cs;while(1){numrcv=recv(clientSocket, buffer, MAXBUFLEN, NO_FLAGS_SET);buffer[numrcv]=''\0'';if(strcmp(buffer,"Close!")!=0) //不是接收的“Close”数据{…………for(i=0;i<count;i++){if(po!=NULL){s1=s_info.GetNext(po);if(pare(petname)==0) //比较昵称是否一样{m_mutex.Lock();//互锁info_data.data=pos;info_data.thread=s1.thread;m_mutex.Unlock();//解锁}s1.thread->ResumeThread(); //恢复发送相应的线程break;}}}else{…………if(clientSocket==s1.s_client){m_mutex.Lock(); //互锁info_data.data=buffer;m_mutex.Unlock(); //解锁s1.thread->ResumeThread(); //恢复发送相应的线程s_info.RemoveAt(po1); //删除该用户信息break;}………goto aa;}}aa: closesocketlink((LPVOID)clientSocket); //关闭连接AfxEndThread(0,true); //结束本线程return 1;}接下来看一下发送线程(SendData):(不完整代码)UINT SendData(void* cs){SOCKET clientSocket=(SOCKET)cs;while(1){if(info_data.data!="Close!"){m_mutex.Lock(); //互锁numsnd=send(clientSocket,info_data.data,info_data.data.GetLength(),NO_FLAGS_SET); //发送数据now=info_data.thread;m_mutex.Unlock(); //解锁now->SuspendThread(); //自身挂起}else{ goto bb; }}bb: closesocketlink((LPVOID)clientSocket); //关闭连接AfxEndThread(0,true); //结束本线程return 1;}3.3 用户端很显然,用户端不用考虑多线程,网络连接技术也比较成熟,因此在通信方面没有什么难题。