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()