话不多说,直接上练习代码
1.hostserver
import socket
HOST = 'localhost'
PORT = 12348
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # 1.创建 socket 对象
s.bind((HOST, PORT)) # 2.绑定端口号【绑定套接字:调用 bind(hostname, port) 函数来指定服务的 port(端口)】
# 3. 设置最大连接数,超过后排队 【监听套接字:调用listen函数,指定最多允许多少个客户连接到服务器。它的值至少为1。
# 收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。】
s.listen(1)
# 4.建立客户端连接【等待接受连接:调用 socket 对象的 accept 方法。该方法等待客户端的连接,并返回 connection 对象,表示已连接到客户端。
# socket会时入“waiting”状态,也就是处于阻塞状态。客户请求连接时,方法建立连接并返回服务器。】
conn, addr = s.accept()
with conn:
print('Connected by', addr)
while True:
conn.send(b'2')
# data = conn.recv(1024)
# if not data:
# break
# conn.sendall(data)
2. client
import socket
import time
from threading import Thread
class client:
def __init__(self, ip, port):
self.s = None
self.ip = ip
self.port = port
def connect(self):
while True:
try:
self.s = socket.socket()
self.s.connect((self.ip, self.port))
except Exception as e:
print('connect error: %s' % e)
time.sleep(5)
continue
else:
print('connect success')
thread = Thread(target=self.recv_msg())
thread.setDaemon(True)
thread.start()
def recv_msg(self):
while True:
try:
data = self.s.recv(65535)
if not data or len(data) > 10:
break
print(data.decode('utf-8'))
except Exception as e:
print(e)
break
self.connect()
def send_msg(self):
i = 0
while True:
try:
self.s.send(b'3')
i += 1
if i > 10:
break
except Exception as e:
print(e)
break
if __name__ == '__main__':
client = client('localhost', 12348)
client.connect()
# client.send_msg()
总结
- 客户端实现了断开自动重连的功能。同理如需要,host也可以这样做
- 接收信息,和发送消息功能还需要进一步练习