Python socket模块方法实现详解
这篇文章主要介绍了Pythonsocket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
socketssh(不带防止粘包的方法)
#!/usr/bin/envpython
#-*-coding:utf-8-*-
#AuthorIanYing
#mail:kongqing.ying@yitu-inc.com
importsocket
importos
server=socket.socket()
server.bind(('localhost',6969))#绑定被监听端口
server.listen(5)#监听端口
whileTrue:
print("我要开始等电话了")
conn,addr=server.accept()#就是等待的意思
#conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例
print("电话来了%s"%[conn,addr])
whileTrue:
data=conn.recv(1024)
ifnotdata:
print('clientislost.')
break
#res=os.popen(data).read()#popen就是打开命令执行,read就是获取结果
#withopen('filename','r')asret:#这两行就可以用过来传输文件了。
#data=ret.read()
print('receive:',data)
conn.send(data.upper())
server.close()
socketclient模块
#!/usr/bin/envpython
#-*-coding:utf-8-*-
#AuthorIanYing
#mail:kongqing.ying@yitu-inc.com
importsocket
client=socket.socket()#声明socket类型,同时生成socket链接对象
client.connect(('localhost',6969))#localhost就是本机地址
whileTrue:
msg=input('inputmsg>>:').strip()
iflen(msg)==0:continue#检查msg的信息,防止无输入信息
#client.send(b"Hello,world!")#发送信息
client.send(msg.encode('utf-8'))
data=client.recv(1024)#默认接受1024字节,就是1k
#withopen('filename','w')asret:#这两行就可以用过来传输文件了。
#ret=data.write()
print(data.decode())
client.close()#关闭端口
防止粘包的socket_ssh.py
#!/usr/bin/envpython
#-*-coding:utf-8-*-
#AuthorIanYing
#mail:kongqing.ying@yitu-inc.com
importsocket
importos
server=socket.socket()
server.bind(('localhost',6969))#绑定被监听端口
server.listen(5)#监听端口
whileTrue:
print("我要开始等电话了")
conn,addr=server.accept()#就是等待的意思
#conn就是客户端连过来的时候,在服务器端为其生成的一个连接实例
whileTrue:
data=conn.recv(1024).decode()
print("电话来了%s"%type(data))
#iftype(data)isstr:
#data=data.strip()
ifnotdata:
print('clientislost.')
break
cmd_res=os.popen(data).read()#popen就是打开命令执行,read就是获取结果
cmd_res_size=str(len(cmd_res.encode("utf-8")))
print("beforesend",len(cmd_res),"sizeafterencode",cmd_res_size)
iflen(cmd_res)==0:
print("thereisnooutput.")
res_warning="thereisnooutput."
conn.send(res_warning.encode("utf-8"))
continue
else:
conn.send(cmd_res_size.encode("utf8"))
print(conn.recv(1024).decode())#通过接收数据的形式来强制发送缓冲区的数据,防止粘包。
#withopen('filename','r')asret:#这两行就可以用过来传输文件了。
#data=ret.read()
#print('receive:',data)
print('receive:',data)
conn.send(cmd_res.encode("utf-8"))
#conn.send(bytes(cmd_res))#不可行。传输的时候是需要encoding
server.close()
socket_client.py
#!/usr/bin/envpython
#-*-coding:utf-8-*-
#AuthorIanYing
#mail:kongqing.ying@yitu-inc.com
importsocket
client=socket.socket()#声明socket类型,同时生成socket链接对象
client.connect(('localhost',6969))#localhost就是本机地址
whileTrue:
msg=input('inputmsg>>:').strip()
iflen(msg)==0:continue#检查msg的信息,防止无输入信息
#client.send(b"Hello,world!")#发送信息
client.send(msg.encode('utf-8'))
received_size=client.recv(1024).decode()#用来记录接受的数据大小
print("接收的数据大小",received_size)
received_cont=b''
received_cont_size=0#用来判断接受数据的大小
ifreceived_size!="thereisnooutput.":
client.send("准备好了,可以发送。".encode())#发送确认信息,以防止粘包
received_size=int(received_size)#数据需要变成int才能进行判断
whilereceived_size!=received_cont_size:#判断encode后的长度是否一致。
received_cont_for_test=client.recv(1024)
received_cont_size+=int(len(received_cont_for_test))
received_cont=received_cont+received_cont_for_test
print("当前结束后的数据大小为:",received_cont_size)
#print(received_cont_size)
else:
print("数据接收完成,接收的数据大小为:",received_cont_size)
print("接收的内容为:\n",received_cont.decode(),"\n")
else:
print("output:\n",received_size)
#data=client.recv(1024)#默认接受1024字节,就是1k
#withopen('filename','w')asret:#这两行就可以用过来传输文件了。
#ret=data.write()
#print(data.decode())
#print(str(data))
client.close()#关闭端口
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。