第八节
Posted 酷酷的狐狸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第八节相关的知识,希望对你有一定的参考价值。
python3 socket编程
Socket(翻译为套接字, 我觉得很挫)
,是操作系统内核中的一个数据结构,它是网络中的节点进行相互通信的门户
。它是网络进程的ID。网络通信,归根到底还是进程间的通信(不同计算机上的进程间通信, 又称进程间通信, IP协议进行的主要是端到端通信)。在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接口中还需要包括其他的信息,也就是端口号(PORT)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应关系。所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程.
每一个socket都用一个半相关描述{协议、本地地址、本地端口}来表示;一个完整的套接字则用一个相关描述{协议、本地地址、本地端口、远程地址、远程端口}来表示。socket也有一个类似于打开文件的函数调用,该函数返回一个整型的socket描述符,随后的连接建立、数据传输等操作都是通过socket来实现的
流程描述socket
tcp/ip send,recv
udp
family address
AF.NET ipv4
AF.INET6
AF.UNIX local
socket protocol type
SOCK_STREAM tcp/ip
SOCK_DGREAM 数据报式socket,udp
server = socket.socker(AF_INET,SOCK_STREAM) server.bind(ip_address,port) server.listen() while True: conn,addr = server.accept() #开始堵塞 while True: print("new conn") date = conn.recv(1024) #官方建议不超过8192K if not data:break print(data) conn.send(data.upper())
client = socket.socket() client.connect(("server_ip",port)) client.send((data)) client.recv(data)
TCP通信的基本步骤如下:
服务端:socket---bind---listen---while(True){---accept---recv---send----}---close
客户端:socket------------------------------------connect---send---recv-------close
服务端:socket---bind---listen---while(True){---accept---recv---send----}---close
客户端:socket------------------------------------connect---send---recv-------close
socket函数
server = socket.socket()
server.recv
server.send
server.close
server.close
server.listen
server.bind
server.type
server.accept
server.connect_ex
server.detath
server.dup
server.family
server.fileno()
server.get_inheritable()
server.getpeername()
server.getsockname()
server.gettimeout()
server.makefile()
server.recv_into()
server.recvfrom()
server.sendall()
server.sendto()
server.sendfile()
server.settimeout()
server.shutdown()
server.timeout
利用socket实现简单的ssh服务器与客户端
import socket,os server = socket.socket() server.bind(("localhost",9999)) server.listen() while True: conn,addr = server.accept() print("new conn:",addr) while True: print("等待新指令") data = conn.recv(1024) if not data: print("客户端已断开") break print("执行新指令:",data) cmd_res = os.popen(data.decode()).read() print("before send:",len(cmd_res)) if len(cmd_res) == 0: cmd_res = "cmd has no output..." conn.send(str(len(cmd_res.encode())).encode()) cilent_ack = conn.recv(1024) print("cilent has already receive....") conn.send(cmd_res.encode()) print("send done") server.close()
import socket,os client = 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) client.send("可以发送数据了".encode()) received_size = 0 received_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()
利用socket实现简单的ftp文件下载
import socket,os,hashlib server = socket.socket() server.bind(("localhost",9999)) server.listen() while True: conn,addr = server.accept() print("new conn:",addr) while True: print("等待新指令") data = conn.recv(1024) if not data: print("客户端已断开") break cmd,filename = data.encode().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) for line in f: m.update(line) conn.send(line) print("file md5",m.hexdigest()) f.close() conn.send(m.hexdigest().encode()) print("send done") server.close()
import socket,os,hashlib client = socket.socket() client.connect(("localhost",9999)) while True: cmd = input(">>:").strip() if len(cmd) == 0: continue if cmd.startswith("get"): client.send(cmd.encode()) server_respone = client.recv(1024) print("server respone:",server_respone) client.send(b"ready to recv file") file_total_size = len(server_respone.decode()) received_size = 0 filename = 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 = 1024 else: size = file_total_size - received_size print("last received size",size) data = client.recv(size) received_size += len(data) m.update(data) f.write(data) else: new_file_md5 = m.hexdigest() print("file rece done",received_size,file_total_size) f.close() server_file_md5 = client.recv(1024) print("server file md5:",server_file_md5) client.close()
以上是关于第八节的主要内容,如果未能解决你的问题,请参考以下文章