python 之 socket 进阶认识

 

   上节模拟了一个socket  的简单通信,客户端向服务端发送一个信息,随后服务端向客户端发送数据,然后关闭服务端连接,客户端接收数据,也关闭客户端连接。真实的通信是有一个不停的交互信息,下面模拟一个循环发送信息的过程。

          

循环接收发送数据

         模拟服务端

import socket

# 生成一个socket 对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定监听地址
server.bind(('127.0.0.1', 9000))
# 开始监听
server.listen(5)
print("服务端开始监听 ......")
# 开始接收连接请求
conn, addr = server.accept()
# 打印接收大的连接
print(addr)
while True:
    data = conn.recv(1024)
    if not data: break # 如果收不到数据就终止
    print("服务端从客户端接收的数据为", data)
    conn.sendall(data.upper())  # 将收到的数据大写返回客户端
conn.close()
server.close()

        模拟客户端

import socket

# 生成一个客户端对象
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
client.connect(('127.0.0.1', 9000))

while True:
msg = input('>>>:').strip()
if not msg: continue # 如果msg 为空就继续输入
client.sendall(msg.encode('utf-8'))
data = client.recv(1024)
print("客户端从服务器接收的数据", data.decode('utf-8'))
client.close()

 

  执行交互流程

  客户端

 

服务端 

 

 在发送消息的过程中,客户端异常终止时,将会出现如下状态

当手动终止客户端发送状态

查看服务端报错如下


优化服务端的代码如下:
import socket

# 生成一个socket 对象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定监听地址
server.bind(('127.0.0.1', 9000))
# 开始监听
server.listen(5)
print("服务端开始监听 ......")
# 开始接收连接请求
conn, addr = server.accept()
# 打印接收大的连接
print(addr)
while True:
    try:
        data = conn.recv(1024)
        if not data: break # 如果收不到数据就终止
        print("服务端从客户端接收的数据为", data)
        conn.sendall(data.upper())  # 将收到的数据大写返回客户端
    except ConnectionResetError:
        break
conn.close()
server.close()

 当手动终止客户端的发送后,服务端未报错

 

posted @ 2018-10-24 00:05  水滴石川  阅读(108)  评论(0)    收藏  举报