Python(socket编程——2),,import soc
Python(socket编程——2),,import soc
import socket‘‘‘socket.socket(socket_family,socket_type,protocal=0)socket_family 可以是 AF_UNIX 或 AF_INET。socket_type 可以是 SOCK_STREAM 或 SOCK_DGRAM。protocol 一般不填,默认值为 0。获取tcp/ip套接字tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)获取udp/ip套接字udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)由于 socket 模块中有太多的属性。我们在这里破例使用了‘from module import *‘语句。使用 ‘from socket import *‘,我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。例如tcpSock = socket(AF_INET, SOCK_STREAM)‘‘‘
七 基于TCP的套接字
tcp服务端
1 ss = socket() #创建服务器套接字2 ss.bind() #把地址绑定到套接字3 ss.listen() #监听链接4 inf_loop: #服务器无限循环5 cs = ss.accept() #接受客户端链接6 comm_loop: #通讯循环7 cs.recv()/cs.send() #对话(接收与发送)8 cs.close() #关闭客户端套接字9 ss.close() #关闭服务器套接字(可选)View Code
tcp客户端
1 cs = socket() # 创建客户套接字2 cs.connect() # 尝试连接服务器3 comm_loop: # 通讯循环4 cs.send()/cs.recv() # 对话(发送/接收)5 cs.close() # 关闭客户套接字View Code
socket通信流程与打电话流程类似,我们就以打电话为例来实现一个low版的套接字通信
#_*_coding:utf-8_*_服务端__author__ = ‘Linhaifeng‘import socketip_port=(‘127.0.0.1‘,9000) #电话卡BUFSIZE=1024 #收发消息的尺寸s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机s.bind(ip_port) #手机插卡s.listen(5) #手机待机conn,addr=s.accept() #手机接电话# print(conn)# print(addr)print(‘接到来自%s的电话‘ %addr[0])msg=conn.recv(BUFSIZE) #听消息,听话print(msg,type(msg))conn.send(msg.upper()) #发消息,说话conn.close() #挂电话s.close() #手机关机
#_*_coding:utf-8_*_客户端__author__ = ‘Linhaifeng‘import socketip_port=(‘127.0.0.1‘,9000)BUFSIZE=1024s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect_ex(ip_port) #拨电话s.send(‘linhaifeng nb‘.encode(‘utf-8‘)) #发消息,说话(只能发送字节类型)feedback=s.recv(BUFSIZE) #收消息,听话print(feedback.decode(‘utf-8‘))s.close() #挂电话‘‘‘上述流程的问题是,服务端只能接受一次链接,然后就彻底关闭掉了,实际情况应该是,服务端不断接受链接,然后循环通信,通信完毕后只关闭链接,服务器能够继续接收下一次链接,下面是修改版‘‘‘
#_*_coding:utf-8_*___author__ = ‘Linhaifeng‘import socketip_port=(‘127.0.0.1‘,8081)#电话卡BUFSIZE=1024s=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #买手机s.bind(ip_port) #手机插卡s.listen(5) #手机待机while True: #新增接收链接循环,可以不停的接电话 conn,addr=s.accept() #手机接电话 # print(conn) # print(addr) print(‘接到来自%s的电话‘ %addr[0]) while True: #新增通信循环,可以不断的通信,收发消息 msg=conn.recv(BUFSIZE) #听消息,听话 # if len(msg) == 0:break #如果不加,那么正在链接的客户端突然断开,recv便不再阻塞,死循环发生 print(msg,type(msg)) conn.send(msg.upper()) #发消息,说话 conn.close() #挂电话s.close() #手机关机服务端改进版View Code
#_*_coding:utf-8_*___author__ = ‘Linhaifeng‘import socketip_port=(‘127.0.0.1‘,8081)BUFSIZE=1024s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)s.connect_ex(ip_port) #拨电话while True: #新增通信循环,客户端可以不断发收消息 msg=input(‘>>: ‘).strip() if len(msg) == 0:continue s.send(msg.encode(‘utf-8‘)) #发消息,说话(只能发送字节类型) feedback=s.recv(BUFSIZE) #收消息,听话 print(feedback.decode(‘utf-8‘))s.close() #挂电话客户端改进版View Code
Python(socket编程——2)
评论关闭