Python 网络编程,socket , IPV4 /IPV6

最近在学python网络编程,主要基于tcp协议,UDP协议,tcp需要客户端进行连接才能够收发数据,在执行时有三次握手四次挥手的过程,tcp协议在传送数据大于缓冲区时会连包,(连包:发送的数据一次性不能全部接受完毕,第二次接受时接受的数据是缓冲区上次遗留的数据),UDP协议的工作过程是不需要相互连接,当有客户端请求,服务端就会发生数据(类似于你在QQ上可以和不同的人聊天),并且UDP不会连包(udp的不需要连接机制导致并不那么可靠,可能会加大服务器的负荷)

下面将用代码展示通过客户端远程控制

IPV4

服务端

import socket
import subprocess


ip_addr = ('127.0.0.1',8000) #定义链接端口,用于yi一台电脑模拟server和client通信是127.0.0.1
tcp_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #初始socket,创建套字节
tcp_server.bind(ip_addr)   #初始化tcp连接
tcp_server.listen(5)      #最多可链接客户端数
while True:
    conn ,addr = tcp_server.accept() #等待客户端连接

    while True:
        cmd = conn.recv(1024)  #接收
        if not cmd:break   
        #接受为空时跳过,如客户端有判断,则服务端将不会接受度空,可以不进行判断
        if cmd.decode('utf-8') == 'quit':break   #当接收到quit是断开与该客户端的链接
            
        print(cmd.decode('utf-8'))
        res = subprocess.Popen(cmd.decode('utf-8'), shell=True, stdout = subprocess.PIPE, stdin =subprocess.PIPE, stderr=subprocess.PIPE)
        #shell=True 将接收到的指令使用shell运行, stdout,stdin,stderr 放到管道中
        err = res.stderr.read()
        out = res.stdout.read()
        print(bool(res))
      
        if err:
            ref = err
        elif not out:
                ref = b'12'

        else:
            ref = out

        #print(ref.decode('gbk'))
        
        conn.send(ref)
    conn.close()   
tcp_server.close()

    

 

客户端

import socket
ip_addr = ('127.0.0.1',8000)

tcp_client =socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_client.connect(ip_addr)


while True:
    cmd = input('>>:').strip()
    if not cmd:continue
    
    tcp_client.send(cmd.encode('utf-8'))
    data,addr = tcp_client.recv(1024)
    print(data.decode('gbk'))  #gbk编码,windows系统默认编码,subprocess模块,默认采用系统编码
tcp_client.close()

这是一个没有解决连包问题的程序,当数据大于缓冲区时,(缓冲区可以自己指定,但是无法大于计算机本身的缓冲区)

后面会给出解决连包的代码

IPV6

 

只需要更改

socket.socket(socket.AF_INET6,socket.SOCK_STREAM)

 

AF_INET6 表示为IPV6协议

同时还需要更改地址

使用ipv6 ,是不能使用127.0.0.1这个地址的,这个是ipv4的本地回环

ipv6的本地回环是0:0:0:0:0:0:0:1

 

感谢 FKKUZPMO π 提出的问题,原文中代码确实是存在一些问题

现在已经该好了,并将你提的IPV6的写法给出

 

欢迎大家关注我的公众号 : python学习专栏

一起交流学习

你可能感兴趣的:(python,网络编程,python,socket,网络编程)