1. 程式人生 > >用UDP搭建字典查詢服務

用UDP搭建字典查詢服務

顧名思義,也算是網路程式設計的作業吧

一步步來,第一步,搭建一個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()

實驗結果

當然後續還是會加一些功能的,什麼沒有搜查到什麼的,比較想做一個切換字典的功能