本代码实现的功能为:服务器将客户端A发送的信息(json串)进行处理,并转发给客户端B。
客户端A的请求端口为19005,客户端B的请求端口为19004
具体实现功能代码如下:

1.客户端A向服务端发送信息(以json为例):
from socket import *def client():# 创建sockettcp_client_socket = socket(AF_INET, SOCK_STREAM)# 目的信息server_ip = "127.0.0.1"   #服务端ipserver_port = 19005     #端口# 链接服务器tcp_client_socket.connect((server_ip, server_port))#客户端向服务端发送json串data = 'S010712320039{"datas":[{"PN":"P1","PathID":"","StopID":"3","Type":2,"PositionX":1.000,"PositionY":0.000,"Speed":0.255,"CornerAngle":0}]}E'tcp_client_socket.send(data.encode('utf-8'))# 接收服务端返回数据,最大接收1024个字节recvData = tcp_client_socket.recv(1024)print('接收到的数据为:', recvData.decode('gbk'))# 关闭套接字tcp_client_socket.close()if __name__ == "__main__":client()
2.服务端接收json串之后进行处理,转发给客户端B,代码如下:
#! /usr/bin/env python3
import json
from math import *
from socket import *1)###欧拉角转四元素def QuaterniondtoQuaternion(yaw, pitch, roll):   # yaw (Z), pitch (Y), roll (X)# // Abbreviations for the various angular functionscy = cos(yaw * 0.5)sy = sin(yaw * 0.5)cp = cos(pitch * 0.5)sp = sin(pitch * 0.5)cr = cos(roll * 0.5)sr = sin(roll * 0.5)q0 = cy * cp * cr + sy * sp * sr  q1 = cy * cp * sr - sy * sp * crq2 = sy * cp * sr + cy * sp * crq3 = sy * cp * cr - cy * sp * srq0 = round(q0, 3)q1 = round(q1, 3)q2 = round(q2, 3)q3 = round(q3, 3)#注意返回值的顺序return q1,q2,q3,q0    #qx, qy, qz, qw2)###接收客户端A的信息,进行数据处理,并返回校验数据def server1(ip,port):# 创建sockettcp_server_socket = socket(AF_INET, SOCK_STREAM)#服务器ip与端口address = (ip, port)# 绑定tcp_server_socket.bind(address)#设置监听数.tcp_server_socket.listen(5)client_socket, clientAddr = tcp_server_socket.accept()# 接收对方发送过来的数据,和udp不同返回的只有数据recv_data = client_socket.recv(1024).decode('utf-8')  # 接收1024个字节,#处理接收的信息,截取{}中的信息,进行数据处理data = recv_data[13:-1]# print(data)  #json解析 str--->dict 先把字符串转换为字典data_dict = json.loads(data)# 只取字典data_dict['datas']的值dict_value = data_dict['datas'][0]# print(dict_value)global tup#需要转发的信息数据进行处理(符合目标格式)tup = (dict_value['PositionX'],dict_value['PositionY'],QuaterniondtoQuaternion(dict_value['CornerAngle'], 0, 0))print('接收的导航点为',tup)# 接收到数据,返回信息校验(向客户端A返回信息)data2 = 'T'+ recv_data[1:13].ljust(36,'0') + 'E'# print(data2)client_socket.send(data2.encode())#关闭连接client_socket.close()3)#将处理之后的数据转发给客户端Bdef server2(ip,port):tcp_server_socket = socket(AF_INET, SOCK_STREAM)address = (ip, port)tcp_server_socket.bind(address)tcp_server_socket.listen(2)client_socket, clientAddr = tcp_server_socket.accept()#调用server1, 客户端A连接的端口为19005server1('127.0.0.1',19005)  #判断是否接收到信息,如果不是空,则转发到客户端Bif tup:client_socket.send(str(tup).encode())# 接收客户端B的返回信息# recv_data = client_socket.recv(1024).decode('utf-8')  # 接收1024个字节,# print('接收到的数据为:', recv_data.decode('utf-8'))# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接client_socket.close()4)主函数运行if __name__ == "__main__":while(1):  #服务端始终运行server2('127.0.0.1', 19004)  #客户端B请求端口为19004# time.sleep(20)

在Ubuntu中运行可能存在问题:

  1. 主要是因为防止服务端紧接着进行下一次链接,出现 OSError : [Errno 98] Address already in use. 出现这个错误的原因:在TCP/IP终止连接的第四次握手中,当最后的ACK回复发出后,有个2MSL的时间等待,MSL指一个片段在网络中最大的存活时间,这个时间一般是30秒,所以基本上过60秒后就可以重新连接!
    为什么要等待2MSL?是因为在最后发出ACK回复后,发送方不能确认ACK是否被另一端正常收到,如果另一端没有收到ACK回复的话,将会在1MSL后再次发送FIN片段。所以说发送方等待2MSL时间,也就是刚好它发ACK回复和对方发送FIN片段的时间,如果此时间内都没有再次收到FIN片段的话,发送方就假设对方已经正常接收到了ACK回复,此时它就会正常关闭连接!
  2. 解决:
    修改代码,tcp_server_socket2.bind(address2)等代码不要放在循环中,避免短时间内不断重复申请连接。
3.客户端B接收服务端信息,和客户端A的实现是一样的
from socket import *def client():# 创建sockettcp_client_socket = socket(AF_INET, SOCK_STREAM)# 目的信息server_ip = "127.0.0.1"server_port = 19004# 链接服务器tcp_client_socket.connect((server_ip, server_port))while(1):## 接收对方发送过来的数据,最大接收1024个字节recvData = tcp_client_socket.recv(1024)print('接收到的数据为:', recvData.decode('gbk'))if recvData:   #如果接收到数据不为空tcp_client_socket.send('1111'.encode('utf-8'))time.sleep(5)else:break# 关闭套接字tcp_client_socket.close()if __name__ == "__main__":client()
4.运行结果展示

先运行服务端,再运行客户端B,最后运行客户端A

如果发现任何疑问,欢迎留言指教。三克油~~

python实现TCP通信,参考链接:
Python实现TCP程序
Python实现TCP程序

python实现同一个服务器对应多个客户端进行通信相关推荐

  1. python 高性能http服务器_Python高性能HTTP客户端

    Python中有许多HTTP客户端.使用最广泛且最容易的是requests. 持续连接 持续连接是自HTTP 1.1以来的标准,尽管许多应用程序并未使用它们.以简单模式使用请求时(例如使用get函数) ...

  2. python实现客户端之间的通信_基于Python的服务端多线程与多客户端的通信过程

    实现server服务端多线程程序,可以开启多个客户端,每个客户端都能实现向服务端发送数据的过程,可以设置最大监听客户端数. 服务端使用命令: python server.py 520 进行开启 其中s ...

  3. 客户端/服务器程序_了解客户端/服务器协议和Web应用程序

    客户端/服务器程序 Introduction 介绍 HyperText Transfer Protocol or "HTTP" is the underpinning of int ...

  4. 一种客户端即时通信数据的加密和解密方法

    一种客户端即时通信数据的加密和解密方法  摘要 本发明适用于即时通信领域,提供了一种客户端即时通信数据的加密和解密方法,所述方法包括以下步骤:A.客户端加密本地保存的即时通信数据,并将数据加密密钥上传 ...

  5. python安卓开发实例_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  6. android 手机 与 python服务器_python服务器与android客户端socket通信实例

    本文实例讲述了python服务器与android客户端socket通信的方法.分享给大家供大家参考.具体实现方法如下: 首先,服务器端使用python完成,下面为python代码: #server.p ...

  7. 基于Python Tkiner、thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信

    基于Python Tkiner.thread与socket实现的简单多人聊天室,在Python中创建TCP服务器与客户端进行通信 完整代码下载地址:基于Python Tkiner.thread与soc ...

  8. python并发处理同一个文件_python并发编程(并发与并行,同步和异步,阻塞与非阻塞)...

    最近在学python的网络编程,学会了socket通信,并利用socket实现了一个具有用户验证功能,可以上传下载文件.可以实现命令行功能,创建和删除文件夹,可以实现的断点续传等功能的FTP服务器.但 ...

  9. 两个网站做到同一个服务器,两个网站放在同一个服务器 备案

    两个网站放在同一个服务器 备案 内容精选 换一换 没有,华为云包含企业邮箱服务,具体请参考: https://www.huaweicloud.com/marketplace/activity/mail ...

最新文章

  1. Web开发者需养成的好习惯
  2. Android第二十期 - 微信的主体构架
  3. 遍历二叉树的全部方法(递归+非递归)
  4. web标准设计工具:代码本地校验软件A Real Validator(附注册码)
  5. js获取本地时间与网络时间
  6. 超牛逼的性能调优利器 — 火焰图
  7. linux如何快速入门
  8. jmeter分布式部署
  9. Oracle开发 之 主-外键约束FK及约束的修改
  10. 葫芦兄弟java7723_颠峰对决之喜羊羊大战葫芦娃
  11. 3月9日 笔记:RANSAC随机样本一致性,灭点、对极几何计算、H矩阵、PNP估计相机位置,3D匹配、投影变换、N点定位求解姿态
  12. VC学习路线书籍+视频
  13. 【参赛时间延长】InterSystems技术写作大赛:Python
  14. 中文名称:(尼姆亚,熊猫烧香)
  15. 西北农林科技大学计算机系运动会,西北农林科技大学召开2018年学院春季运动会...
  16. 2022-2028全球与中国电子漏水检测设备市场现状及未来发展趋势
  17. 域名劫持污染和被墙的区别!
  18. echarts 中国地图 世界地图
  19. 传奇架设教程,十分钟学会传奇搭建
  20. 【HDL系列】除法器(3)——基2 SRT算法

热门文章

  1. 计算机路由表更新命令,计算机cmd命令之route,查看路由表,或配置一个更有效的路由...
  2. 计算机软件和软件系统区别,软件就是程序(软件和程序的区别是什么)
  3. 大会议程正式公布!FBEC2020暨第五届金陀螺奖全面升级,报名从速!
  4. php商城开发人人分销团队级差分红升级规则订制
  5. Proteus彻底卸载干净和license密钥报错等问题
  6. java地磅_java 读取地磅读数,COM口.
  7. 读书笔记之C Primer Plus 3
  8. 如何用计算机把英文变成中文,电脑英文系统怎么设置回中文
  9. 实战案例!基于 K-Means 聚类算法的客户精准营销模型
  10. PHP中静态方法和实例化方法的区别