• TCP编程


    自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501

    由于TCP连接具有安全可靠的特性,所以TCP应用更为广泛。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。例如,当我们在浏览器中访问明日学院网站时,我们自己的计算机就是客户端,浏览器会主动向明日学院的服务器发起连接。如果一切顺利,明日学院的服务器接收了我们的连接,一个TCP连接就建立起来了,后面的通信就是发送网页内容了。

    1  创建TCP服务器

    创建TCP服务器的过程,类似于生活中接听电话的过程。如果要接听别人的来电,首先需要购买一部手机,然后安装手机卡。接下来,设置手机为接听状态,最后静等对方来电。

    如同上面的接听电话过程一样,在程序中,如果想要完成一个TCP服务器的功能,需要的流程如下:

    l  使用socket()创建一个套接字

    l  使用bind()绑定IP和port

    l  使用listen()使套接字变为可被动连接

    l  使用accept()等待客户端的连接

    l  使用recv/send()接收发送数据

    图标 (35)

      实例01  服务器向浏览器发送“Hello World”

    例如,使用socket模块,通过客户端浏览器向本地服务器(IP地址为127.0.0.1)发起请求,服务器接到请求,向浏览器发送“Hello World”。具体代码如下: 

    # -*- coding:utf-8 -*-

    import socket                                  # 导入socket模块

    host = '127.0.0.1'                            # 主机IP

    port = 8080                                     # 端口号

    web = socket.socket()                           # 创建socket对象

    web.bind((host,port))                          # 绑定端口

    web.listen(5)                                # 设置最多连接数

    print ('服务器等待客户端连接...')

    # 开启死循环

    while True:

        conn,addr = web.accept()                     # 建立客户端连接

        data = conn.recv(1024)                       # 获取客户端请求数据

        print(data)                             # 打印接收到的数据

        conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello World')        # 向客户端发送数据

        conn.close()                             # 关闭连接

    运行结果如图7所示。然后打开谷歌浏览器,输入网址:127.0.0.1:8080(服务器IP地址是127.0.0.1,端口号是8080),成功连接服务器以后,浏览器显示“Hello World”。运行结果如图8所示。

    图7  服务器接收到的请求

    图8  客户端接到的响应

    2  创建TCP客户端

    TCP的客户端要比服务器简单很多,如果说服务器是需要自己买手机、插手机卡、设置铃声、等待别人打电话流程的话,那么客户端就只需要找一个电话亭,拿起电话拨打即可,流程要少很多。

    图标 (35)

      实例02  客户端向服务器发送和接收信息

    在实例01中,我们使用浏览器作为客户端接收数据,下面,创建一个TCP客户端,通过该客户端向服务器发送和接收消息。创建一个client.py文件,具体代码如下:

    import socket                       # 导入socket模块

    s= socket.socket()                  # 创建TCP/IP套接字

    host = '127.0.0.1'                  # 获取主机地址

    port = 8080                        # 设置端口号    

    s.connect((host,port))                 # 主动初始化TCP服务器连接

    send_data = input("请输入要发送的数据:")        # 提示用户输入数据

    s.send(send_data.encode())             # 发送TCP数据

    # 接收对方发送过来的数据,最大接收1024个字节

    recvData = s.recv(1024).decode()

    print('接收到的数据为:',recvData)

    # 关闭套接字

    s.close()

    打开2个cmd命令行窗口,先运行实例01中的server.py文件,然后运行client.py文件。接着,在client.py窗口输入“hi”,此时server.py窗口会接收到消息,并且发送“Hello World”。运行结果如图9所示。

    图9  客户端和服务器通信效果

    3  执行TCP服务器和客户端

    在上面的例子中,我们设置了一个服务器和一个客户端,并且实现了客户端和服务器之间的通信。根据服务器和客户端的执行流程,可以总结出TCP客户端和服务器的通信模型,如图10所示。

    图标 (35)

      实例03  制作简易聊天窗口

    既然客户端和服务器可以使用Socket进行通信,那么,客户端就可以向服务器发送文字,服务器接到消息后,显示消息内容并且输入文字返回给客户端。客户接收到响应,显示该文字,然后继续向服务器发送消息。这样,就可以实现一个简易的聊天窗口。当有一方输入“byebye”时,则退出系统,中断聊天。可以根据如下步骤实现该功能。

    图10  TCP通信模型

    (1)创建server.py文件,作为服务器程序,具体代码如下: 

    import socket                               # 导入socket模块

    host = socket.gethostname()                 # 获取主机地址

    port = 12345                                # 设置端口号  

    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)     # 创建TCP/IP套接字

    s.bind((host,port))                     # 绑定地址(host,port)到套接字

    s.listen(1)                         # 设置最多连接数量

    sock,addr = s.accept()                    # 被动接收TCP客户端连接

    print('连接已经建立')

    info = sock.recv(1024).decode()                 # 接收客户端数据

    while info != 'byebye':                      # 判断是否退出

      if info :

        print('接收到的内容:'+info)

      send_data = input('输入发送内容:')               # 发送消息

      sock.send(send_data.encode())                 # 发送TCP数据

      if send_data =='byebye':                  # 如果发送byebye,则退出

        break

      info = sock.recv(1024).decode()             # 接收客户端数据

    sock.close()                         # 关闭客户端套接字

    s.close()                            # 关闭服务器套接字

    (2)创建client.py文件,作为客户端程序,具体代码如下:

    import socket                       # 导入socket模块

    s= socket.socket()                  # 创建TCP/IP套接字

    host = socket.gethostname()             # 获取主机地址

    port = 12345                        # 设置端口号

    s.connect((host,port))                 # 主动初始化TCP服务器连接

    print('已连接')

    info = ''          

    while info != 'byebye':                  # 判断是否退出

      send_data=input('输入发送内容:')            # 输入内容

      s.send(send_data.encode())             # 发送TCP数据

      if send_data =='byebye':                # 判断是否退出

        break

      info = s.recv(1024).decode()             # 接收服务器数据

      print('接收到的内容:'+info)

    s.close()                         # 关闭套接字

    打开2个cmd命令行窗口,分别运行server.py和client.py文件,如图11所示。

    图11  服务器和客户端建立连接

    接下来,在client.py窗口中,输入“土豆土豆,我是地瓜,收到请回答。over”,然后按下键。此时,在server.py窗口中将显示client.py窗口发送的消息,并提示server.py窗口输入发送内容,如图12所示。

    图12  发送消息

    当输入“byebye”时,结束对话,如图13所示。

    图13  关闭对话

  • 相关阅读:
    产品性能测试入门秘籍
    线性代数的本质(一)——向量空间
    使用pytorch实现深度可分离卷积改进模型的实战实践
    从.net开发做到云原生运维(八)——DevOps实践
    实用调试小技巧
    Doxygen在vs code配置
    疫情后时代变了吗?
    新加坡科技巨头Sea亏损小于预期,外资“清算”阿里只为加大赌注
    【深入解析spring cloud gateway】07 自定义异常返回报文
    TCP详解之重传机制
  • 原文地址:https://blog.csdn.net/weixin_67859959/article/details/139843233