前言
嗨喽,大家好呀~这里是爱看美女的茜茜呐
Socket编程
1.基本概念
1.什么是客户端/服务器架构?
服务器就是一系列硬件或软件,为一个或多个客户端(服务的用户)提供所需的“服务”。
它存在唯一目的就是等待客户端的请求,
并响应它们(提供服务),然后等待更多请求。
说白了就是一个提供服务,一个请求服务得到相应的一个过程。
2.套接字:通信端点
套接字是计算机网络数据结构,它体现了上节中描述的“通信端点”的概念。
在任何类型的通信开始之前,网络应用程序必须创建套接字。
可以将它们比作电话插孔,没有它将无法进行通信。
Python只支持AF_UNIX、AF_NETLINK、AF_TIPC 和 AF_INET ,重点使用基于网络的AF_INET.
3.套接字地址:主机-端口对
它是网络通信过程中端点的抽象表示,python使用元组保存:ADDR = (HOST,PORT)。
4.套接字类型
流式套接字(SOCK_STREAM):用于提供面向连接、可靠的数据传输服务。
数据报套接字(SOCK_DGRAM):提供了一种无连接的服务。
该服务并不能保证数据传输的可靠性,数据有可能在传输过程中丢失或出现数据重复,且无法保证顺序地接收到数据。
? ? ? 更多精彩机密、教程,尽在下方,赶紧点击了解吧~
资料、视频教程、代码、插件安装教程等我都准备好了,直接在文末名片自取就可
2.Python网络编程
2.1 常见的套接字对象方法和属性
2.2 创建服务和客户端
2.2.1 创建TCP服务
一般的创建流程:
ss = socket() # 创建服务器套接字ss.bind(ADDR) # 套接字与地址绑定ss.listen() # 监听连接while True: # 服务器无限循环cs = ss.accept() # 接受客户端连接comm_loop: # 通信循环cs.recv()/cs.send() # 对话(接收 / 发送)cs.close() # 关闭客户端套接字ss.close() # 关闭服务器套接字 # (可选)
2.2.2 创建 TCP 客户端
一般的创建流程:
cs = socket() # 创建客户端套接字cs.connect() # 尝试连接服务器comm_loop: # 通信循环cs.send()/cs.recv() # 对话(发送 / 接收)cs.close() # 关闭客户端套接字
2.2.3 创建UDP服务
一般的创建流程:
ss = socket() # 创建服务器套接字ss.bind(ADDR) # 套接字与地址绑定while True: # 服务器无限循环ss.sendto() # 发送 ss.recvfrom() # 接收ss.close() # 关闭服务器套接字 # (可选)
2.2.4 创建 UDP 客户端
一般的创建流程:
cs = socket() # 创建客户端套接字comm_loop: # 通信循环cs.sendto() # 发送 cs.recvfrom() # 接收cs.close() # 关闭客户端套接字
server.py代码
'''遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''import socketfrom time import ctimeimport jsonimport timeHOST = ''PORT = 9001ADDR = (HOST, PORT)BUFFSIZE = 1024MAX_LISTEN = 5def tcpServer(): # TCP服务 # with socket.socket() as s: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # 绑定服务器地址和端口 s.bind(ADDR) # 启动服务监听 s.listen(MAX_LISTEN) print('等待用户接入。。。。。。。。。。。。') while True: # 等待客户端连接请求,获取connSock conn, addr = s.accept() print('警告,远端客户:{} 接入系统!!!'.format(addr)) with conn: while True: print('接收请求信息。。。。。') # 接收请求信息 data = conn.recv(BUFFSIZE) print('data=%s' % data) print('接收数据:{!r}'.format(data.decode('utf-8'))) # 发送请求数据 conn.send(data.encode('utf-8')) print('发送返回完毕!!!') s.close()# 创建UDP服务def udpServer(): # 创建UPD服务端套接字 with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: # 绑定地址和端口 s.bind(ADDR) # 等待接收信息 while True: print('UDP服务启动,准备接收数据。。。') # 接收数据和客户端请求地址 data, address = s.recvfrom(BUFFSIZE) if not data: break print('接收请求信息:{}'.format(data.decode('utf-8'))) s.sendto(b'i am udp,i got it', address) s.close()if __name__ == '__main__': while True: choice = input('input choice t-tcp or u-udp:') if choice != 't' and choice != 'u': print('please input t or u,ok?') continue if choice == 't': print('execute tcpsever') tcpServer() else: print('execute udpsever') udpServer()
client.py代码
'''遇到问题没人解答?小编创建了一个Python学习交流QQ群:702813599寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!'''import socketfrom time import ctimeHOST = 'localhost'PORT = 9001ADDR = (HOST, PORT)ENCODING = 'utf-8'BUFFSIZE = 1024def tcpClient(): # 创建客户套接字 with socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM) as s: # 尝试连接服务器 s.connect(ADDR) print('连接服务成功!!') # 通信循环 while True: inData = input('pleace input something:') if inData == 'q': break # 发送数据到服务器 inData = '[{}]:{}'.format(ctime(), inData) s.send(inData.encode(ENCODING)) print('发送成功!') # 接收返回数据 outData = s.recv(BUFFSIZE) print('返回数据信息:{!r}'.format(outData)) # 关闭客户端套接字 s.close()def udpClient(): # 创建客户端套接字 with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: while True: # 发送信息到服务器 data = input('please input message to server or input \'quit\':') if data == 'quit': break data = '[{}]:{}'.format(ctime(), data) s.sendto(data.encode('utf-8'), ADDR) print('send success') # 接收服务端返回信息 recvData, addrs = s.recvfrom(BUFFSIZE) print('recv message : {}'.format(recvData.decode('utf-8'))) # 关闭套接字 s.close()if __name__ == '__main__': while True: choice = input('input choice t-tcp or u-udp or q-quit:') if choice == 'q': break if choice != 't' and choice != 'u': print('please input t or u,ok?') continue if choice == 't': print('execute tcpsever') tcpClient() else: print('execute udpsever') udpClient()
代码说明:先执行 python server.py,在执行python client.py,就可以测试TPC/UDP简单的通信了。
尾语
感谢你观看我的文章呐~本次航班到这里就结束啦 ?
希望本篇文章有对你带来帮助 ?,有学习到一点知识~
躲起来的星星?也在努力发光,你也要努力加油(让我们一起努力叭)。
最后,宣传一下呀~???更多源码、资料、素材、解答、交流皆点击下方名片获取呀??