c语⾔socket实验报告,TCPIP⽹络应⽤Socket编程实验报告摘要
基于Socket编程的基本原理和开发流程,本⽂设计并实现了基于单播和组播的多⼈聊天⼯具,以及基于组播的视频会议软件。本次Socket ⽹络可视化编程的开发平台为Python + Qt。通过对两款软件的开发,深⼊理解了Socket编程的过程细节和核⼼思想。
1 多⼈聊天⼯具的开发
1.1 多⼈聊天⼯具设计思想
多⼈聊天⼯具的关键功能是,当若⼲⼈加⼊同⼀聊天集合后,任意成员发⾔,集合中的所有⼈都能收到。在此,实验基于单播和组播两种不同的⽅式设计多⼈聊天⼯具。在都达到多⼈聊天⽬的的前提下,理解单播与组播的共性及各⾃的优缺点。
1.1.1 基于单播的多⼈聊天
基于单播的多⼈聊天可采取两种⽅式实现:
第⼀种,每个⽤户都记录下所有⽤户的地址,单个⽤户每次发送聊天消息都必须发送到所有⽤户地址。显然,每个⽤户保存所有⽤户的地址既不利于空间管理、⼜会引发安全问题。
第⼆种,采⽤客户端/服务器的模式,即额外引⼊⼀台服务器,每个⽤户都作为客户端。⽤户将数据发送给服务器,服务器再转发给其他所有⽤户。
显然,第⼆种⽅案既⽅便管理,⼜有助于提升安全性,正是本次多⼈聊天⼯具采⽤的开发⽅式。并且,为了进⼀步提⾼可靠性,实验中采⽤TCP包传输聊天数据。
1.1.2 基于组播的多⼈聊天
基于UDP包的组播传输多⼈聊天数据,即把所有⽤户加⼊同⼀组播组,任⼀⽤户的聊天信息数据包都发送到组播地址,这样便能顺利地到达所有加⼊了该组播组的主机并被⽤户接收。另外,可以禁⽌组播回传造成的额外开销。
1.2 多⼈聊天⼯具的实现
基于Socket的多⼈聊天程序流程可以依次分为以下6个部分:
配置Socket并监听 -> 编码⽤户输⼊ -> 传输数据包 -> 接收数据包 -> 展⽰收到内容 -> 关闭程序。
单播与组播程序在第2部分编码⽤户输⼊数据、及第5部分展⽰收到内容两个部分代码相同,所以只对其他3个部分进⾏两种不同播的实现说明。
1.2.1 配置Socket并监听
单播:
def initUnicast(self):
s1 = socket.socket()
return s1
socket编程聊天室基本流程多播:
def initMulticast(self):
s2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
s2.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
except AttributeError:
pass
s2.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 20) s2.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 0) s2.bind(('', 23333))
intf = hostname())
s2.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(intf) + socket.inet_aton('0.0.0.0'))
s2.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton('239.0.0.222') + socket.inet_aton('0.0.0.0')) 1.2.2 编码⽤户输⼊
text = ()
text = Utf8(), 'utf-8', 'ignore')
data = de("utf-8")
1.2.3 传输数据包
单播(客户端发送后需服务器转发):
客户端发送
self.s1.send(data)
服务器转发
r, w, e = select.select(users, [], [])
for temp in r:
if temp is s:
newer(s)
else:
disconnect = False
try:
data = v(1024)
data = names[temp] + ': ' + data
:
disconnect = True
if disconnect:
del names[temp]
else:
print data
for user in users:
if user != temp and user != s:
user.send(data)
多播(只需客户端发送组播):
self.s2.sendto(data, ('239.0.0.222', 23333))
self.chat.append(data)
self.input.clear()
self.flag = 'multicast'
1.2.4 接收数据包
单播:
r, w, e = select.select([self.s1], [], [])
if self.s1 in r:
data = v(1024)
多播:
data, sender_addr = vfrom(1024)
1.2.5 展⽰收到内容
self.chat.append(data)
1.2.6 关闭程序
使⽤组播传输时,需先退出多播组
s.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP,
socket.inet_aton(addr) + socket.inet_aton('0.0.0.0'))
然后关闭Socket
s.close()
1.3 多⼈聊天⼯具⽰意图
多⼈聊天⼯具运⾏图
2 视频会议软件的开发
2.1 视频会议软件设计思想
视频会议软件基于UDP组播进⾏数据包的传输。由于视频的本质就是多帧图像和⾳频流的组合,我们不传输视频格式⽂件,⽽是传输另外两类数据包,分别是图像包和⾳频包。实验通过等间隔时间采集图像帧和⾳频流,并发送给组播组内的所有⽤户,在其他⽤户处显⽰图像帧、播放⾳频流,以达到播放视频的同等效果。
2.2 视频会议软件的实现
整个视频会议软件的程序流程可以依次分为以下6个部分:
配置Socket并监听 -> 采集图像声⾳ -> 传输数据包 -> 接收数据包 -> 播放图像声⾳ -> 关闭程序。
流程中1、3、4、6部分与上⼀节中基于组播的多⼈聊天会议类似在此我们不再赘述这部分的关键代码。值得注意的是,虽然我们将连续的视频离散为了等间隔时间的图像声⾳,然⽽为了保证视频会议的流畅性,传输的稳定性和时效性需要得到更强的保证。
在第2和第5部分中,为实现其等间隔采集并播放图像及声⾳的功能,实验中额外使⽤了Python中的图像库pygame和⾳频库pyaudio。接下来我们重点阐述这两部分功能实现的核⼼代码。
2.2.1 采集图像
pygame.camera.init()
cam = pygame.camera.Camera("/dev/video0", size)
cam.start()
image = _image()
image = ansform.scale(image, size)
data = string(image, 'RGB')
2.2.2 播放图像
pygame.init()
size = (128, 96)
image = pygame.image.fromstring(data, size, 'RGB')
image = ansform.scale(image, (320, 240))
screen.blit(image, (0, 0))
2.2.3 采集⾳频流
pin = pyaudio.PyAudio()
streamin = pin.open(format=pyaudio.paInt16, channels=1, rate=framerate,
input=True, frames_per_buffer=NUM_SAMPLES)
2.2.4 播放⾳频流
pout = pyaudio.PyAudio()
streamout = pout.open(format=pyaudio.paInt16, channels=1, rate=framerate, output=True)
data = ad(NUM_SAMPLES)
stream.write(data)
2.3 视频会议软件⽰意图
视频会议软件运⾏图
3 总结
通过使⽤Python语⾔实现Socket编程,使⽤Qt创造可视化界⾯,基于单播和组播的多⼈聊天⼯具,以及基于组播的视频会议软件被成功开发出来。但不可否认的是,在界⾯优化、缓存利⽤、数据传输、性能稳定等诸多⽅⾯,这两款软件都有很多可以改进的空间,以待后续研究。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论