多线程 python tcp 图片_Python第四周之网络编程TCP (服务器/客户端; 线程下载图片;线程版服务器和客户端(单人、多人)) UDP...

# 网络编程

# 计算机网络, 把多台独立自主的计算机,连接到网络,实现资源的共享

# Internet网,(互联网)eniac 1946美国大学第一台电子计算机

#

# 一个TCP报文除了包含要传输的数据外,还包含源IP地址和目标IP地址,源端口和目标端口。

# ISO协议

# 传数据,切小片,校验 TCP - 保证正确 UDP - 速度快,但是会有误差。

# 每个联网的设备都有IP地址。

# HTTP -- Hyper-Text Transfer Protocol-80

# SMTP - Simple Mail Transfer Protocol-25

# POP3 - Post Offce Protocol verdion3-110

# IMAP -Internet Mail Access Protocol

# HTTPS-443

# 再应用层,利用TCP和UDP来传输数据。 做法,套接值。

TCP 服务器

#做一个联网的应用#netstat 查看所有端口 telnet连接别人的IP

from socket importsocket, AF_INET, SOCK_STREAMimportdatetimedefmain():#规定:ipv4的协议

#server = socket(AF_INET, SOCK_STREAM) 可以省略

#1.创建一个基于TCP协议的套接字对象。

#因为我们做的是应用级的产品或服务,所以可以利用现有的传输服务来实现数据传输。

server =socket()#2.绑定在IP地址(网络上主机的身份标识),和端口(用来区分不同服务的IP地址的扩展)

server.bind(('10.7.189.77', 6791)) #包含ip地址和端口号,对应电脑和服务-应用。

#3.开始监听客户端的连接。

server.listen(512) #512 - 为等待队列的大小。

print('服务器已经启动!正在监听。。。')whileTrue:#通过accept方法,接受客户的连接,accept是一个阻塞式的方法:

#如果没有客户端连接,那么accept方法会让代码阻塞,直到有客户段连接成功才返回-- 元组,

#accept 方法返回一个元组,元组中第一个值代表客户端的对象,

#元组的第二个值又是一个元组,其中有的客户端的ip地址和端口。

client, addr =server.accept()print(client)print(addr, '连接成功')

t=datetime.datetime.now()print(t)

client.send(str(t).encode('utf-8'))#client.close()

if __name__ == '__main__':

main()

TCP客户端

from socket importsocketdefmain():

client=socket()

client.connect(('10.7.189.77', 6790))

data= client.recv(1024)print(type(data))print(data.decode('utf-8'))if __name__ == '__main__':

main()

多线程下载图片

importjsonimportrequestsfrom threading importThreadclassPictureLoad(Thread):def __init__(self, url):

super(PictureLoad, self).__init__()

self._url=urldefrun(self):

resp=requests.get(self._url)

filename= self._url[self._url.rfind('/') + 1:]try:

with open(filename,'wb') as fs:

fs.write(resp.content)exceptIOError as e:print(e)defmain():

resp= requests.get('http://api.tianapi.com/meinv/?key=81085f5747a59581327b29d1bccfb925&num=10')

my_dict=json.loads(resp.text)

threads=[]for temp in my_dict['newslist']:

pic_url= temp['picUrl']

pictureload=PictureLoad(pic_url)

pictureload.start()#resp = PictureLoad(pic_url).start()

threads.append(pictureload)for thread inthreads:

thread.join()print('图片下载完成')if __name__ == '__main__':

main()

单人线程版聊天室

#服务器

from socket importsocketfrom threading importThreadclassAccept(Thread):def __init__(self, client):

super(Accept, self).__init__()

self._client=clientdefrun(self):

data= self._client.recv(1024)return print(data.decode('utf-8'))classSend(Thread):def __init__(self, client, sentence):

super(Send, self).__init__()

self._sentence=sentence

self._client=clientdefrun(self):

self._client.send(str(self._sentence).encode('utf-8'))defmain():

server= socket() #创建对象

server.bind(('10.7.189.77', 6672)) #绑定IP和端口

server.listen(512) #同时连入数,最大等待数

print('程序已经启动,正在监听。。。。')whileTrue:

client, addr= server.accept() #接受连入的对象,前面为服务器的地址,后面为客户端的IP

print(addr, '已经连接')whileTrue:

accept= Accept(client) #使用线程接受消息

accept.start()#print(data.decode('utf-8'))

#data = client.recv(1024)

#print(data.decode('utf-8'))

t= input('请输入你要发送的话:') #发送消息

send =Send(client, t)

send.start()if __name__ == '__main__':

main()

# 客户端

from socket importsocketfrom threading importThreadclassSend(Thread):def __init__(self, client, me):

super(Send, self).__init__()

self._client=client

self._me=medefrun(self):

self._client.send(str(self._me).encode('utf-8'))defmain():

client= socket() #1.创建对象

client.connect(('10.7.189.130', 8080)) #2.连接服务器

print('连接成功')whileTrue:

me= input('请输入你要说的话:') #发送消息

#client.send(str(me).encode('utf-8'))

send = Send(client, me) #使用线程

send.start()

data= client.recv(1024)print(data.decode('utf-8'))if __name__ == '__main__':

main()

# 多人版线程聊天

# 服务器

from socket importsocketfrom threading importThreaddefmain():classRefreshScreenThread(Thread):def __init__(self, client):

super(RefreshScreenThread, self).__init__()

self._client=clientdefrun(self):whileTrue:

data= self._client.recv(1024)print(data.decode('utf-8')) #一直接受消息并打印出来

myclient= socket() #创建对象

myclient.connect(('10.7.189.130', 11110)) #连接服务器

RefreshScreenThread(myclient).start() #刷新接受到的消息

nickname = input('请输入你的昵称:')

running=Truewhilerunning:

content= input('请发言:')if content == 'byebye':

running=Falseelse:

content= nickname + ':' +content

myclient.send(str(content).encode('utf-8')) #发送消息

if __name__ == '__main__':

main()

# 客户端

from socket importsocketfrom threading importThreaddefmain():classClienthandler(Thread):def __init__(self, client):

super(Clienthandler, self).__init__()

self._client=clientdefrun(self):whileTrue:try:

data= self._client.recv(1024) #接受二进制数据

for client inclients:

client.send(data)#print(data.decode('utf-8'))

if data.decode('utf-8') == 'byebye':

clients.remove(self._client)

self._client.close()exceptException as ex_msg:print(ex_msg)

clients.remove(self._client)breakserverce= socket() #1. 创建套接制对象

#AF_INET ip4 SOCK_STREAM = TCP 为默认值。

#Python 命令行参数-- sys.argv

serverce.bind(('10.7.189.77', 8891)) #2. 绑定地址, ip(127.0.0.1\localhost)和ip地址的扩展--端口(1024-65535)

serverce.listen(512) #最大连入数,等待数。

print('用户连入,开始监听。。。')

clients=[]whileTrue:

cuur_client, addr= serverce.accept() #阻塞式的方法,接受用户的请求。

clients.append(cuur_client) #把连入的用户,放到一个列表里。

Clienthandler(cuur_client).start()if __name__ == '__main__':

main()

UDP

发消息

from socket importsocket, SOCK_DGRAMfrom time importsleepdefmain():

sender= socket(type=SOCK_DGRAM) #UDP套接制 速度快,但是容易丢失 1. 创建对象

with open('zms.jpg', 'rb') as f:

data=f.read()#f.seek() # 标记,从头移动到尾部

#f.tell #

data_len =len(data)

total=0while total

sender.sendto(data[total:total+1023], ('10.7.189.77', 8899))

total+= 1024sleep(0.0001)if __name__ == '__main__':

main()

接消息

from socket importsocket, SOCK_DGRAMdefmain():

receiver= socket(type=SOCK_DGRAM)

receiver.bind(('10.7.189.77', 8899)) #2.我在这个端口等着你给我数据

data =bytes()whileTrue:

seg, addr= receiver.recvfrom(1024) #3. 收数据,指定缓冲区大小。

data += seg #数据的拼接

if len(data) >= 27112:breakwith open('zms1.jpg', 'wb') as f:

f.write(data)print('图片已接收')#receiver.recvfrom()

if __name__ == '__main__':

main()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值