网络编程(三)--通信循环、链接循环、粘包问题

一、通信循环

服务端和客户端可以进行连续的信息交流

from socket import *

ser_socket = socket(AF_INET, SOCK_STREAM)

ser_socket.bind(('127.0.0.1', 8886))

ser_socket.listen(5)

conn, addr = ser_socket.accept()

while True:
    try:               # 抛出异常,若不抛出处理,一旦客户端强行退出,服务端就会报错
        data = conn.recv(1024)
        print(data.decode('utf-8'))

        conn.send(data.upper())
    except ConnectionResetError:
        break

conn.close()

ser_socket.close()
通信循环服务端
from socket import *

cli_socket = socket(AF_INET, SOCK_STREAM)

cli_socket.connect(('127.0.0.1', 8886))

#通信循环,可以多次输入
while True:
    msg = input('>>>>:').strip()
    if len(msg) == 0:            # 如果输入为空,给服务端发送信息之后,服务端什么都没接受,一直处于阻塞状态
        continue
    cli_socket.send(msg.encode('utf-8'))

    data = cli_socket.recv(1024)
    print(data.decode('utf-8'))

cli_socket.close()
通信循环客户端

tcp是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制

二、链接循环

from socket import *

ser_socket = socket(AF_INET, SOCK_STREAM)

ser_socket.bind(('127.0.0.1', 8886))

ser_socket.listen(5)


#链接循环,可以同时启动最多6个客户端,但是只有一个处于连接状态,其余最多5个在半连接池等待。只有当连接状态的客户端断开连接,下一个客户端才进入连接
while True:
    conn, addr = ser_socket.accept()

    # 通信循环
    while True:
        try:
            data = conn.recv(1024)
            print(data.decode('utf-8'))

            conn.send(data.upper())
        except ConnectionResetError:
            break

    conn.close()

ser_socket.close(
链接循环服务端
from socket import *

cli_socket = socket(AF_INET, SOCK_STREAM)

cli_socket.connect(('127.0.0.1', 8886))

while True:
    msg = input('>>>>:').strip()
    if len(msg) == 0:
        continue
    cli_socket.send(msg.encode('utf-8'))

    data = cli_socket.recv(1024)
    print(data.decode('utf-8'))

cli_socket.close()
链接循环客户端

三、粘包问题

1、模拟ssh远程执行命令

猜你喜欢

转载自www.cnblogs.com/zhangbingsheng/p/10454258.html