基于SOCKET的多人聊天室

基于SOCKET的多人聊天室

ID:38786361

大小:121.31 KB

页数:7页

时间:2019-06-19

基于SOCKET的多人聊天室_第1页
基于SOCKET的多人聊天室_第2页
基于SOCKET的多人聊天室_第3页
基于SOCKET的多人聊天室_第4页
基于SOCKET的多人聊天室_第5页
资源描述:

《基于SOCKET的多人聊天室》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、电子信息与通信工程学院实验报告实验名称多人聊天软件课程名称计算机网络姓名顾康学号U201413323日期12月6日地点成绩教师刘威一.实验背景1.Client/Server结构在TCP/IP网络环境下,不同主机上的两个应用程序间通信普遍采用客户机服务器模型(client/serverarchitecture,C/S).即通信双方一方作为服务器等待客户提出请求并予以响应,客户则在需要服务时向服务器提出申请。服务器一般作为守护进程始终运行,监听网络接口,一旦有客户请求,就启动一个服务进程来响应客户,同时自己继续监听服务

2、端口,使后续客户也能及时得到服务。采用这种模型主要是由于网络中主机的软硬件资源、运算能力和信息分布不均匀导致的,当需要信息共享时,运算能力强、拥有众多资源的主机就作为服务器对外提供服务,资源相对较少的主机就成为客户机通过请求获得所需资源。本编程训练的目的之一是通过编程了解客户机-服务器结构的网络通信模型。2.Socket编程本实验使用的语言为python,目的是便于建立线程。而python的Socket功能包含于“Soclet”模块中,直接调用即可,且函数功能与Winsocket一致。服务器首先启动,通过调用soc

3、ket()建立一个套接口,然后bind()将该套接口和本地地址(IP地址和端口)绑定在一起,再listen()使得套接口做好侦听准备,并规定它的请求队列的长度,之后就调用accept()来接收连接,并获得客户机的地址信息;客户机在建立套接口之后就可以调用connect()和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用send()和recv()来发送和接收数据;最后,待数据传送结束后,双方调用closesocket()关闭套接口。3,关于python的线程创建Condition被称为条件变量,除了提

4、供与Lock类似的acquire和release方法外,还提供了wait和notify方法。classthreading.Condition(lock=None)·本类用于实现条件变量对象。条件变量对象允许多条线程保持等待状态直到接收另一条线程的通知。·如果选择传入lock参数,只能使用Lock或RLock对象,而且它会被当做一个隐性锁使用。如果不传此参数,那么程序会自动隐性地创建一个RLock对象。acquire(*args)·本方法用于获取隐性锁(关联锁),它调用隐性锁的acquire()方法,并返回其所返回的

5、值release()·同上,本方法无返回值wait(timeout=None)·等待通知或超时。如果线程没有获取到锁就调用了此方法,那么将引发RuntimeError异常·本方法会释放隐性锁,然后阻塞直到被其他线程的调用此条件变量的notify()或notify_all()唤醒,或超时。一旦被唤醒或超时,该线程将立即重新获取锁并返回·timeout参数是以秒为单位的浮点数·如果隐性锁是一个RLock对象,因为调用它的release()方法未必能够释放该锁,所以本方法会使用RLock对象的一个内部接口,该接口可以立即

6、释放多重迭代的RLock锁。并且在需要重新获取锁的时候,也会使用一个类似的内部接口来恢复多重的迭代级别·本方法所阻塞的线程如果是被唤醒的,那么本方法会返回一个True,如果是超时了,则返回Falsenotify(n=1)·本方法默认用于唤醒处于等待本条件变量的线程。如果调用本方法的线程并没有获得锁,将引发RuntimeError异常·本方法至多可唤醒所有正在等待本条件变量的线程中的n个。如果调用时没有线程处于等待操作,那么本方法的调用是一个空操作·现在版本对本方法的实现为:在有足够多处于等待状态的线程的条件下,本方

7、法将正好唤醒其中的n个,而不是像上一条中讲的“至多n个”。不过这种行为并不可靠。在将来,本方法很可能偶尔唤醒超过n条线程notify_all()·唤醒正在等待本条件变量的所有线程。二.代码简述:以上代码可见Server对象从创建端口,到绑定Socket接口和开始监听都与C语言实现大体无异,只是简化了繁琐的定义过程。而反观client对象,也无需赘述,连接过程十分简单。重点在于建立线程的部分:每个client有两个线程,分别负责接收和发送,当没有发送时,在raw_input()那卡住,当没有接收时,在recv()那卡

8、住server为每个client开两个线程,分别处理接收和发送。每个发送的线程在con.wait()那阻塞,等待notify。每个接收的线程,在recv()那里等待来自client的输入,接收到输入后,发出一个notify,激活所有输出线程,自身则因为循环在下一个recv()那里等待。该函数在Server中负责接受Client的消息,当没有消息发生时处于挂起

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。