版权声明:——转载请留言询问—— https://blog.csdn.net/weixin_44344462/article/details/88219372
说明
本次实践并未牵扯到多任务,仅仅是在单线程下完成,所以客户端与服务器属于一人说一句的状态。客户端发起连接并成功后,由其先发送信息,客户端接收,然后客户端再发送信息。即属于“一人说一次话”的状态。后续引入协程后将没有限制,本次只是体会最简单的TCP通信过程。
通信示例
第一组(关闭当前连接后服务器继续等待连接)
客户端
——连接成功——
本机发送 : Hi i’m client.
已发送
Hi let’s have a talk.
本机发送 : Ok,what’s your name?
已发送
I’m the Server.
本机发送 : bye
已发送——客户端关闭——
服务器
——待接入——
(‘192.168.43.65’, 52934) : Hi i’m client.
服务器发送 : Hi let’s have a talk.
已发送
(‘192.168.43.65’, 52934) : Ok,what’s your name?
服务器发送 : I’m the Server.
已发送
(‘192.168.43.65’, 52934) : bye ———— 连接关闭
——待接入——
第二组(客户端关闭服务器)
客户端
——连接成功——
本机发送 : shut down
已发送——客户端关闭——
服务器
——待接入——
(‘192.168.43.65’, 52949) : shut down ———— 服务关闭
代码
注意
客户端与服务器代码需运行在两个不同的IP段,如一者运行在本机,二者运行在虚拟机上,并在客户端设置好服务器的IP与其监听的端口。
服务器
收到
"bye"
时将关闭当前的连接,收到"shut down"
时将关闭服务器。
from socket import *
# 创建TCP监听套接字
tcpSocket = socket(AF_INET, SOCK_STREAM)
# 设置绑定的信息
localAddress = ('', 9000)
# 绑定端口
tcpSocket.bind(localAddress)
# 设置最大连接数
tcpSocket.listen(1)
# 设置服务关闭标志位
on = 1
# 开始监听
while True:
try:
print("——待接入——")
connect, clientAddress = tcpSocket.accept()
while True:
try:
# 接收信息
data = connect.recv(1024).decode()
if (not data) or (data == "bye"): # 收到"bye"关闭当前连接
connect.close()
print("{} : {} ———— 连接关闭".format(clientAddress, data))
break
elif data == "shut down": # 收到"shut down"关闭服务器
tcpSocket.close()
on = 0
print("{} : {} ———— 服务关闭".format(clientAddress, data))
break
else:
print("{} : {}".format(clientAddress, data))
# 键入数据
data = input("服务器发送 : ")
connect.send(data.encode())
print("已发送")
except:
connect.close()
if on == 0:
break
except:
tcpSocket.close()
break
客户端
第
8
行设置成服务器的相关地址与绑定监听的端口。
from socket import *
# 创建套接字
tcpSocket = socket(AF_INET, SOCK_STREAM)
# 设置目标服务器地址信息
aimAddress = ('192.168.43.175', 9000)
# 绑定本地端口
tcpSocket.connect(aimAddress)
print("——连接成功——")
while True:
try:
# 键入数据
data = input("本机发送 : ")
# 发送数据
tcpSocket.send(data.encode())
print("已发送")
# 接收数据
data = tcpSocket.recv(1024).decode()
print(data)
if not data:
tcpSocket.close()
print("——客户端关闭——")
break
elif data == "bye":
tcpSocket.close()
print("——发起关闭连接请求并关闭客户端——")
except:
tcpSocket.close()
print("——客户端异常关闭——")
break