电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Python socket服務(wù)常用操作代碼實例

瀏覽:43日期:2022-07-20 08:39:52

套接字(socket)是一個抽象層,應(yīng)用程序可以通過它發(fā)送或接收數(shù)據(jù),可對其進行像對文件一樣的打開、讀寫和關(guān)閉等操作。

1. 實現(xiàn)客戶端發(fā)送字符,服務(wù)器返回大寫的字符:

服務(wù)器:

import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler): # 通過類的繼承,實現(xiàn) def handle(self): # 重寫父類的handle方法,所有的操作都在此方法中 while True: # 循環(huán),不停的接收從客戶端來的數(shù)據(jù) try:self.data = self.request.recv(1024).strip() # 從客戶端接收數(shù)據(jù),每次收1024字節(jié)print('{} send:'.format(self.client_address), self.data)self.request.send(self.data.upper()) # 從服務(wù)器發(fā)送給客戶端數(shù)據(jù) except ConnectionResetError as e:print(’Error: ’,e)breakif __name__ == ’__main__’: host,port = ’localhost’,9999 server = socketserver.ThreadingTCPServer((host,port),MyTCPHandler) # 通過多線程實現(xiàn)多個客戶端連接,每個客戶端連接都是一個線程 server.serve_forever()# 一直運行服務(wù)

客戶端:

import socketclient = socket.socket() # socket對象client.connect((’localhost’,9999)) # 連接服務(wù)器地址和端口while True: # 循環(huán),不停的輸入發(fā)送數(shù)據(jù) con = input(’>>>:’).strip() if len(con) ==0: continue # 不能發(fā)送空數(shù)據(jù),否則會阻塞 client.send(con.encode(’utf-8’)) # 發(fā)送數(shù)據(jù),必須是二進制的 data = client.recv(1024) # 接收服務(wù)器返回的數(shù)據(jù) print(data.decode())# 打印 解碼后的數(shù)據(jù)client.close() # 關(guān)閉

2. 通過socket執(zhí)行服務(wù)器命令:

用法:直接在客戶端輸入處輸入命令如:ipconfig

服務(wù)器:

import socketimport osimport threadingdef tcplink(sock, addr): print(’Accept new connection from %s:%s...’ % addr) while True: # 和每個接入的客戶端,進行多次數(shù)據(jù)通信 data = sock.recv(1024) # 接收客戶端數(shù)據(jù) if not data or data.decode(’utf-8’) == ’exit’: # 如果客戶端不發(fā)送數(shù)據(jù)或者發(fā)送了exit print(’client disconnected.’) break content = os.popen(data.decode(’utf-8’)).read() # 對發(fā)送來的數(shù)據(jù)執(zhí)行cmd命令,獲取結(jié)果 if len(content) == 0: #如果執(zhí)行的命令結(jié)果為空的,就手動造一個結(jié)果。因為如果為空數(shù)據(jù),會掛起,無法正常發(fā)送。 content = ’cmd not exists.’ sock.send(str(len(content.encode(’utf-8’))).encode(’utf-8’)) # 發(fā)送數(shù)據(jù)的長度 print(’send length:’, (len(content.encode(’utf-8’)))) # print(’content,’, content.encode(’utf-8’)) recv = sock.recv(1024) # 因為上下都有一個send連在一起,可能發(fā)生粘包現(xiàn)象,為了防止這種情況,可以讓客戶端重新應(yīng)答一下 print(’Answer:’,recv.decode(’utf-8’)) sock.send(content.encode(’utf-8’)) # 發(fā)送數(shù)據(jù) print(’send finished.’) sock.close() print(’Connection from %s:%s closed.’ % addr)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 監(jiān)聽端口:s.bind((’127.0.0.1’, 9999))s.listen(3)print(’Waiting for connection...’)while True: # 接受一個新連接: sock, addr = s.accept() # 創(chuàng)建新線程來處理TCP連接: t = threading.Thread(target=tcplink, args=(sock, addr)) t.start()

客戶端:

import socket# AF_INET 代表ipv4,SOCK_STREAM 代表TCPs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 確定網(wǎng)絡(luò)協(xié)議,生成對象s.connect((’127.0.0.1’,9999)) # 連接服務(wù)器的地址和端口,元組的形式。while True: msg = input(’>>:’).strip() if len(msg) != 0: # 如果消息為空,會一直掛起,所以不能為空 if msg ==’exit’: s.close() # 關(guān)閉連接 print(’Connection closed.’) break s.send(msg.encode(’utf-8’)) # 給服務(wù)器發(fā)送數(shù)據(jù),必須是二進制的 length = s.recv(1024) # 首先接收服務(wù)器返回的將要接收的數(shù)據(jù)的長度信息。 s.send(b’Ready to receive...’) # 發(fā)送接收命令 length = int(length.decode(’utf-8’)) print(’receive len:’, length) data_len = 0 data_recv = b’’ while data_len < length: # 已經(jīng)接收的信息的長度,如果小于總長度 data = s.recv(1024) # 從服務(wù)器接收數(shù)據(jù) data_recv += data data_len += len(data) print(data_recv.decode(’utf-8’)) # 打印返回的數(shù)據(jù)。

3. 通過socket傳輸文件:

用法:get 文件名

服務(wù)器:

import socketimport osimport hashlibimport threadingdef tcplink(sock, addr): print(’Accept new connection from %s:%s...’ % addr) while True: # 和每個接入的客戶端,進行多次數(shù)據(jù)通信 data = sock.recv(1024) # 接收客戶端數(shù)據(jù) if not data or data.decode(’utf-8’) == ’exit’: # 如果客戶端不發(fā)送數(shù)據(jù)或者發(fā)送了exit print(’client disconnected.’) break oper,filename = data.decode(’utf-8’).split() # 對接收的數(shù)據(jù)按照空格分割 if oper == ’get’: m = hashlib.md5() if os.path.isfile(filename):size = os.stat(filename).st_size # 獲取文件大小print(’Send size:’,size)sock.send(str(size).encode(’utf-8’)) # 發(fā)送文件大小recv = sock.recv(1024) # 接收客戶端確認(rèn)信息(因為上下文兩個send是連著的,所以為了防止粘包,接收一次信息)f = open(filename,’rb’)for line in f: sock.send(line) #讀取文件,發(fā)送給客戶端 m.update(line)# print(’Send finished.’,m.hexdigest()) # 打印md5的值sock.send(m.hexdigest().encode(’utf-8’)) # 把md5的值發(fā)送給客戶端 sock.close() print(’Connection from %s:%s closed.’ % addr)s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 監(jiān)聽端口:s.bind((’127.0.0.1’, 9999))s.listen(3)print(’Waiting for connection...’)while True: # 接受一個新連接: sock, addr = s.accept() # 創(chuàng)建新線程來處理TCP連接: t = threading.Thread(target=tcplink, args=(sock, addr)) t.start()

客戶端:

import socketimport hashlib# AF_INET 代表ipv4,SOCK_STREAM 代表TCPs = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 確定網(wǎng)絡(luò)協(xié)議,生成對象s.connect((’127.0.0.1’,9999)) # 連接服務(wù)器的地址和端口,元組的形式。while True: msg = input(’>>:’).strip() if len(msg) != 0: # 如果消息為空,會一直掛起,所以不能為空 if msg ==’exit’: s.close() # 關(guān)閉連接 print(’Connection closed.’) break s.send(msg.encode(’utf-8’)) # 給服務(wù)器發(fā)送數(shù)據(jù),必須是二進制的 length = s.recv(1024) # 首先接收服務(wù)器返回的將要接收的數(shù)據(jù)的長度信息。 s.send(b’Ready to receive...’) # 發(fā)送接收確認(rèn)命令 length = int(length.decode(’utf-8’)) print(’Recv size:’, length) data_len = 0 data_recv = b’’ # 新文件名 fileName = msg.split()[-1].split(’.’)[0] fileExt = msg.split()[-1].split(’.’)[-1] newFile = fileName+’-1.’+fileExt f = open(newFile,’wb’) # 打開文件,準(zhǔn)備寫入服務(wù)器發(fā)過來的文件 m = hashlib.md5() while data_len < length: # 已經(jīng)接收的信息的長度,如果小于總長度 size = length - data_len if size > 1024: # 如果剩下的信息長度大于1024,即不能一次性發(fā)完。size = 1024 else: # 如果能一次性發(fā)完,就只收剩下的信息。目的是準(zhǔn)確的接收文件的大小,把可能粘連的send的數(shù)據(jù)留給下一次recvsize = length-data_len data = s.recv(size) # 從服務(wù)器接收數(shù)據(jù) f.write(data) m.update(data) data_len += len(data) f.close() print(’recv_md5:’,m.hexdigest()) # 打印返回的數(shù)據(jù)。 recv = s.recv(1024) # 接收下一次send的數(shù)據(jù),即md5的值。 print(’orig_md5:’,recv.decode())

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 齿式联轴器-弹性联轴器-联轴器厂家-江苏诺兴传动联轴器制造有限公司 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 耐火浇注料-喷涂料-浇注料生产厂家_郑州市元领耐火材料有限公司 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 大连海岛旅游网>>大连旅游,大连海岛游,旅游景点攻略,海岛旅游官网 | 制冷采购电子商务平台——制冷大市场 | 结晶点测定仪-润滑脂滴点测定仪-大连煜烁 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 威客电竞(vk·game)·电子竞技赛事官网 | 浙江自考_浙江自学考试网| 制丸机,小型中药制丸机,全自动制丸机价格-甘肃恒跃制药设备有限公司 | 污水/卧式/潜水/钻井/矿用/大型/小型/泥浆泵,价格,参数,型号,厂家 - 安平县鼎千泵业制造厂 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 减速机电机一体机_带电机减速器一套_德国BOSERL电动机与减速箱生产厂家 | 北京租车公司_汽车/客车/班车/大巴车租赁_商务会议/展会用车/旅游大巴出租_北京桐顺创业租车公司 | 千斤顶,液压千斤顶-力良企业,专业的液压千斤顶制造商,shliliang.com | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 江苏大隆凯科技有限公司 | 警方提醒:赣州约炮论坛真的安全吗?2025年新手必看的网络交友防坑指南 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 欧必特空气能-商用空气能热水工程,空气能热水器,超低温空气源热泵生产厂家-湖南欧必特空气能公司 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思| 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 日本东丽膜_反渗透膜_RO膜价格_超滤膜_纳滤膜-北京东丽阳光官网 日本细胞免疫疗法_肿瘤免疫治疗_NK细胞疗法 - 免疫密码 | YT保温材料_YT无机保温砂浆_外墙保温材料_南阳银通节能建材高新技术开发有限公司 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | IWIS链条代理-ALPS耦合透镜-硅烷预处理剂-上海顶楚电子有限公司 lcd条形屏-液晶长条屏-户外广告屏-条形智能显示屏-深圳市条形智能电子有限公司 | 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 青岛侦探_青岛侦探事务所_青岛劝退小三_青岛调查出轨取证公司_青岛婚外情取证-青岛探真调查事务所 | 球形钽粉_球形钨粉_纳米粉末_难熔金属粉末-广东银纳官网 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 武汉不干胶印刷_标签设计印刷_不干胶标签印刷厂 - 武汉不干胶标签印刷厂家 |