python socket编程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python socket编程相关的知识,希望对你有一定的参考价值。
Python 提供了两个基本的 socket 模块。
第一个是 Socket,它提供了标准的 BSD Sockets API。
第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
socket类型
套接字格式:
socket(family,type[,protocal])
使用给定的地址族、套接字类型、协议编号(默认为0,一般不写)来创建套接字。
地址族:
socket类型 | 描述 |
---|---|
socket.AF_UNIX | 单一个unix进程间通信 |
socket.AF_INET | 服务器之间的通信 |
scoket.AF_INET6 | IPV6使用 |
套接字类型:
socket类型 | 描述 |
---|---|
socket.SOCK_STREAM | 流式 for TCP |
socket.SOCK_DGRAM | 报文式数据包 for UDP |
scoket.SOCK_RAW | 原始套接字,普通的套接字无法处理ICMP、IGMP等网络报文,而SOCK_RAW可以;其次,SOCK_RAW也可以处理特殊的IPv4报文;此外,利用原始套接字,可以通过IP_HDRINCL套接字选项由用户构造IP头。 |
socket.SOCK_SEQPACKET | 可靠的连续数据包格式 |
服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。
创建TCP服务器示例:
思路:
1、创建socket对象
tcpSerSock=socket(AF_INET,SOCK_STREAM) #创服务器套接字
2、绑定主机和端口,应当是一个元组
tcpSerSock.bind(ADDR) #套接字与地址绑定
3、监听
tcpSerSock.listen(5) #监听连接,传入连接请求的最大数
4、等待连接
conn,addr = tcpSerSock.accept() addr是IP地址,conn是发送来的数据对象
5、接受数据
data = conn.recv() 需要用conn这个对象来操作
6、发送数据
conn.send(data) or conn.sendall(data)
7、关闭套接字
conn.close()
tcpSerSock.close()
*这里用的decode和encode是python3创建socket时需要bytes数据
发送的时候,需要使用encode(),对端接收到,需要使用decode()
*
#创建TCP服务器
from socket import *
from time import ctime
import subprocess
HOST=‘‘
PORT=21567
BUFSIZ=1024
ADDR=(HOST,PORT)
tcpSerSock=socket(AF_INET,SOCK_STREAM) #创服务器套接字
tcpSerSock.bind(ADDR) #套接字与地址绑定
tcpSerSock.listen(5) #监听连接,传入连接请求的最大数
while True:
print(‘waiting for connection...‘)
tcpCliSock,addr =tcpSerSock.accept()
print(‘...connected from:‘,addr)
while True:
data =tcpCliSock.recv(BUFSIZ).decode()
if not data:
continue
print(‘command=‘,data)
status,result = subprocess.getstatusoutput(data)
if result.strip() == 0:
tcpCliSock.send((‘[%s] create a dir or file finish! ‘ %(ctime())).encode())
else:
tcpCliSock.send((‘[%s] %s‘ %(ctime(),result)).encode())
tcpCliSock.close()
tcpSerSock.close()
TCP客户端示例:
思路:
1、创建socket对象
tcpCliSock=socket(AF_INET,SOCK_STREAM) #创服务器套接字
2、连接主机,应当是一个元组
tcpCliSock.connect(ADDR) #套接字与地址绑定
3、发送数据
tcpCliSock.send(data) or sendall(data)
4、接收数据
tcpCliSock.recv(1024)
5、关闭
tcpCliSock.close()
from socket import *
HOST = ‘localhost‘ # or ‘localhost‘
PORT = 21567
BUFSIZ = 1024
ADDR=(HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = input(‘> ‘)
#print(‘data=‘,data);
if not data:
break
tcpCliSock.send(data.encode())
data = tcpCliSock.recv(BUFSIZ).decode()
if not data:
break
print(data)
tcpCliSock.close()
创建UDP服务器
UDP协议则不需要事先建立连接,直接互相发送数据即可。
UDP服务端示例:
思路:
1、创建socket套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2、绑定
host=("",8000)
s.bind(host)
3、接受连接
s.recvfrom(1024)
4、发送数据
s.sendto(data,addr) 第二个参数为客户端IP
5、关闭
s.close()
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host=("",8000)
s.bind(host)
while True:
data,address = s.recvfrom(1024)
print(data.decode(),address)
senddata = "this is a udp server"
s.sendto(senddata.encode(),address)
c.close()
UDP客户端示例:
1、创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
2、连接
host=("127.0.0.1",8000)
s.connect(host)
3、发送数据
s.send(data)
4、接收数据
s.recv(1024)
5、关闭
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
host=("127.0.0.1",8000)
s.connect(host)
while True:
message = input("message:")
s.send(message.encode())
data = s.recv(1024)
print(data.decode())
sl.close()
以上是关于python socket编程的主要内容,如果未能解决你的问题,请参考以下文章
Python--网络编程-----socket代码实例--聊天软件升级版