首页 > 其他 > 详细

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

时间:2019-03-01 00:49:52      阅读:200      评论:0      收藏:0      [点我收藏+]

一、通信循环

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

技术分享图片
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远程执行命令

 

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

原文:https://www.cnblogs.com/zhangbingsheng/p/10454258.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!