相關(guān)說明
本文給出的是TCP協(xié)議的Socket編程。
其中用了一個dbmanager數(shù)據(jù)庫操作模塊,這個模塊是我自己定義的,可以在我的另一個文章中找到這個模塊的分享。python操作mysql數(shù)據(jù)庫的精美實(shí)用模塊
服務(wù)段完整代碼
【如下代碼,完全復(fù)制,直接運(yùn)行,即可使用】
import socket
import threading
import json
from tools import dbmanager #這個模塊是我自定義的,可以在我的另一個文章中找到這個模塊的分享
###################################
####服務(wù)器參數(shù)
####################################
HOST = '0.0.0.0' #ip 0.0.0.0 表示本機(jī)所有ip地址
PORT = 9905 #端口號
Max_Listen =10 #最大監(jiān)聽數(shù)
BUFSIZ = 1024 #每次接收數(shù)據(jù)長度
ENDMARK = "messageover" #信息結(jié)束標(biāo)記
####################################
####業(yè)務(wù)處理函數(shù)
####################################
def searchuser(sock, dict_data):
the_searchstring = dict_data['par']
#########構(gòu)造sql語句
sqlstring0 = "SELECT * FROM hr_user WHERE id>0 "
if the_searchstring != None and the_searchstring != "":
sqlstring0 = sqlstring0 + " AND (username LIKE '%" + the_searchstring + "%')"
########執(zhí)行數(shù)據(jù)庫查詢
data0 = dbmanager.executeSelectAllback(sqlstring0)
if data0 == False:
message = {'action': 'Error_SqlConnet'}
sock.sendall(json.dumps(message).encode("utf-8")) ####發(fā)送數(shù)據(jù)給客戶端
return
if data0 != None:
message = {'action': 'SearchUser_Success'}
message['data'] = data0
sock.sendall(json.dumps(message).encode("utf-8")) ####發(fā)送數(shù)據(jù)給客戶端
return
####################################
####線程處理函數(shù)
####################################
def readRequest(sock, addr):
print('Accept new connection from %s:%s...' % addr)
allresponse = ""
while True:
########接收數(shù)據(jù)
data = sock.recv(BUFSIZ).decode('utf-8')
if len(data):
allresponse = allresponse + data
if ENDMARK not in allresponse:
continue
if allresponse == "":
break
########處理數(shù)據(jù)
allresponse =allresponse[:-len(ENDMARK)]
dict_data = json.loads(allresponse)
action = dict_data['action']
if action == "SearchUser":
searchuser(sock, dict_data) #業(yè)務(wù)處理
break
elif action == "SearchCompany":
break #業(yè)務(wù)處理
else:
break
########關(guān)閉連接
sock.close()
print('Connection from %s:%s closed.' % addr)
####################################
#程序入口
####################################
if __name__ == "__main__":
#####創(chuàng)建一個socket
the_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET指定使用IPv4協(xié)議 #SOCK_STREAM指定使用面向流的TCP協(xié)議
#####綁定端口
the_socket.bind((HOST, PORT))
#####監(jiān)聽端口
the_socket.listen(Max_Listen)
print('Waiting for connection...')
while True:
# 接受一個新連接
sock, addr = the_socket.accept()
# 創(chuàng)建新線程來處理TCP連接
the_thread = threading.Thread(target=readRequest, args=(sock, addr))
the_thread.start()
####################################
客戶端完整代碼
【如下代碼,完全復(fù)制,直接運(yùn)行,即可使用】
import socket
import json
#############################################################################################
####參數(shù)
#############################################################################################
HOST = '127.0.0.1'
PORT = 9905
BUFSIZ = 1024
ENDMARK = "messageover"
#############################################################################################
#######請求處理函數(shù)
#############################################################################################
def issueRequest(action, par):
# 創(chuàng)建一個socket
the_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立連接:
try:
the_socket.connect((HOST, PORT))
except:
print("服務(wù)器連接失?。?)
return
#############################
try:
########發(fā)送數(shù)據(jù):
message = {}
message['action'] = action
message['par'] = par
last_message = json.dumps(message) + ENDMARK # son.dumps()將 Python 對象編碼成 JSON 字符串
print(message)
the_socket.sendall(last_message.encode("utf-8"))
########接收數(shù)據(jù)
allresponse = ""
while True:
response = the_socket.recv(BUFSIZ).decode('utf-8')
if len(response):
allresponse = allresponse + response
continue
if allresponse == "":
break
#######處理數(shù)據(jù)
dict_data = json.loads(allresponse) # json.loads()將已編碼的 JSON 字符串解碼為 Python 對象
action = dict_data['action']
if action == "SearchUser_Success":
data0 = dict_data['data']
print(data0)
break
elif action == "Error_SqlConnet":
print("數(shù)據(jù)查詢失??!")
break
else:
break
except:
print("服務(wù)器連接異常,數(shù)據(jù)查詢失??!")
finally:
#######關(guān)閉連接
the_socket.close()
####################################
#程序入口
####################################
if __name__ == "__main__":
the_searchstring ="張三"
issueRequest("SearchUser", the_searchstring)
本文如有幫助,敬請留言鼓勵。
本文如有錯誤,敬請留言改進(jìn)。