Socket编程
Python 提供了两个级别访问的网络服务:
- 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法
高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发。
Python 中,我们用 socket() 函数来创建套接字,语法格式如下:
socket.socket([family[, type[, proto]]])
参数
- family: 套接字家族可以使AF_UNIX或者AF_INET
- type: 套接字类型可以根据是面向连接(TCP)的还是非连接(UDP)分为SOCK_STREAM或SOCK_DGRAM
protocol: 一般不填默认为0.
Python3.5.x socket只能收发字节内容,Python2.7可以直接发送字符串
服务端代码 server.py:
import socket
#初始化socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
# host = socket.gethostname() #获取本地主机名
port = 8001 设置端口号
s.bind((host,port)) #服务端绑定主机和端口
s.listen(5) #等待至多5个客户端连接
while True:
connection,address = s.accept()
connection.send('Hello world!'.encode('utf-8'))
connection.close()
客户端代码 client.py:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = 'localhost'
#host = socket.gethostname()
port = 1234
s.connect((host,port))
print(s.recv(1024).decode('utf-8'))
s.close()
现在我们打开两个终端,第一个终端执行 server.py 文件:python server.py
第二个终端执行 client.py 文件:python client.py
输出:Hello World!
这时我们再打开第一个终端,就会看到有以下信息输出:
连接地址: ('127.0.0.1', 62461)
Web 应用服务
#!/usr/bin/env python
#coding:utf-8
import socket
def handle_request(client):
buf = client.recv(1024)
client.send("HTTP/1.1 200 OK\r\n\r\n".encode('utf-8'))
client.send("Hello, World".encode('utf-8'))
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost',8080))
sock.listen(5)
while True:
connection, address = sock.accept()
print(connection,address)
handle_request(connection)
connection.close()
if __name__ == '__main__':
main()
打开浏览器发现