- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于SOCKET的多人聊天室
电子信息与通信工程学院实验报告实验名称多人聊天软件课程名称计算机网络姓名顾康学号U201413323日期12月6日地点成绩教师刘威实验背景Client/ Server 结构在 TCP/IP 网络环境下,不同主机上的两个应用程序间通信普遍采用客户机服务器模型(client/server architecture, C/S).即通信双方一方作为服务器等待客户提出请求并予以响应,客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络接口,一旦有客户请求,就启动一个服务进程来响应客户,同时自己继续监听服务端口,使后续客户也能及时得到服务。采用这种模型主要是由于网络中主机的软硬件资源、运算能力和信息分布不均匀导致的,当需要信息共享时,运算能力强、拥有众多资源的主机就作为服务器对外提供服务,资源相对较少的主机就成为客户机通过请求获得所需资源。本编程训练的目的之一是通过编程了解客户机-服务器结构的网络通信模型。Socket编程本实验使用的语言为python, 目的是便于建立线程。而python的Socket 功能包含于“Soclet”模块中,直接调用即可,且函数功能与Winsocket一致。服务器首先启动,通过调用 socket()建立一个套接口,然后 bind()将该套接口和本地地址(IP 地址和端口)绑定在一起,再 listen()使得套接口做好侦听准备,并规定它的请求队列的长度,之后就调用 accept()来接收连接,并获得客户机的地址信息;客户机在建立套接口之后就可以调用 connect()和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用 send()和recv()来发送和接收数据;最后,待数据传送结束后,双方调用closesocket()关闭套接口。3,关于python的线程创建Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。class threading.Condition(lock=None)本类用于实现条件变量对象。条件变量对象允许多条线程保持等待状态直到接收另一条线程的通知。如果选择传入 lock 参数,只能使用 Lock 或RLock对象,而且它会被当做一个隐性锁使用。如果不传此参数,那么程序会自动隐性地创建一个RLock对象。acquire(*args)本方法用于获取隐性锁(关联锁),它调用隐性锁的 acquire() 方法,并返回其所返回的值release()同上,本方法无返回值wait(timeout=None)等待通知或超时。如果线程没有获取到锁就调用了此方法,那么将引发RuntimeError异常本方法会释放隐性锁,然后阻塞直到被其他线程的调用此条件变量的 notify() 或notify_all() 唤醒,或超时。一旦被唤醒或超时,该线程将立即重新获取锁并返回timeout 参数是以秒为单位的浮点数如果隐性锁是一个RLock对象,因为调用它的 release() 方法未必能够释放该锁,所以本方法会使用RLock对象的一个内部接口,该接口可以立即释放多重迭代的RLock锁。并且在需要重新获取锁的时候,也会使用一个类似的内部接口来恢复多重的迭代级别本方法所阻塞的线程如果是被唤醒的,那么本方法会返回一个 True,如果是超时了,则返回 Falsenotify(n=1)本方法默认用于唤醒处于等待本条件变量的线程。如果调用本方法的线程并没有获得锁,将引发RuntimeError异常本方法至多可唤醒所有正在等待本条件变量的线程中的 n 个。如果调用时没有线程处于等待操作,那么本方法的调用是一个空操作现在版本对本方法的实现为:在有足够多处于等待状态的线程的条件下,本方法将正好唤醒其中的 n 个,而不是像上一条中讲的“至多 n 个”。不过这种行为并不可靠。在将来,本方法很可能偶尔唤醒超过 n 条线程notify_all()唤醒正在等待本条件变量的所有线程。二.代码简述:以上代码可见Server对象从创建端口,到绑定Socket接口和开始监听都与C语言实现大体无异,只是简化了繁琐的定义过程。而反观client对象,也无需赘述,连接过程十分简单。重点在于建立线程的部分:每个client有两个线程,分别负责接收和发送,当没有发送时,在raw_input()那卡住,当没有接收时,在recv()那卡住server为每个client开两个线程,分别处理接收和发送。每个发送的线程在con.wait()那阻塞,等待notify。每个接收的线程,在recv()那里等待来自client的输入,接收到输入后,发出一个notify,激活所有输出线程,自身则因为循环在下一个recv()那里等待。该函数在Server中负责接受Cli
文档评论(0)