python使用TCP实现简单对话

python实现客户端与服务端的简单对话

英文:809词 | 中文:2550字

Posted by YY——阳阳 on November 3, 2020

需要先启动服务器,再启动客户端。

简单的一次TCP对话

服务端

#tcp2
import socket

if __name__ == '__main__':
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_server_socket.bind(('192.168.137.1', 5000))
    tcp_server_socket.listen(128)
    # 返回一个元组
    new_client_socket, client_addr = tcp_server_socket.accept()
    print(client_addr)

    # 接收客户端发送过来的请求
    recv_data = new_client_socket.recv(1024)

    print(recv_data)
    # 返回给客户端数据
    new_client_socket.send('1111'.encode('utf-8'))

    new_client_socket.close()
    tcp_server_socket.close()

客户端

#tcp1
import socket


if __name__ == '__main__':
    # 创建tcp套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 链接服务器
    tcp_socket.connect(('192.168.137.1', 5000))
    # 发送/接收数据
    send_data = input('请输入发送数据')
    tcp_socket.send(send_data.encode('utf-8'))
    sever_data = tcp_socket.recv(1024)
    print(sever_data)
    # 关闭套接字
    tcp_socket.close()

效果图(一次通话后立即断开) 在这里插入图片描述

在这里插入图片描述

TCP持续对话

服务端

#tcp2
import socket
from os.path import commonprefix

words = {
    'how are you?': "Fine thank you",
    'how old are you?': '38',
    'what is your name?': 'Ji Ruan',
    "what's your name?": "Ji Ruan",
    'where do you work?': 'Nan Yang',
    'bey': 'Bye'
}
HOST = ''
PORT = 50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定socket
s.bind((HOST, PORT))
# 开始监听一个客户端连接
s.listen(1)
print("Linsten on port :", PORT)
# 阻塞等待客户端连接
conn, addr = s.accept()
print("Connected by", addr)
# 开始聊天
while True:
    data = conn.recv(512).decode()  # 解码
    if not data:
        break
    print("Received message:", data)
    # 尽量猜测对方要表达的真正意思
    m = 0
    key = ''
    for k in words.keys():
        # 删除多余的空白字符
        data = ' '.join(data.split())
        # 与某个 键接近,就直接返回
        if len(commonprefix([k, data])) > len(k) * 0.7:
            key = k
            break
            # 使用选择发,选择一个重合度交的键
        length = len(set(data.split()) & set(k.split()))
        if length > m:
            m = length
            key = k
    # 选择适合信息进行回复
    conn.sendall(words.get(key, 'Sorrey.').encode())
conn.close()
s.close()

客户端

#tcp1
import socket
import sys
#服务端主机IP地址,和端口号
HOST = '192.168.137.1'
PORT = 50007
s =socket.socket(socket.AF_INET,socket.SOCK_STREAM)

try:#异常处理,当服务器未开启或者IP错误提示
    #连接服务器
    s.connect((HOST, PORT))
except Exception as e:
    print("Server not found or not open")
    print(e)
    sys.exit()

while True:
    c = input("Input the content you want to send:")
    #发送数据
    s.sendall(c.encode())
    #从服务器接收数据
    data = s.recv(512)
    data = data.decode()
    print("Received:" ,data)
    if c.lower() == 'bey':
        break
#关闭连接
s.close()

效果图(再输入结束指令后断开链接)

在这里插入图片描述

在这里插入图片描述