用UDP搭建字典查詢服務
阿新 • • 發佈:2018-11-15
顧名思義,也算是網路程式設計的作業吧
一步步來,第一步,搭建一個UDP通訊(便於模擬,選擇了本地服務),實現個小功能好了,伺服器將收到的字元全部轉換成大寫發回給客戶端
伺服器:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- #伺服器 import socket BUFSIZE = 1024 #規定緩衝區的大小 ip_port = ('127.0.0.1', 9999) server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp協議 server.bind(ip_port) print('Listening at {}'.format(server.getsockname)) #getsockname()可以獲取套接字目前繫結的IP地址即埠,返回的是一個二元組 while True: data,client_addr = server.recvfrom(BUFSIZE) #從緩衝區讀取1024個位元組,The return value is a pair (bytes, client_address) if data==b'QUIT': server.sendto(b'see you later',client_addr) continue print('Data recived from clinet:', data) server.sendto(data.upper(),client_addr) #將收到的資料轉換成大寫字母發回給clinet server.close()
客戶端:
#!/usr/bin/env python3 # -*- coding: utf-8 -*- import socket BUFSIZE = 1024 client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp協議 while True: msg = input(">> ").strip() #strip() 方法用於移除字串頭尾指定的字元(預設為空格或換行符)或字元序列 ip_port = ('127.0.0.1', 9999) client.sendto(msg.encode('utf-8'),ip_port) # 以utf-8編碼對u進行編碼,獲得bytes型別物件 data,server_addr = client.recvfrom(BUFSIZE) if data==b'see you later': #輸入QUIT即可斷開連線 print('Data recived from sever:',data,server_addr) #client.sendto(b'goodbye',ip_port) break print('Data recived from sever:',data,server_addr) client.close()
然後就是模擬一個字典查詢了,我比較才,不會搭建資料庫什麼的,我就直接從本地的txt裡面讀取儲存著的字典內容來實現,菜到哭泣
讀取字典
#!/usr/bin/env python3 # -*- coding: utf-8 -*- def searchtext(str): f = open("新東方紅寶書.txt",'rb') #因為讀取的不全是unicode編碼,比如讀取中文是就會出現亂碼,只能讀取位元組流 try: #f = open('新東方紅寶書.txt','r') line = f.readline().strip() result=line.find(str) if result>=0: print(line.decode('gb2312','ignore')) return while line: line = f.readline().strip() result=line.find(str) if result>=0: print(line.decode('gb2312','ignore')) return finally: if f: f.close() return if __name__ == '__main__': searchtext(b'abhorrent')
結果如下
接下來就是合起來試試看了
server
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import string
import socket
def searchtext(str):
f = open("新東方紅寶書.txt",'rb') #因為讀取的不全是unicode編碼,比如讀取中文是就會出現亂碼,只能讀取位元組流
try:
#f = open('新東方紅寶書.txt','r')
line = f.readline().strip()
result=line.find(str)
if result>=0:
print(line.decode('gb2312','ignore'))
return line
while line:
line = f.readline().strip()
result=line.find(str)
if result>=0:
print(line.decode('gb2312','ignore'))
return line
finally:
if f:
f.close()
return
BUFSIZE = 1024 #規定緩衝區的大小
ip_port = ('127.0.0.1', 9999)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp協議
server.bind(ip_port)
print('Listening at {}'.format(server.getsockname)) #getsockname()可以獲取套接字目前繫結的IP地址即埠,返回的是一個二元組
while True:
data,client_addr = server.recvfrom(BUFSIZE) #從緩衝區讀取1024個位元組,The return value is a pair (bytes, client_address)
if data==b'QUIT':
server.sendto(b'see you later',client_addr)
continue
print('Data recived from clinet:', data)
server.sendto(searchtext(data),client_addr)
#server.sendto(data.upper(),client_addr) #將收到的資料轉換成大寫字母發回給clinet
server.close()
client
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
BUFSIZE = 1024
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # udp協議
while True:
msg = input(">> ").strip() #strip() 方法用於移除字串頭尾指定的字元(預設為空格或換行符)或字元序列
ip_port = ('127.0.0.1', 9999)
client.sendto(msg.encode('utf-8'),ip_port) # 以utf-8編碼對u進行編碼,獲得bytes型別物件
data,server_addr = client.recvfrom(BUFSIZE)
if data==b'see you later': #輸入QUIT即可斷開連線
print('Data recived from sever:',data,server_addr)
#client.sendto(b'goodbye',ip_port)
break
print('Data recived from sever:',data.decode('gb2312','ignore'),server_addr)
client.close()
實驗結果
當然後續還是會加一些功能的,什麼沒有搜查到什麼的,比較想做一個切換字典的功能