继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

python socket编程

慕田峪是谁我也不认识
关注TA
已关注
手记 271
粉丝 40
获赞 95

Python 提供了两个基本的 socket 模块。
第一个是 Socket,它提供了标准的 BSD Sockets API。

第二个是 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。

socket类型

套接字格式:

socket(family,type[,protocal])
使用给定的地址族、套接字类型、协议编号(默认为0,一般不写)来创建套接字。

地址族:

socket类型描述
socket.AF_UNIX单一个unix进程间通信
socket.AF_INET服务器之间的通信
scoket.AF_INET6IPV6使用

套接字类型:

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 ctimeimport subprocessHOST=''PORT=21567BUFSIZ=1024ADDR=(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 = 21567BUFSIZ = 1024ADDR=(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 sockets = 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 sockets = 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()

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP

热门评论

这么详细居然没人看。必须赞一个

查看全部评论