Socket 入门 及 多线程tcp链接
网络基础知识三要素
Socket是套接字的意思,是网络编程的核心对象,通信两端都独有自己的Socket对象, 数据在两个Socket之间通过 字节流(TCP协议) 或者 数据报包(UDP协议)的形式进行传输.
本文主要针对tcp流程进行讲解
socket-tcp流程图
1.创建服务器端
-
创建服务器端Socket对象, 指定: 地址族, 传输方式.
-
绑定ip地址 和 端口号.
-
设置监听. 范围: 1 ~ 128, 一般设置为: 5
-
等待客户端申请建立连接, 如果有, 则创建1个新的socket对象负责和该客户端交互.
-
接收客户端的回执信息.
-
释放资源.
import socket
if __name__ == '__main__':
# AF_INET 是 ipv4 , SOCK_STREAM 是 tcp协议
Server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定的ip地址和端口号
Server_socket.bind(('127.0.0.1', 8888))
# 注:这里127.0.0.1是本地ip回路,可以自行设置ip地址和端口号
# 监听端口号
Server_socket.listen(5)
# 等待链接
accept_socket, client_info = Server_socket.accept()
print(f'客户端 {client_info} 已连接')
# 接收信息(这步就是具体要实现的功能)
recv = accept_socket.recv(1024)
print(recv.decode('utf-8'))
# 关闭(仅关闭客户端对象.一般不关闭服务器对象)
accept_socket.close()
# Server_socket.close()
2. 创建客户端
- 创建客户端Socket对象, 指定: 地址族, 传输方式.
- 连接服务器端, 指定: 要连接到的服务器ip地址 和 端口号.
- 接收服务器端的发送的信息.
- 给服务端写一句话: 回执信息.
- 释放资源.
import socket
if __name__ == '__main__':
# 创建socket对象
client_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 链接服务器
client_Socket.connect(('127.0.0.1', 8888))
# 发送数据
client_Socket.send('https://blog.csdn.net/weixin_57336987?spm=1011.2415.3001.5343'.encode('utf-8'))
# 关闭连接
client_Socket.close()
先启动服务器端,在启动客户端,即可在服务器端接收到发送数据
3.多线程与长连接
这时有些小伙伴就要问了,你这个客户端和服务器端是一对一啊,如果客户端一直不关闭链接,别人就无法访问客户端,这里就要用到线程了
3.1创建多线程服务器端
import socket
import threading
import time
socks = []
PORT = 8888 # 设置端口号
HOST = "127.0.0.1" # 设置IP地址
def server_thread():
global socks
# AF_INET 是 ipv4 , SOCK_STREAM 是 tcp协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定的ip地址和端口号
server_socket.bind((HOST, PORT))
# 监听端口号
server_socket.listen(10)
print('等待链接....')
# 等待链接
try:
while True:
# 开启线程
accept_socket, client_info = server_socket.accept()
print(f'客户端 {client_info} 已连接')
p = threading.Thread(target=server_link, args=(accept_socket, client_info))
p.start()
except Exception as e:
print(f'Error: {str(e)}')
def server_link(accept_socket, client_info):
# 持续接受接收信息, 收到886结束
while True:
recv_data = accept_socket.recv(1024).decode('utf-8')
print(f'来自{client_info}: {recv_data}')
if recv_data == "886":
break
time.sleep(1)
if __name__ == '__main__':
# 调用函数
server_thread()
# server_socket.close()
3.2创建客户端测试
import socket
if __name__ == '__main__':
# 创建socket对象
client_Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 链接服务器
client_Socket.connect(('192.168.13.133', 8888))
# 发送数据
while True:
data = input('请输入要发送的数据:')
client_Socket.send(data.encode('utf-8'))
if data == '886':
break
# 关闭连接
client_Socket.close()
这里三个不同的客户端进行测试