python socket编程_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_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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值