socket发送字符串和数组

本文介绍了一个Python实现的TCP服务器与客户端通信的例子,并展示了如何将ROS(Robot Operating System)集成到TCP通信中,实现机器人数据的实时传输。
部署运行你感兴趣的模型镜像

标准的python3 TCP

# server
import socket

# 创建 socket 对象
server_socket = socket.socket()

# 绑定 IP 和端口,表明是服务端
server_socket.bind(("localhost", 8888))

# 开始监听,传入一个整数表示最大连接数
server_socket.listen(1)

print("服务端已开始监听,正在等待客户端连接...")

# 等待客户端连接,accept 方法返回连接对象和客户端地址信息
conn, address = server_socket.accept()
print(f"接收到了客户端的连接,客户端的信息:{address}")

# 持续接收和发送消息,直到服务端输入 "exit" 退出
while True:
    data = conn.recv(1024).decode("UTF-8")
    print(f"客户端发来的消息是:{data}")

    msg = input("请输入你要回复客户端的消息:")
    if msg == 'exit':
        break
    conn.send(msg.encode("UTF-8"))

# 关闭连接
conn.close()
server_socket.close()

# 创建 client对象

import socket

# 创建 socket 对象
client_socket = socket.socket()

# 连接服务端,传入服务端主机和端口号
client_socket.connect(("localhost", 8888))

while True:
# 发送消息给服务端
    msg = input("请输入要发送给服务端的消息:")
    client_socket.send(msg.encode("UTF-8"))

    # 接收服务端回复的消息
    received_data = client_socket.recv(1024).decode("UTF-8")
    print(f"服务端回复的消息是:{received_data}")

# 关闭连接
conn.close()
client_socket.close()

socket常见的发送string(这里嵌入ros)客户端从ros接收数据转发给客户端。
ros发布者:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将发布/person_info话题,自定义消息类型learning_topic::Person

import rospy
from geometry_msgs.msg import Pose

def velocity_publisher():
	# ROS节点初始化
    rospy.init_node('pose_publisher', anonymous=True)

	# 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
    person_info_pub = rospy.Publisher('/pose_info', Pose, queue_size=10)

	#设置循环的频率
    rate = rospy.Rate(10) 
    i = 1
    while not rospy.is_shutdown():
		# 初始化learning_topic::Person类型的消息
    	msg = Pose()
        msg.position.y=i
        msg.position.x=2
        msg.position.z=-0.02

        msg.orientation.y=0.06
        msg.orientation.x=0.06
        msg.orientation.z=0.06
        msg.orientation.w=0.06

		# 发布消息
        person_info_pub.publish(msg)
    	rospy.loginfo("Publsh person message[%f, %f]", 
				msg.position.y, msg.position.x)

		# 按照循环频率延时
        i =i+1
        rate.sleep()

if __name__ == '__main__':
    try:
        velocity_publisher()
    except rospy.ROSInterruptException:
        pass

服务端,广播(bind)

import string
import socket
import os
import json

import rospy
from geometry_msgs.msg import Pose

service=socket.socket()
service.bind(("192.168.1.129",22222))
service.listen(1)
client,address=service.accept()

def personInfoCallback(msg):
    rospy.loginfo("Publsh person message[%d, %d]", 
      msg.position.y, msg.position.x)
    client,address=service.accept()
    client_data=client.recv(1024)
    msg_send =client_data
    print("---",msg_send)
    print(type(msg_send))
    client.send(msg_send)

def person_subscriber():
	# ROS节点初始化
    rospy.init_node('person_subscriber', anonymous=True)
	# 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback
    rospy.Subscriber("/pose_info", Pose, personInfoCallback)

	# 循环等待回调函数
    rospy.spin()
    client.close()
    service.close()

if __name__ == '__main__':
    person_subscriber()

客户端:

import socket
import time
import json
import string
 
client = socket.socket()
client.connect(("192.168.1.129", 22222))
s=client.recv(1024)
print("---",s)
s = list(s)
print(type(s))
print(s)
client.close()

socke发送arry(),应该也能发字典
服务端接收

from socket import *
import pickle  


# Set the socket parameters
host = "localhost"
port = 21567
buf = 4096
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
    data,addr = UDPSock.recvfrom(buf)
    L = pickle.loads(data)
    if not L:
        print "Client has exited!"
        break
    else:
        print(L.tolist())
        print ("Received message ")

# Close socket
UDPSock.close()

客户端接收

from socket import *
import numpy
from array import*
import pickle  

# Set the socket parameters
host = "localhost"
port = 21567
buf = 4096
addr = (host,port)

# Create socket
UDPSock = socket(AF_INET,SOCK_DGRAM)

a = array('i',[1,3,2])
# a = [array('i',[1,3,2])]
# Send messages
while (1):
    data = raw_input('yes or now')
    if data!= "yes":
        break
    else:
        if(UDPSock.sendto(pickle.dumps(a),addr)):
            print "Sending message"

# Close socket
UDPSock.close()

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值