当前位置:首页 » 《随便一记》 » 正文

Python3服务器端实现Socket实时通信和持续通信

23 人参与  2022年12月16日 11:45  分类 : 《随便一记》  评论

点击全文阅读


  socket是进程间通信的一种方式,简称“套接字”,它能实现不同主机间进程间通信,而且传输的速率也很高,延迟很低,几乎可以实现实时通讯。我目前在做的一个项目,是需要把传感器的数据实时传回来,所以我将接收数据的终端用作服务器,传感器为客户端,进行远程通信。 

  Socket通信协议就像是快递员和收货人,在本项目中:服务器端就是收货人,客户端就是快递员,快递员把快递送到收货人手上时需要知道收货人的地址,所以会有地址,快递员到了收货人家中时收货人还需要把门打开才能正常收取快递,所以还要打开相应的端口,只不过每次接收快递都需要打开一个新的端口(避免冲突)。

  下面来说一下具体的实现过程,因为python3和python区别还是蛮大的,所以把python3实现socket通信的方式写在这里:

from socket import  *#创建套接字tcp_server = socket(AF_INET,SOCK_STREAM)#绑定ip,port#这里ip默认本机address = ('',6666)tcp_server.bind(address)# 启动被动连接#多少个客户端可以连接tcp_server.listen(128)#使用socket创建的套接字默认的属性是主动的#使用listen将其变为被动的,这样就可以接收别人的链接了

address里的引号内填入你的本机ip地址,如果不填留空的话默认的是你本机的ip地址,后面的6666代表的是端口号,可以自己调整修改,但是不要修改为跟已有的端口号冲突。且客户端的端口号应该与服务器端的端口号一致才可以实现传输数据(快递员到了门口了,你把另一面的厨房门打开,肯定是无法收到快递的呀~)

# 创建接收# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务client_socket, clientAddr = tcp_server.accept()

这里是创建了接收客户端的方式,client_socket是用来为客户端服务的,相当于tcp_server的socket代理。这样的好处就是可以把tcp_server_socket省下来专门用来等待其他客户端来链接

clientAddr存放的是连接服务器的客户端地址

下面是用于接收发送过来的数据的代码:

from_client_msg = client_socket.recv(1024)#接收1024给字节,这里recv接收的不再是元组,区别UDPprint("接收的数据:",from_client_msg.encode("gbk"))#发送数据给客户端,相当于已读回执send_data = client_socket.send("客户端你好,服务器端收到".encode("gbk"))#关闭套接字#关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了#如果还需要服务,只能再次重新连接client_socket.close()

可是这样的话就会导致客户端发过来一次数据,服务器端接收到后就停止了,这样对于需要多次传输数据(相当于QQ中的发多条消息)来说就有些麻烦了,因为每次需要发送数据都需要重新连接服务器,发送完数据后服务器端又会再次关闭,那么该如何实现发送多条数据,实现持续通信呢?

如果仅仅把最后一句

client_socket.close()

删掉的话,服务器端依然会接收到一条数据后就关闭,因为程序执行到这一行之后再往下就没有了,也就是执行到这里就停止了,所以我们想到可以利用while循环,来让这段代码反复运行,进而就可以实现持续通信。

from socket import  *#创建套接字tcp_server = socket(AF_INET,SOCK_STREAM)#绑定ip,port#这里ip默认本机address = ('',6666)tcp_server.bind(address)# 启动被动连接#多少个客户端可以连接tcp_server.listen(128)#使用socket创建的套接字默认的属性是主动的#使用listen将其变为被动的,这样就可以接收别人的链接了# 创建接收# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务client_socket, clientAddr = tcp_server.accept()while(1):    #接收对方发送过来的数据    from_client_msg = client_socket.recv(1024)    #接收1024给字节,这里recv接收的不再是元组,区别UDP    if(from_client_msg=="exit"):        break    print("接收的数据:",from_client_msg.decode("gbk"))       #发送数据给客户端    send_data = client_socket.send(("服务端:客户端你好,服务器端收到").encode("gbk"))    #关闭套接字    #关闭为这个客户端服务的套接字,就意味着为不能再为这个客户端服务了    #如果还需要服务,只能再次重新连client_socket.close()

也就是加入一个while循环,就可以实现持续通信啦!

我们不妨用TCP socket调试工具测试一下服务端能否正常接收到传过来的信息

 这里看到,我用调试工具创建了TCP Client客户端,连接到服务器端之后,发送了多条数据,接下来我们看一下服务器端的接收情况:

可以看到,服务器成功接收到了客户端传过来的信息。

至此,利用socket实现实时数据传输和持续通信就实现啦 


点击全文阅读


本文链接:http://zhangshiyu.com/post/49880.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1