python实现tcp通信以及静态服务器
前言:python中的socket模块详看前面的博客:socket模块介绍以及UDP通信实现
tcp客户端实例
'''tcp客户端'''
import socket
if __name__ == '__main__':
# 1.套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2.创建链接
tcp_socket.connect(('10.10.24.100', 8080))
# 3.发送信息
while True:
send_str = input('输入')
tcp_socket.send(send_str.encode('utf-8'))
ret = tcp_socket.recv(1024)
print(ret.decode('utf-8'))
# 4.关闭
tcp_socket.close()
tcp服务端实例
'''这是tcp服务端
1.创建socket套接字
2.需要使用bind绑定端口
3.listen监听模式,等待接收用户的链接,
使得套接字变成被动状态,会阻塞进程
4.accept接收客户端的数据并处理
'''
import socket
import threading
tcp_socket = None
client_sockets = [] # 放每个客户端的socket
# 这是接收客户端传过来的信息并确认的函数
def exchange():
while True:
for sock in client_sockets:
try:
# 如果接收到一个长度为0的数据,说明对方主动关闭了
data = sock.recv(1024).decode('utf-8')
print(data)
sock.send('服务端已经收到信息'.encode('utf-8'))
except Exception as e:
print(e)
if not data:
client_sockets.remove(sock)
sock.close()
if __name__ == '__main__':
# 1.套接字
# global tcp_socket
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 立即回收端口
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2.创建链接,绑定端口
tcp_socket.bind(('', 9700))
# 3.监听模式
tcp_socket.listen(5)
# # 4.accept接收 返回一个元祖,第一个参数是新的套接字处理用户,第二个是用户地址信息
# service_client_socket, client_addressinfo = tcp_socket.accept()
# 创建并启动线程
thread_client = threading.Thread(target=exchange)
thread_client.start()
while True:
service_client_socket, client_addressinfo = tcp_socket.accept()
if service_client_socket:
print('客户端连接地址为;', client_addressinfo)
# service_client_socket.setblocking(0) # 防止堵塞
client_sockets.append(service_client_socket) # 添加进客户服务的列表
tcp静态服务器实例
import socket
'''这个程序实现的是静态服务器'''
if __name__ == '__main__':
"'主函数实现逻辑'"
# 创建服务端socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
server_socket.bind(('', 9090)) # 绑定端口
# 监听
server_socket.listen()
# 取出服务socket
handler_socket, address_info = server_socket.accept()
# 打印get请求内容
data = handler_socket.recv(1024)
# 这是分割返回的字符串
request_data = data.splitlines()
for i in request_data:
print(i)
# print(data.decode('utf-8'))
# 响应头
response_header = 'HTTP/1.1 200 ok\r\n'
response_header += '\r\n'
response_body = 'hello world'
response = response_header + response_body
# 浏览器访问地址http://localhost:9090/即可得到内容
handler_socket.send(response.encode('utf-8'))