程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python 實驗八 網絡程序設計

編輯:Python

2022.6.10 下午 實驗八

實驗八 網絡程序設計

文章目錄

    • 前言
    • 題目

前言

本文章是 【Python語言基礎】 專欄的文章,主要是上課的隨堂筆記與練習
Python專欄 傳送門
實驗源碼已在Github整理

題目

使用基於TCP或UDP套接字編寫一個智能聊天機器人程序

問題分析

TCP工作需要建立連接、數據連接、斷開連接三個步驟。利用socket模塊,設計服務端與客戶端,通過設置IP和端口號將二者連接。在服務端建立詞庫,客戶端給服務端發送消息,服務端與詞庫做匹配後返回給客戶端並輸出

socket模塊常用於TCP編程的方法:

socket.socket:創建套接字

serverSocket.bind((IP, Port)) :綁定套接字

connect(address):連接遠程計算機

send(bytes[,flags]):發送數據

recv(bufsize[,flags]):接收數據

bind(address):綁定地址,通常用於服務端

listen(backlog):開始監聽,等待客戶端連接

accept():響應客戶端的請求

代碼

簡易版

# server.py
'''先運行服務端再運行客戶端'''
""" @Author:張時貳 @Date:2022年06月15日 @CSDN:張時貳 @Blog:zhangshier.vip """
import socket
serverSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #創建套接字
serverSocket.bind(('127.0.0.1',12345)) #綁定套接字
print("在12345端口綁定UDP...")
answers = ["伽利略, 哥白尼","愛迪生, 特斯拉","諾貝爾, 門捷列夫"] #回答列表
i = 0
while True:
question,addr = serverSocket.recvfrom(1024) #接收客戶端信息
print("客戶端問:",question.decode()) #輸出接收的問題
#發送數據給客戶端
serverSocket.sendto(bytes("服務器答:" + answers[i],encoding='utf8'),addr)
i = i + 1
serverSocket.close() #關閉套接字
# client.py
""" @Author:張時貳 @Date:2022年06月15日 @CSDN:張時貳 @Blog:zhangshier.vip """
import socket
clientSocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #創建套接字對象
questions = ['世界上最偉大的天文學家是誰?','世界上最偉大的發明家是誰?',
'世界上最偉大的化學家是誰?'] #問題列表
#遍歷發送列表questions中的問題
for question in questions:
#發送問題給服務器
clientSocket.sendto(bytes(question,encoding='utf8'),('127.0.0.1',12345))
print("客戶端問:" + question) #輸出發送的問題
answer,addr = clientSocket.recvfrom(1024) #接收服務器回答
print(str(answer.decode())) #輸出回答
clientSocket.close() #關閉套接字

略加優化,可以粗略判斷回復相近消息

# server.py
""" @Author:張時貳 @Date:2022年06月08日 @CSDN:張時貳 @Blog:zhangshier.vip """
'''優化非原創,鏈接:http://t.csdn.cn/DOI0V'''
'''先運行服務端代碼,然後運行客戶端'''
import socket
from os.path import commonprefix
# 建立聊天回復字典
words = {
'What is your name': 'Zhangshier',
'how are you?': 'Fine,thank you!',
'how old are you?': '18 forever',
'bye': 'Bye!'}
# 服務端主機IP地址和端口號,空字符串表示本機任何可用IP地址
HOST = "192.168.43.214"
PORT = 50007
# 使用IPV4協議,使用tcp協議傳輸數據
s = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
# 綁定端口和端口號
s.bind ( (HOST, PORT) )
# 開始監聽,規定最多支持1個客戶端連接
s.listen ( 1 )
print ( '目前監聽的端口號是:', PORT )
conn, addr = s.accept ()
print ( '目前連接的IP地址是:', addr )
# 開始聊天
while True:
# 最多可以接收1024比特大小的內容,並解碼
data = conn.recv ( 1024 ).decode ()
# 如果是空,退出
if not data:
break
print ( '接收到的內容:', 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, 'Sorry,can\'t find your problem! ' ).encode () )
conn.close ()
# client.py
import socket
import sys
# 服務端主機IP地址和端口號 192.168.43.214
HOST = "192.168.43.214"
PORT = 50007
# 使用IPV4協議,使用tcp協議傳輸數據
s = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
try:
# 連接服務器
s.connect ( (HOST, PORT) )
except Exception as e:
print ( '找不到服務器,請稍後重試!' )
sys.exit ()
while True:
c = input ( '請輸入你想發送的消息:' )
# 發送數據,使用UTF-8編碼成字節碼
s.sendall ( c.encode () )
# 從服務端接收數據,大小最多為1024比特
data = s.recv ( 1024 )
# 解碼
data = data.decode ()
print ( '收到回復:', data )
if c.lower () == 'bye':
break
# 關閉連接
s.close ()

結果


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved