zoukankan      html  css  js  c++  java
  • 二、网络编程-socket之TCP协议开发客户端和服务端通信

    知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的。udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人,信丢了你也不知道,tcp传输需要先和服务端建立连接,当客户端与服务器连接时,服务器会给出应答,我俩连上了,而且数据传过来还会进行一个数据包数量验证,不一致会重新发送,还有其他种种验证,总之保证了数据传输安全可靠

     

    这一章主要介绍使用套接字,编写一个tcp协议客户端和服务端。同样要用到上一章节提到小工具,网络调试助手作为客户端或服务端与编写的服务端或客户端进行通讯验证

    1、客户端,详情看代码注解:

    import socket
    
    
    def client_main():
        # 创建套接字
        tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  # SOCK_STREAM代表tcp协议
    
        # 与服务端建立连接
        server_ip = input('请输入ip地址:')
        server_port = int(input('请输入端口号:'))
        tcp_socket.connect((server_ip, server_port))  # 使用connect方法与服务器进行连接
    
        # 发送数据
        tcp_date = input('请输入要发送的数据:')
        tcp_socket.send(tcp_date.encode('utf-8'))
    
        # 关闭套接字
        # tcp_socket.close()
    
    if __name__ == '__main__':
        client_main()

    交互效果如下:

    2、服务端开发,下面的代码是先把主流程写通,往下面再附上优化后的服务端代码

    import socket
    
    def server():
        # 创建套接字
        tcp_socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
        # 绑定地ip和端口
        tcp_socket_server.bind(('',7785))
    
        # 监听套接字,因为创建的套接字默认是主动给别人发消息,作为服务端,要随时监听别人发来的请求连接
        tcp_socket_server.listen(128)
    
        # 当客户端发来与服务端连接成功后,使用accept方法解堵塞,accept返回一个有俩个值的元祖,需要拆包
        # 拆包后,第一个值是新的套接字,也就是连接进来的的客户端,此时新的套接字开始于客户端进行通讯,第二个值是新的套接字这个客户端的ip和端口
        new_socket_clien,new_socket_addres = tcp_socket_server.accept()
    
        # 接收客户端发来的消息
        tcp_data = new_socket_clien.recv(1024)
        print(tcp_data.decode('gbk'))
    
        # 关闭套接字,先关闭新的套接字,再关闭监听套接字
        new_socket_clien.close()
        tcp_socket_server.close()
    
    if __name__ == '__main__':
        server()

    交互效果如图:

     3、服务端代码优化,1、循环等待新的客户端到来 2、循环为一个客户端提供服务:

    #!/usr/bin/env python
    # coding=utf-8
    # author:刘仲
    # datetime:2018/7/20 9:25
    # software: PyCharm
    
    import socket
    
    
    def server():
        # 创建套接字
        tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    
        # 绑定ip和端口
        # server_ip = input('请输入ip:')
        # server_port = int(input('请输入端口号:'))
        tcp_server_socket.bind(('192.168.1.110', 7598))
    
        # 监听套接字
        tcp_server_socket.listen(128)  # listen里面的参数代表最多监听128个客户端,参数最大不能超过1024
    
        # 循环等待新的客户端到来
        while True:
            # 等待客户端发消息
            # 当客户端连接成功后,accept进行解堵塞,返回一个元祖,然后对元祖进行拆包,拆包后第一个值是客户端新的套接字,使用这个新的套接字
            # 为这个客户端服务,第二个值是连进来这个客户端的地址
            print('等待新的客户端到来......')
            new_socket_server, new_socket_adress = tcp_server_socket.accept()
            print('新的客户端来啦......')
            while True:
                    tcp_data = new_socket_server.recv(1024)  # 接收客户端消息
                    print('客户端发来的消息:%s' % tcp_data.decode('gbk'))
                    if tcp_data:
                        new_socket_server.send('已收到'.encode('utf-8'))  # 服务器给个回应给客户端
                    elif not tcp_data:
                        break
            new_socket_server.close()  # 关闭新的套接字
        tcp_server_socket.close()  # 关闭监听套接字
    
    if __name__ == '__main__':
        server()

     解释如下:

  • 相关阅读:
    如何透过上层div点击下层的元素解决方法
    学习javscript函数笔记(二)
    js栈内存和堆内存的区别
    学习javscript对象笔记(一)
    小程序 给最外层view设置百分之百高度不起作用
    小程序 开发阶段请求网络报 不在以下 request 合法域名列表中
    git安装以及webstorm配置git
    failed to push some refs to 'git@github.com:xxx/xxx.git' 解决方法
    Jquery EasyUI Treegrid按需加载子集
    js时间戳与日期格式的相互转换
  • 原文地址:https://www.cnblogs.com/lz-tester/p/9339238.html
Copyright © 2011-2022 走看看