查看: 719|回复: 0

Python TCP编程

[复制链接]
  • TA的每日心情
    慵懒
    2015-8-11 09:37
  • 签到天数: 12 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-8-6 21:40:44 | 显示全部楼层 |阅读模式
    分享到:
    文章经过作者同一并委托装载
    地址:文章地址
    树莓派 Python TCP编程
    TCP协议是网络通信领域使用最广泛的协议之一。
    和其他Linux下的编程方式一样,Python的TCP通信也可以基于Socket方式实现。TCP通信协议通过建立连接和应答来保证通信质量,它将通信设备分为Server和Client,两者的操作方式也有些区别。
    1. TCP Server和Client
    Server基本流程为:创建Socket -> 绑定IP和端口 -> 在绑定的IP和端口上监听连接请求 -> 接受Client发出的连接请求 -> 收发收据 -> 关闭连接。
    下面是一个简单的例子,实现了基本的TCP Server功能。
    import socketimport timeimport sys HOST_IP = "137.58.230.162"HOST_PORT = 7654 #创建Socket,SOCK_STREAM表示类型为TCPprint("Starting socket: TCP...")socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #绑定IP和端口,并进行监听#137.58.230.162为本机IP,端口为7654print("TCP server listen @ %s:%d!" %(HOST_IP, HOST_PORT) )host_addr = (HOST_IP, HOST_PORT)socket_tcp.bind(host_addr)socket_tcp.listen(1) #接受Client发出的连接请求,返回值包含了Client的IP和端口socket_con, (client_ip, client_port) = socket_tcp.accept()print("Connection accepted from %s." %client_ip) #向Clinet发送数据socket_con.send("Welcome to RPi TCP server!") socket_tcp.close()Client对应的流程要简单的多:创建Socket -> 向服务器发出连接请求 -> 连接建立成 -> 收发收据 -> 关闭连接。
    代码如下:
    import socket   import timeimport sys    SERVER_IP = "137.58.230.162"SERVER_PORT = 7654#创建Socket,SOCK_STREAM表示类型为TCPprint("Starting socket: TCP...")socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #向服务器发出连接请求,需要指定服务器IP和端口print("Connecting to server @ %s:%d..." %(SERVER_IP, SERVER_PORT))server_addr = (SERVER_IP, SERVER_PORT)socket_tcp.connect(server_addr)   #接收服务器发来的欢迎数据data = socket_tcp.recv(512)print("Server: %s" %data) socket_tcp.close()在树莓派上运行TCP Server,Client可以同时在树莓派上运行来测试通信,或者在其他网络设备上运行。当然,这种完成通信就直接关闭Socket的方法简单粗暴,实际的应用应当包含更完善的断开连接和异常处理机制。

    在树莓派上运行TCP Server

    在树莓派上运行TCP Client

    在PC上运行TCP Client
    2. TCP数据传输
    下面的代码实现了Server端和Client端的双向数据收发。其基本结构与之前的例子相同,但是多出了错误检测的部分。
    Server端的代码中,try…except…部分循环接收Client发来的数据,然后给出回应。程序一旦出现错误,如对方断开连接,就退出程序。

    import socketimport timeimport sys HOST_IP = "137.58.230.162"HOST_PORT = 7654 print("Starting socket: TCP...")host_addr = (HOST_IP, HOST_PORT)socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print("TCP server listen @ %s:%d!" %(HOST_IP, HOST_PORT) )socket_tcp.bind(host_addr)socket_tcp.listen(1) socket_con, (client_ip, client_port) = socket_tcp.accept()print("Connection accepted from %s." %client_ip)socket_con.send("Welcome to RPi TCP server!") print("Receiving package...")while True:    try:        data = socket_con.recv(512)          if len(data)>0:             print("Received: %s" %data)            socket_con.send("OK!")            time.sleep(1)            continue    except Exception:          socket_tcp.close()        sys.exit(1)Client端的代码增加了尝试连接部分,如果连接不成功报错,如服务器超时无响应,就等待一段时间再重新发起连接请求。

    import socket   import timeimport sys    SERVER_IP = "137.58.230.162"SERVER_PORT = 7654 print("Starting socket: TCP...")server_addr = (SERVER_IP, SERVER_PORT)socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) while True:      try:        print("Connecting to server @ %s:%d..." %(SERVER_IP, SERVER_PORT))        socket_tcp.connect(server_addr)          break      except Exception:        print("Can't connect to server, try it latter!")        time.sleep(1)        continue   print("Receiving package...")  while True:    try:        data = socket_tcp.recv(512)          if len(data)>0:             print("Received: %s" %data)            socket_tcp.send("Hello TCP!")            time.sleep(1)             continue    except Exception:          socket_tcp.close()        socket_tcp = None        sys.exit(1)软件运行效果如图:

    Server端,收到Client的数据并回应

    Client端,收到Server发来的欢迎信息和回应
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 20:13 , Processed in 0.119833 second(s), 15 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.