需要先启动服务器,再启动客户端。
简单的一次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()
效果图(再输入结束指令后断开链接)