01、socket编程:说明一下这里一般部署一个客户一个服务器
--在socket编程中主要是socket_server 和 socket_client编程两个部分
--一个服务器 一个客户端
02、socket 介绍
--server由于不知道client什么时候会发来请求,因此必须时时刻刻处于等待状态
--爬虫就是一个显而易见的客户端 client
--socket_server时时处于监听状态,这里监听的配置包括:协议 ip 端口
--协议:这里可以选择tcp udp等都可以
--IP:有的时候为了保证安全,只允许本地进行访问
--端口:对于任何一个app都必须使用特定的端口,否则访问者无法接入服务器
03、初步实现client 和 server对话
import socket
"""
1、记住这里必须在发送之前将数据编码为byte,收到数据之后需要将数据解码为字符串或对应的数据
"""
# socket 通信服务端初始化:网络类型 协议类型
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听地址端口
server.bind(('0.0.0.0', 8000))
server.listen()
sock, addr = server.accept()
# 获取从客户端获取的数据
# 一次获取1kb数据
data = sock.recv(1024)
print(data.decode('utf8'))
# 接收到消息之后返回一个相应给客户端
sock.send('hello {}'.format(data.decode('utf8')).encode('utf8'))
# 关闭服务和链接
server.close()
sock.close()
import socket
# socket 通信客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
# 发数据给服务器
client.send('bobby'.encode('utf8'))
# 接收服务器响应
data = client.recv(1024)
print(data.decode('utf8'))
client.close()
04、socket实现聊天 ---- 单个用户连接客户端,这里server 和 client各启动一次
--server
--代码如下:
import socket
"""
1、记住这里必须在发送之前将数据编码为byte,收到数据之后需要将数据解码为字符串或对应的数据
"""
# socket 通信服务端初始化:网络类型 协议类型
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听地址端口
server.bind(('0.0.0.0', 8000))
server.listen()
sock, addr = server.accept()
"""
2、这里通过while True实现聊天的不中断
"""
while True:
# 获取从客户端获取的数据
# 一次获取1kb数据
data = sock.recv(1024)
if data.decode('utf8') == 'close': # 这里不一定非要关闭服务器,一般是关闭客户端
break
print(data.decode('utf8'))
# 接收到消息之后返回一个相应给客户端
re_data = input()
sock.send(re_data.encode('utf8'))
# 关闭服务和链接
server.close()
sock.close()
--client
--代码如下:
import socket
# socket 通信客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
while True:
# 发数据给服务器
re_data = input()
client.send(re_data.encode('utf8'))
if re_data.encode('utf8') == 'close':
break
# 接收服务器响应
data = client.recv(1024)
print(data.decode('utf8'))
client.close()
05、多个用户连接客户端 ---- 这里server启动一次,client启动多个
--server启动
import socket
import threading
"""
1、记住这里必须在发送之前将数据编码为byte,收到数据之后需要将数据解码为字符串或对应的数据
"""
# socket 通信服务端初始化:网络类型 协议类型
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听地址端口
server.bind(('0.0.0.0', 8000))
server.listen()
"""
2、这里通过while True实现聊天的不中断
3、通过多线程实现同时连接多个用户
"""
def handle_sock(sock, addr):
while True:
# 获取从客户端获取的数据,一次1kb
data = sock.recv(1024)
if data.decode('utf8') == 'close': # 这里不一定非要关闭服务器,一般是关闭客户端
break
print(data.decode('utf8'))
# 接收到消息之后返回一个相应给客户端
re_data = input()
sock.send(re_data.encode('utf8'))
while True:
sock, addr = server.accept()
# 使用线程处理新接手的连接
client_thread = threading.Thread(target=handle_sock, args=(sock, addr))
client_thread.start()
# 关闭服务和链接
server.close()
sock.close()
--客户端启动
import socket
# socket 通信客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 8000))
while True:
# 发数据给服务器
re_data = input()
client.send(re_data.encode('utf8'))
if re_data.encode('utf8') == 'close':
break
# 接收服务器响应
data = client.recv(1024)
print(data.decode('utf8'))
client.close()