TCP编程:
socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)
socket和file的区别:
1、file模块是针对某个指定文件进行【打开】【读写】【关闭】
2、socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】
Python中提供了两个与socket相关的模块:socket和socketserver。其中socket模块提供了标准的BSD Socket API,而socketserver提供了网络服务器的开发
socket类:表示Socket,给构造器传入不同的参数可以使用不同形式的socket
操作方法:
bind(self, address): 绑定地址和商品,参数address代表包含ip和端口的一个二元组
listen(self, backlog=None): 监听端口,参数backlog代表最大连接数据,默认为1
s.accept(): 等待客户端连接,返回值为包含新的socket对象和客户端ip的二元组
recv(self, buffersize, flags=None): 接收数据
send(self, data, flags=None): 发送数据,如果发送数据很大,需要多次调用该方法进行多次发送
sendall(self, data, flags=None): 连续发送数据,直接发送完毕所有数据或发生异常为止
connect(self, address):将客户端连接到服务器端
范例一:简单聊天工具
服务端代码:
# encoding=utf=8
import socket
HOST = ''
PORT = 9999
# 1 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 绑定ip和端口
s.bind((HOST, PORT))
# 3 监听端口
s.listen(100)
print('服务器启动...')
# 4 等待客户端连接
conn, addr = s.accept();
print(addr)
# 5 接收客户端数据
data = conn.recv(1024)
print('从客户端接收消息:{0}'.format(data.decode()))
# 6 向客户端发送数据
conn.send("hello client".encode())
# 7 释放socket
conn.close()
s.close()
客户端代码:
# encoding=utf=8
import socket
HOST = '127.0.0.1'
PORT = 9999
# 1 创建socket对象
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2 连接服务器
s.connect((HOST, PORT))
# 3 向服务器发送数据
s.send(b'hello server')
# 4 从服务器端接收数据
data = s.recv(1024)
print('从服务器端接收来的消息:{0}'.format(data.decode()))
# 5 释放socket
s.close()
范例二:文件上传功
服务端代码:upload_server.py
# coding-utf-8
import socket
HOST = ''
PORT = 9999
f_name = 'temp.txt'
# 1 创建socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# 2 绑定IP地址和端口号
s.bind((HOST, PORT))
# 3 开始监听
s.listen(10)
print('服务器启动...')
while True:
# 4 接收客户端口的连接
with s.accept()[0] as conn:
buff = []
while True:
# 5 接收数据
data = conn.recv(1024)
if data:
buff.append(data)
else:
break
# 将字节列表合并成一个字节列表对象
b = bytes().join(buff)
with open(f_name, 'wb') as f:
f.write(b)
print('服务器接收数据完成!')
客户端代码:upload_client.py
# coding-utf-8
import socket
HOST = '127.0.0.1'
PORT = 9999
file_name = 'data.txt'
# 1 创建socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
# 2 连接服务器
s.connect((HOST, PORT))
with open(file_name, 'rb') as f:
b = f.read()
# 3 发送数据
s.sendall(b)
print('客户端上传数据完成!')