在计算机网络中,数据都是以二进制的形式进行传输的。所以在网络传输数据的时候,数据需要先编码转化为二进制(bytes)数据类型
I Love Python => 字符串 => 转换为二进制数据 => 网络中传输
数据转换方法说明:
函数名 | 说明 |
---|---|
encode | 编码 将字符串转化为字节码 |
decode | 解码 将字节码转化为字符串 |
提示:encoed()和decode()函数可以接受参数,encoding是指在编解码过程中使用的编码方案。
字符串编码:
str.encode(encoding=”utf-8”)
二进制解码:
bytes.decode(encoding=“utf-8”)
① TCP客户端应用程序开发
② TCP服务器端应用程序开发
客户端程序是指运行在用户设备上的程序,服务端程序是指运行在服务器设备上的程序,专门为客户端提供数据服务。那如何记忆呢?
主动发起建立连接请求的是客户端程序,等待接受连接请求的是服务端程序。
① 导入socket模块
import socket
② 创建客户端socket对象使用socket类
socket.socket(AddressFamily, Type)
客户端socket类的参数和方法说明:
参数名 | 说明 |
---|---|
AddressFamily | IP地址类型, 分为IPv4和IPv6 |
Type | 传输协议类型 |
import socket
if __name__ == '__main__':
# 1、创建客户端套接字对象
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、和服务器端套接字建立连接(参数必须是一个元祖)
tcp_client_socket.connect(("192.168.31.181", 8080))
# 3、发送数据
tcp_client_socket.send('hell, itheima'.encode(encoding='utf-8'))
# 4、接收数据
recv_data = tcp_client_socket.recv(1024).decode('utf-8')
print(recv_data)
# 5、关闭客户端套接字
tcp_client_socket.close()
① 导入socket模块
import socket
② 创建客户端socket对象使用socket类
socket.socket(AddressFamily, Type)
客户端socket类的参数和方法说明:
参数名 | 说明 |
---|---|
AddressFamily | IP地址类型, 分为TPv4和IPv6 |
Type | 传输协议类型 |
开发客户端需要使用的函数:
① 导入socket模块
import socket
② 创建服务器端socket对象使用socket类
socket.socket(AddressFamily, Type)
客户端socket类的参数和方法说明:
参数名 | 说明 |
---|---|
AddressFamily | IP地址类型, 分为TPv4和IPv6 |
Type | 传输协议类型 |
开发服务器端需要使用的函数:
方法名 | 说明 |
---|---|
bind | 绑定IP地址和端口号 |
listen | 设置监听 |
accept | 等待接受客户端的连接请求 |
send | 发送数据 |
recv | 接收数据 |
import socket
if __name__ == '__main__':
# 1、创建服务器端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定IP地址与端口号
tcp_server_socket.bind(("", 8888))
# 3、开启监听
tcp_server_socket.listen(128)
# 4、等待接收客户端连接请求
conn_socket, ip_port = tcp_server_socket.accept()
print('客户端IP+端口:', ip_port)
# 5、接收数据
recv_data = conn_socket.recv(1024)
print('接收到的数据:', recv_data.decode())
# 6、发送数据
conn_socket.send("客户端的数据已经收到了".encode())
# 7、关闭套接字
conn_socket.close()
tcp_server_socket.close()
(==
变量1,变量2 = (第一个元素值,第二个元素值)
# 导入模块
import socket
# 创建一个WebServer服务器端类
class WebServer(object):
# 定义__init__()魔术方法,用于对象初始化
def __init__(self):
# 创建套接字对象
self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP与端口号
self.tcp_server_socket.bind(("", 8090))
# 设置监听
self.tcp_server_socket.listen(128)
# 定义一个handle_client_request()
def handle_client_request(self, new_socket, ip_port):
# 接收客户端消息
recv_data = new_socket.recv(1024)
recv_data = recv_data.decode('gbk')
print(f'{ip_port}客户端发送过来的消息:{recv_data}')
# 返回(发送)消息给客户端
content = '信息已收到,over,over!'.encode('gbk')
new_socket.send(content)
# 处理完成后,关闭新套接字对象
# new_socket.close()
# 定义一个start方法,用于启动WebServer,接收客户端连接
def start(self):
while True:
# 等待客户端连接
new_socket, ip_port = self.tcp_server_socket.accept()
# 定义一个方法,用于接收和发送消息
self.handle_client_request(new_socket, ip_port)
# 创建程序执行入口,实例化WebServer类生成对象
if __name__ == '__main__':
# 实例化对象
ws = WebServer()
# 调用自身方法,用于启动服务
ws.start()
# 导入模块
import socket
# 1、创建套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2、绑定IP与端口
tcp_server_socket.bind(("", 8090))
# 3、设置监听
tcp_server_socket.listen(128)
# 4、等待客户端连接
while True:
# 使用try...except捕获连接异常
try:
new_socket, ip_port = tcp_server_socket.accept()
while True:
try:
# 5、接收客户端发送过来的消息
recv_data = new_socket.recv(1024)
recv_data = recv_data.decode('gbk')
print(f'{ip_port}:{recv_data}')
content = input('服务器端消息:').encode('gbk')
new_socket.send(content)
except ConnectionResetError:
print(f'{ip_port}客户端连接已经断开')
break
except:
print('出错,退出服务器监听')
break
# 关闭套接字对象
tcp_server_socket.close()
端口复用:
import socket
if __name__ == '__main__':
# 1、创建服务器端套接字对象
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2、绑定IP地址与端口号
tcp_server_socket.bind(("", 8888))
# 3、开启监听
tcp_server_socket.listen(128)
# 4、等待接收客户端连接请求
conn_socket, ip_port = tcp_server_socket.accept()
print('客户端IP+端口:', ip_port)
# 5、接收数据
recv_data = conn_socket.recv(1024)
print('接收到的数据:', recv_data.decode())
# 6、发送数据
conn_socket.send("客户端的数据已经收到了".encode())
# 7、关闭套接字
conn_socket.close()
tcp_server_socket.close()
本期的笔记分享就到这里啦,下期分享HTTP协议的介绍!