socket编程python
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket编程python相关的知识,希望对你有一定的参考价值。
socket参数
family地址簇
socket.AF_INET IPv4 (默认)
socket.AF_INET6 IPv6
socket.AF_UNIX 只能用于单一的unix系统进程间通信
type类型
socket.SOCK_STREAM 流式socket,for TCP(默认)
socket.SOCK_DGRAM 数据报式socket, for UDP
socket.SOCK_RAW 原始套接字
socket.SOCK_RDM 可靠UDP形式
socket.SOCK_SEQPACKET 可靠的连续数据包服务
proto: 协议号
0:默认。可以省略
CAN_RAW或CAN_BCM: 地址族为AF_CAN
下面是基础的TCP链接的 server client
#tcp_server import socket import random sk=socket.socket() #定义绑定ip和端口 ip_port=("127.0.0.1",8888) #绑定链接 sk.bind(ip_port) #最大连接数 sk.listen(5) while True: #提示信息 print("正在等待接受数据哦") #接受数据(传回连接对象和地址) conn,address=sk.accept() #定义信息3.6版本都是byte类型,str都需要编码 msg="连接成功" #返回信息 conn.send(msg.encode()) #不断接受客户端发来的消息 while True: #接受客户端消息 data = conn.recv(1024) #打印 print(data.decode()) #接受到退出指令 if data== bexit: break #处理客户端信息 conn.send(data) #发送随机数信息 conn.send(str(random.randint(1,1000)).encode()) #主动关闭链接 conn.close()
#tcp_client
import socket client=socket.socket() #定义绑定ip和端口 ip_port=("127.0.0.1",8888) #连接服务器 client.connect(ip_port) while True: # 接受主机信息1024个字节 data = client.recv(1024) # 打印接受的数据byte型解码 print(data.decode()) # 定义一个不断发送消息的循环 msg_input= input("输入需要发送的消息:") #消息发送 client.send(msg_input.encode()) if msg_input ==exit: break data = client.recv(1024) print(data.decode())
#UDPserver
import socket sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ip_port=("127.0.0.1",8888) sk.bind(ip_port) while True: #接受数据 data = sk.recv(1024) #打印数据 print(data.decode())
#UDP_client
import socket #UDP可以打开多个客户端进行发送消息,因为不是可靠连接 #ipv4 UDP sk=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) ip_port=("127.0.0.1",8888) while True: msg_input = input("输入你要的消息") if msg_input== "exit": break #数据发送 sk.sendto(msg_input.encode(),ip_port) #发送关闭信息 sk.close()
socket的非阻塞
import socketserver import random #为了发送随机数信息 #定义一个类 class MyServer(socketserver.BaseRequestHandler): #按照顺序执行 setup -> handler -> finish #handler方法报错,会跳过,其他两个无论如何都会执行 def setup(self): pass def handle(self): #定义连接变量 conn = self.request #发送消息定义 msg="Hello World!" #消息发送 conn.send(msg.encode()) #进入循环不断接受客户端消息 while True: #接受客户端消息 data = conn.recv(1024) #打印 print(data.decode()) if data == bexit: break conn.send(data) conn.send(str(random.randint(1,1000)).encode()) conn.close() def finish(self): pass if __name__ == "__main__": #创建你多线程实例 输入地址端口,多线程定义类 server = socketserver.ThreadingTCPServer( ("127.0.0.1",8888), MyServer) #开启异步多线程,等待客户端连接 server.serve_forever()
客户端仍然用之前的client即可
下面写一个文件发送与接收的程序
#接收服务器 import socket sk = socket.socket() ip_port = ("127.0.0.1", 9999) # 绑定端口和最大连接数 sk.bind(ip_port) sk.listen(5) while True: # 等待客户端连接 conn, address = sk.accept() # 一直使用当前连接进行数据发送直到结束标志出现 while True: # 打开文件等待写入 with open("file", ab) as f: # 接受数据 data = conn.recv(1024) if data == bquit: break # 写入文件 f.write(data) # 接受完成标志 conn.send(success.encode()) # 打印关闭提示信息 print("上传成功") sk.close()
#发送方
import socket sk = socket.socket() ip_port = ("127.0.0.1", 9999) sk.connect(ip_port) with open(socket_server_tcp2.py, rb) as f: # 按每一段分割文件 for i in f: # 数据上传 sk.send(i) # 等待接收完成 data = sk.recv(1024) # 判断服务器是否接受成功 if data != bsuccess: break # 给服务器端发送结束信号 sk.send(quit.encode())
以上是关于socket编程python的主要内容,如果未能解决你的问题,请参考以下文章