基于tcp、udp协议的套接字通信
内容概要
- 基于tcp协议的简单套接字通信
- 加上通信循环
- 加上链接循环
- 基于udp协议的套接字通信
内容详细
-
基于tcp协议的简单套接字通信
客户端
import socket # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、拨通服务端电话 phone.connect(('127.0.0.1',8080)) # 客户端拨通电话连接以后,也会得到一个连接对象,无返回对象,就是phone自己 # 3、通信 phone.send('hello ycc 哈哈哈'.encode('utf-8')) # 必须是Bytes类型 data = phone.recv(1024) print(data.decode('utf-8')) # 4、关闭连接(必选的回收资源的操作) phone.close()服务端
import socket # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 # phone = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp协议 # 2、绑定手机卡 phone.bind(('127.0.0.1',8080)) # 端口号:0-65535,1024以前的都被系统保留使用 # 这里将ip和port写死了 # 3、开机 phone.listen(5) # 5指的是半连接池的大小 print('服务端启动完成,监听地址为:%s:%s'%('127.0.0.1',8080)) # 4、等待电话连接请求:拿到电话连接conn conn,client_addr = phone.accept() # conn:三次握手双向通路 print(conn) print('客户端的ip和端口',client_addr) # ps:4和5的accept和recv会引发非常明显的阻塞操作 # 5、通信:收/发消息 data = conn.recv(1024) # 最大接受的数据量为1024Bytes,收到的是Bytes类型 print('客户端发来的消息:',data.decode('utf-8')) conn.send(data.upper()) # 这里虽然也会出现阻塞,但是数据较少,肉眼看不出来 # 6、关闭电话连接conn(必选的回收资源的操作) conn.close() # 7、关机(可选) phone.close() -
加上通信循环
客户端
import socket # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、拨通服务端电话 phone.connect(('127.0.0.1',8080)) # 客户端拨通电话连接以后,也会得到一个连接对象,无返回对象,就是phone自己 # 3、通信 while True: msg = input('输入要发送的信息==>:') if len(msg) == 0:continue # 判断如果消息为空,继续 phone.send(msg.encode('utf-8')) # 必须是Bytes类型 data = phone.recv(1024) # 如果输入的信息为空,接收就会阻塞 # 两个原因: # 1、服务端还未接受到消息(看似是服务端的问题,但本质是客户端发空的问题) print(data.decode('utf-8')) # 4、关闭连接(必选的回收资源的操作) phone.close()服务端
import socket # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 # phone = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp协议 # 2、绑定手机卡 # phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 在bind之前 phone.bind(('127.0.0.1',8080)) # 端口号:0-65535,1024以前的都被系统保留使用 # 这里将ip和port写死了 # 3、开机 phone.listen(5) # 5指的是半连接池的大小 print('服务端启动完成,监听地址为:%s:%s'%('127.0.0.1',8080)) # 4、等待电话连接请求:拿到电话连接conn conn,client_addr = phone.accept() # conn:三次握手双向通路 print(conn) print('客户端的ip和端口',client_addr) # ps:4和5的accept和recv会引发非常明显的阻塞操作 # 5、通信:收/发消息 while True: try: data = conn.recv(1024) # 最大接受的数据量为1024Bytes,收到的是Bytes类型 if len(data) == 0: # 在unix系统,一旦data收到的是空, # 意味着是一种异常的行为:客户端非法断开了连接 break print('客户端发来的消息:',data.decode('utf-8')) conn.send(data.upper()) # 这里虽然也会出现阻塞,但是数据较少,肉眼看不出来 except Exception: # 针对windows系统 break # 6、关闭电话连接conn(必选的回收资源的操作) conn.close() # 7、关机(可选) phone.close() -
加上链接循环
客户端
import socket # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 # 2、拨通服务端电话 phone.connect(('127.0.0.1',8080)) # 客户端拨通电话连接以后,也会得到一个连接对象,无返回对象,就是phone自己 # 3、通信 while True: msg = input('输入要发送的信息==>:') if len(msg) == 0:continue # 判断如果消息为空,继续 phone.send(msg.encode('utf-8')) # 必须是Bytes类型 data = phone.recv(1024) # 如果输入的信息为空,接收就会阻塞 # 两个原因: # 1、服务端还未接受到消息(看似是服务端的问题,但本质是客户端发空的问题) print(data.decode('utf-8')) # 4、关闭连接(必选的回收资源的操作) phone.close()服务端
# 服务端应该满足的特点: # 1、一直提供服务 # 2、并发地提供服务 import socket # 1、买手机 phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 流式协议=》tcp协议 # phone = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp协议 # 2、绑定手机卡 # phone.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 在bind之前 phone.bind(('127.0.0.1',8080)) # 端口号:0-65535,1024以前的都被系统保留使用 # 这里将ip和port写死了 # 3、开机 phone.listen(5) # 5指的是半连接池的大小 print('服务端启动完成,监听地址为:%s:%s'%('127.0.0.1',8080)) # 4、等待电话连接请求:拿到电话连接conn # 加上链接循环 # 暂时还没学并发,因此这里只能用这个折中的方式 while True: conn,client_addr = phone.accept() # conn:三次握手双向通路 print(conn) print('客户端的ip和端口',client_addr) # ps:4和5的accept和recv会引发非常明显的阻塞操作 # 5、通信:收/发消息 while True: try: data = conn.recv(1024) # 最大接受的数据量为1024Bytes,收到的是Bytes类型 if len(data) == 0: # 在unix系统,一旦data收到的是空, # 意味着是一种异常的行为:客户端非法断开了连接 break print('客户端发来的消息:',data.decode('utf-8')) conn.send(data.upper()) # 这里虽然也会出现阻塞,但是数据较少,肉眼看不出来 except Exception: # 针对windows系统 break # 6、关闭电话连接conn(必选的回收资源的操作) conn.close() # 7、关机(可选) phone.close() -
基于udp协议的套接字通信
客户端
import socket client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) while True: msg = input('==>:').strip() client.sendto('hello ycc 哈哈哈'.encode('utf-8'),('127.0.0.1',8080)) data,client_addr = client.recvfrom(1024) print('服务端发来消息:',data.decode('utf-8')) client.close()服务端
import socket server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # 数据报协议 ==> udp协议 server.bind(('127.0.0.1',8080)) while True: data,client_addr = server.recvfrom(1024) server.sendto(data.upper(),client_addr) server.close()

浙公网安备 33010602011771号