Python TCP编程

作者: EEboardMM
上传时间为: 2015-08-06 09:40 PM
2015-08-06
阅读:

文章经过作者同一并委托装载

地址:文章地址

树莓派 Python TCP编程

TCP协议是网络通信领域使用最广泛的协议之一。

和其他Linux下的编程方式一样,Python的TCP通信也可以基于Socket方式实现。TCP通信协议通过建立连接和应答来保证通信质量,它将通信设备分为Server和Client,两者的操作方式也有些区别。

1. TCP Server和Client

Server基本流程为:创建Socket -> 绑定IP和端口 -> 在绑定的IP和端口上监听连接请求 -> 接受Client发出的连接请求 -> 收发收据 -> 关闭连接。

下面是一个简单的例子,实现了基本的TCP Server功能。

import socket
import time
import sys
 
HOST_IP = "137.58.230.162"
HOST_PORT = 7654
 
#创建Socket,SOCK_STREAM表示类型为TCP
print("Starting socket: TCP...")
socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
#绑定IP和端口,并进行监听
#137.58.230.162为本机IP,端口为7654
print("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 time
import sys
    
SERVER_IP = "137.58.230.162"
SERVER_PORT = 7654
#创建Socket,SOCK_STREAM表示类型为TCP
print("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 socket
import time
import 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 time
import 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发来的欢迎信息和回应

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示