socket模块
实现简单的远程连接:
客户端:
import socket
client = socket.socket()#声明socket类型,同时生成socke连接t对象client.connect(('localhost',969)) #连接到localhost主机的6969端口上去while True:
msg = input(">>:").strip()if len(msg) == 0:continueclient.send(msg.encode('utf-8'))#把编译成utf-8的数据发送出去data = client.recv(512)#接收数据print("从服务器接收到的数据为:",data.decode())
client.close()服务器端:
import socketimport os
server = socket.socket()#声明socket类型,并且生成socket连接对象server.bind(('localhost',969))#把服务器绑定到localhost的6969端口上server.listen(5)#开始监听print("等待连接中……")while True:
conn,addr = server.accept()#接收连接print("***连接成功***")while True:
data = conn.recv(512)#接收客户发来的数据print("接收到的命令为:",data)if not data:print("客户断开连接")breakcom = os.popen(data.decode()).read()#read()读取内存地址的内容print(data.decode())#输出结果为字符串dirprint(os.popen(data.decode()))#输出结果为一个内存地址#py3 里socket发送的只有bytes,os.popen又只能接受str,所以要decode一下conn.sendall(com.encode('utf-8'))
server.close()
稍微加强了下的远程连接:
客户端:
import socket
client = socket.socket()#声明socket类型并生产连接对象client.connect(('localhost',9999))#发起连接#循环输入指令while True:
cmd = input('>>:').strip()if len(cmd) == 0: continue#如果输入为空则跳过本次循环,重新返回输入指令client.send(cmd.encode("utf-8"))#把字符串编译成比特流发送cmd_res_size = client.recv(1024)#接收服务器发来的指令内容比特流大小print("命令结果大小:",cmd_res_size)
received_size = 0#接收到的大小为0received_data = b''#接收到的数据内容为空#根据接收到的数据大小,循环接受数据使其生成完整的内容再跳出循环while received_size < int(cmd_res_size.decode()):
data = client.recv(1024)
received_size += len(data)
received_data += data#跳出循环后执行else:print("cmd res receive done……",received_size)print(received_data.decode())
client.close()服务器端:
import socket ,os
server = socket.socket()#声明socket类型并生产连接对象server.bind(('localhost',9999))#绑定ip和portserver.listen()#监听print('等待连接……')#循环接入while True:
conn,addr = server.accept()print('new conn:',addr)#循坏等待指令while True:print("等待新指令")
data = conn.recv(1024)#接收比特流数据#没有接收到比特流数据,则无数据在传输即断开连接if not data:print("客户已经断开")breakprint("执行指令:",data)
cmd_res = os.popen(data.decode()).read()#把比特流数据转为str,再执行指令,最后读取到内存赋值给变量cmd_resprint("before send:",len(cmd_res))#判断cmd_res是否为 0,popen函数执行失败返回 0if len(cmd_res) == 0:
cmd_res = "cmd has no output..."#cmd_res为字符串,.encode()后变为比特流,再用len计算出比特流的大小,再把这个整数转为字符串,最后转为比特流发送出去conn.send( str(len(cmd_res.encode())).encode("utf-8") )#把指令执行内容编译成比特流发送出去conn.send(cmd_res.encode("utf-8"))print("send done")
server.close()
ftp客户端:
import socket
import hashlib
client = socket.socket()
client.connect(('localhost',9999))while True:
cmd = input(">>: ").strip()if len(cmd) == 0:continueif cmd.startswith("get"):
client.send(cmd.encode())
server_response = client.recv(1024)
print("server response: ",server_response)
client.send(b"ready to recv file")
file_total_size = int(server_response.decode())
received_size = 0filename = cmd.split()[1]
f = open(filename + ".new","wb")
m = hashlib.md5()while received_size < file_total_size:if file_total_size - received_size > 1024:
size = 1024else:
size = file_total_size -received_size
print("last received:",size)
data = client.recv(size)
received_size += len(data)
m.update(data)
f.write(data)else:
new_file_md5 = m.hexdigest()
print("file recv done",received_size,file_total_size)
f.close()
server_file_md5 = client.recv(1024)
print("server file md5: ",server_file_md5)
print("client file md5: ",new_file_md5)
client.close()ftp服务器端:
import socket,osimport hashlib
server = socket.socket()
server.bind(('0.0.0.0',9999))
server.listen(5)print("等待连接....")while True:
conn,addr = server.accept()print("连接成功....")while True:print("等待指令")
data = conn.recv(1024)if not data:print("客户端已断开")breakcmd,filename = data.decode().split()print(filename)if os.path.isfile(filename):
f = open(filename,"rb")
m = hashlib.md5()
file_size = os.stat(filename).st_size
conn.send( str(file_size).encode() )
conn.recv(1024)#wait for ackfor line in f:
m.update(line)
conn.send(line)print("file md5",m.hexdigest())
f.close()
conn.send(m.hexdigest().encode())print("文件发送完毕....")
server.close()
socketserver模块
实现简单的连接:
客户端:
import socket
client = socket.socket()
client.connect(('localhost',9999))while True:
cmd = input(">>:").strip()if len(cmd) == 0:continueclient.send(cmd.encode('utf-8'))
data = client.recv(10240)print("从服务器接受到的数据:",data.decode())
client.close()服务器端:
import socketserverclass MyTCPHandler(socketserver.BaseRequestHandler):def handle(self):while True:try:
self.data = self.request.recv(1024).strip()if not self.data:print("客户已断开")breakprint("{} wrote:".format(self.client_address[0]))print(self.data)
self.request.send(self.data.upper())except ConnectionResetError as e:print("Error:",e)breakif __name__ == "__main__":
HOST,PORT = "localhost",9999server = socketserver.TCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
查看更多关于人生苦短之我用Python篇(socket编程)的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did126954