第八节

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函数

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()
socket ssh server
技术分享
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 ssh client

 利用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()
ftp server
技术分享
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()
ftp client

 

 

 

 

  

 



以上是关于第八节的主要内容,如果未能解决你的问题,请参考以下文章

前端随心记---------Javascript系列(第八节.BOM)

python学习笔记第八节(函数的相关作业)

Linux第八节课-vim编辑器

第八节,变量

python第八节

SWE学习-第八节