• 二. 网络编程(套接字TCP协议)


    一 .套接字TCP协议 

    1. 基于TCP协议的socket

    TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、
    面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

       注意:   tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

     server端1

    import socket
    sk = socket.socket()
    sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
    sk.listen()          #监听链接
    conn,addr = sk.accept() #接受客户端链接
    ret = conn.recv(1024)  #接收客户端信息
    print(ret)       #打印客户端信息
    conn.send(b'hi')        #向客户端发送信息
    conn.close()       #关闭客户端套接字
    sk.close()        #关闭服务器套接字(可选)

    client端1

    import socket
    sk = socket.socket()           # 创建客户套接字
    sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
    sk.send(b'hello!')
    ret = sk.recv(1024)         # 对话(发送/接收)
    print(ret)
    sk.close()            # 关闭客户套接字

    解决方法

    #加入一条socket配置,重用ip和端口
    import socket
    from socket import SOL_SOCKET,SO_REUSEADDR
    sk = socket.socket()
    sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
    sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
    sk.listen()          #监听链接
    conn,addr = sk.accept() #接受客户端链接
    ret = conn.recv(1024)   #接收客户端信息
    print(ret)              #打印客户端信息
    conn.send(b'hi')        #向客户端发送信息
    conn.close()       #关闭客户端套接字
    sk.close()        #关闭服务器套接字(可选)

    TCP案例

    1.

    server
    import socket
    sk=socket.socket() # 买手机
    sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #  避免服务重启时 侯报错 端口地址错误
    sk.bind(("127.0.0.1",8081))# 绑定手机卡
    sk.listen()           # 监听  意思就是等别人给我打电话
    conn,addr =sk.accept()   #  接受到别人的电话   conn 链接   addr 地址
    while True:
         ret=conn.recv(1024).decode("utf-8")
         if ret=='bye':
             break
         print(ret)
         aa = input("服务器>>>:")
         conn.send(bytes(aa,encoding="utf-8"))
    
    conn.close()  # 挂电话
    sk.close()    # 关机
    client
    import socket
    sk=socket.socket()  # 买手机
    sk.connect(("127.0.0.1",8081)) # 拨通人的号
    while True:
        bb=input("客服端>>>:")
        sk.send(bytes(bb,encoding="utf-8"))
        ret=sk.recv(1024).decode("utf-8")
        print(ret)
        if ret=='bye':
            sk.send(b'bye')
            break
    sk.close()

    2.

    server
    
    import socket
    sk=socket.socket() # 买手机
    sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #  避免服务重启时 侯报错 端口地址错误
    
    sk.bind(("127.0.0.1",8081))# 绑定手机卡
    
    sk.listen()           # 监听  意思就是等别人给我打电话
    conn,addr =sk.accept()   #  接受到别人的电话   conn 链接   addr 地址
    
    while True:
        ret=conn.recv(1024)  #   听别人说话
        print(ret)
        conn.send(b'lover supreme')  #  和别人说化 必须传一个bytes类型
    
        ret=conn.recv(1024)
        print(ret.decode("utf-8"))  # 接收客服端信息解码
        conn.send(bytes('吃冒菜啊哈哈',encoding="utf-8"))  # 发送信息到客服端 编码
    conn.close()  # 挂电话
    sk.close()    # 关机
    client
    import socket sk=socket.socket() # 买手机 sk.connect(("127.0.0.1",8081)) # 拨通人的号 while True: sk.send(b'suoaaaaa') ret=sk.recv(1024) print(ret) sk.send(bytes('今天中午吃什么'.encode('utf-8'))) #发送到服务器 编码 ret=sk.recv(1024) print(ret.decode('utf-8')) # 接收到服务器端的信息解码 sk.close()

    3.

    server
    
    import  socket
    from socket import SOL_SOCKET,SO_REUSEADDR
    server=socket.socket()
    server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    server.bind(("192.168.59.1",8400))
    server.listen(5)
    while True:
       conn,addr=server.accept()
       while True:
           date=conn.recv(1024).decode("utf-8")
           user,pwd=date.split("|")
           with open("aa.txt","r")as f1:
               for line in  f1:
                    us,pw=line.strip().split(':')
                    if us==user and pwd==pw:
                        conn.send("成功了".encode("utf-8"))
                    else:
                        conn.send("失败了".encode("utf-8"))
    client
    
    import  socket
    client=socket.socket()
    client.connect(("192.168.59.1",8400))
    while True:
        user=input("请输入的用户名:")
        pwd=input("请输入你的密码:")
        val="%s|%s"%(user,pwd)
        client.send(val.encode("utf-8"))
        date=client.recv(1024).decode("utf-8")
        print(date)
        client.close()
  • 相关阅读:
    8 Range 对象
    7 Worksheet 对象
    6 Workbook 对象
    5 Application 对象
    Windows路径
    windows 下操作目录(使用DOS命令)
    Windows 批处理
    6 WPF控件
    Lexer and parser generators (ocamllex, ocamlyacc)
    4.9 Parser Generators
  • 原文地址:https://www.cnblogs.com/Sup-to/p/11131313.html
Copyright © 2020-2023  润新知