python网络编程--socket简单实现
python网络编程
一、客户端控制服务端执行命令
server:
#!/usr/local/python3/bin/python3.6#-*-coding:utf-8-*-#AUTH:FJCfromsocketimport*fromtimeimportctimeimportsubprocessHOST=''#HOST变量空白,表示可以使用任何地址PORT=21567BUFSIZ=1024#缓冲区大小为1KBADDR=(HOST,PORT)tcp_ser_sock=socket(AF_INET,SOCK_STREAM)#创建套接字对象,AF_INET表示面向网络的,SOCK_STREAM表示用于TCP传输的套接字类型tcp_ser_sock.bind(ADDR)#将地址(主机名、端口号对)绑定到套接字上tcp_ser_sock.listen(5)#设置并启动TCP监听器,listen的参数表示连接被转接或拒绝之前,传入连接请求的最大数whileTrue:print('waitingforconnecting...')tcp_cli_sock,addr=tcp_ser_sock.accept()#返回一个socket对象和属于客户端的套接字print('...connectfrom:',addr)whileTrue:try:data=str(tcp_cli_sock.recv(BUFSIZ),'utf8')exceptException:breakifnotdata:continueobj=subprocess.Popen(data,shell=True,stdout=subprocess.PIPE)result=obj.stdout.read()tcp_cli_sock.send(bytes(str(len(result)),'utf8'))tcp_cli_sock.recv(BUFSIZ)#解决粘包现象tcp_cli_sock.send(result)tcp_cli_sock.close()tcp_ser_sock.close()
client:
#-*-coding:utf-8-*-#AUTH:FJCfromsocketimport*fromsysimportexitHOST='127.0.0.1'PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)tcp_cli_sock=socket(AF_INET,SOCK_STREAM)tcp_cli_sock.connect(ADDR)whileTrue:data=input('command>')ifnotdata:continueelifdata==("exit"or"quit"):exit(1)tcp_cli_sock.send(bytes(data,'utf8'))result_len=str(tcp_cli_sock.recv(BUFSIZ),'utf8')tcp_cli_sock.send(bytes(1))result=bytes()whilelen(result)!=int(result_len):data_rec=tcp_cli_sock.recv(BUFSIZ)result+=data_recprint(str(result,'gbk'))#tcp_cli_sock.close()
二、文件上传下载
server:
#-*-coding:utf-8-*-#AUTH:FJCfromsocketimport*importosHOST=''PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)tcp_ser_sock=socket(AF_INET,SOCK_STREAM)tcp_ser_sock.bind(ADDR)tcp_ser_sock.listen(5)BASE_DIR=os.path.dirname(os.path.abspath(__file__))defupload():file_size=str(tcp_cli_sock.recv(BUFSIZ),'utf8')file_size=int(file_size)file_recv=0withopen(path,'ab')asf:whilefile_recv!=file_size:data=tcp_cli_sock.recv(BUFSIZ)f.write(data)file_recv+=len(data)defdownload():file_size=os.stat(path).st_sizetcp_cli_sock.send(bytes(str(file_size),'utf8'))file_send=0withopen(path,'rb')asf:whilefile_send!=file_size:data=f.read(1024)tcp_cli_sock.send(data)file_send+=len(data)if__name__=='__main__':whileTrue:print('waitingforconnecting...')tcp_cli_sock,addr=tcp_ser_sock.accept()print('...connectfrom:',addr)try:up_down_info=str(tcp_cli_sock.recv(BUFSIZ),'utf8')cmd,path=up_down_info.split('|')filename=os.path.basename(path)path=os.path.join(BASE_DIR,'server_dir',filename)ifcmd=='get':download()elifcmd=='post':upload()exceptException:continuetcp_cli_sock.close()
client:
#-*-coding:utf-8-*-#AUTH:FJCfromsocketimport*fromsysimportexitimportosHOST='127.0.0.1'PORT=21567BUFSIZ=1024ADDR=(HOST,PORT)BASE_DIR=os.path.dirname(os.path.abspath(__file__))defget():file_size=str(tcp_cli_sock.recv(BUFSIZ),'utf8')print(type(file_size))file_size=int(file_size)file_recv=0withopen(path,'ab')asf:whilefile_recv!=file_size:data=tcp_cli_sock.recv(BUFSIZ)f.write(data)file_recv+=len(data)print("文件下载成功!")defpost():file_size=os.stat(path).st_sizetcp_cli_sock.send(bytes(str(file_size),'utf8'))file_send=0withopen(path,'rb')asf:whilefile_send!=file_size:data=f.read(1024)tcp_cli_sock.send(data)file_send+=len(data)print("文件上传成功!")if__name__=='__main__':whileTrue:tcp_cli_sock=socket(AF_INET,SOCK_STREAM)tcp_cli_sock.connect(ADDR)command=input('(command|file)>')ifnotcommand:continueelifcommand=="exit"orcommand=="quit":exit(1)cmd,path=command.split('|')up_down_info='%s|%s'%(cmd,path)filename=os.path.basename(path)tcp_cli_sock.send(bytes(up_down_info,'utf8'))path=os.path.join(BASE_DIR,filename)ifcmd=='get':get()ifcmd=='post':post()tcp_cli_sock.close()
网络编程基础知识
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。