Unity网络通信

毕设打算把树莓派传感器上的参数传给unity,了解了一下具体实现,可以通过socket建立tcp连接,也可以创建HTTP服务通过Get,Post等请求获取。最后选择使用socket连接。

服务端

因为在树莓派上获取参数,直接使用了python实现树莓派上的服务。

python实现socket通信

python网络编程:https://www.runoob.com/python/python-socket.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 导入socket包
import socket
# 测试时使用按钮触发,引入GUI库tkinter
import tkinter as tk

def click(c):
print("发送")
c.send(('hello! '+str(i)).encode('utf-8'))

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
print(host)
port = 12345 # 设置端口
s.bind(('localhost', port)) # 绑定端口
s.listen(5) # 等待客户端连接

c, addr = s.accept() # 建立客户端连接,accept是阻断试的
print( '连接地址:', addr)

#创建窗口
root = tk.Tk()
root.title("按钮示例")

#创建按钮
button = tk.Button(root, text="点我", command=lambda: click(c))
button.pack()
#进入消息循环
root.mainloop()
c.close() # 关闭连接

客户端

在unity中创建客户端,C#是.Net语言,可以使用.Net提供的Socket编程。

C#实现网络通信

.Net Socket:https://learn.microsoft.com/zh-cn/dotnet/api/system.net.sockets.socket?view=net-7.0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace SocketClient
{
class Program
{
static void Main(string[] args)
{
//创建一个新的 socket,使用 IPV4 地址族、流式 socket 类型和 TCP 协议
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//连接到服务器
socket.Connect("127.0.0.1", 8080);

//发送一条消息
string message = "Hello World!";
//需要编码否则接收到的数据异常
byte[] data = Encoding.UTF8.GetBytes(message);
socket.Send(data);

//接收服务器返回的数据
data = new byte[1024];
int received = socket.Receive(data);
message = Encoding.UTF8.GetString(data, 0, received);
Console.WriteLine("Received: {0}", message);

//关闭 socket
socket.Close();
}
}
}

上面的代码只是进行了一次通信发送和接受了数据就结束了,但是我需要持续接受来自树莓派的消息,并且这个脚本应该写到untiy中通过组件挂载脚本。需要做一些调整。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System;

public class clientTest : MonoBehaviour
{

Socket socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//设置端口
int port = 12345;

byte[] data = new byte[1024];
void Start()
{
socket.Connect("localhost", port);

Debug.Log("客户端启动!");

}

// Update is called once per frame
void Update()
{
//检查是否有可用的数据
if (socket.Available > 0)
{
//接收服务器返回的数据
//Receive是阻断试的,当没有新的数据到达将会卡在update方法中
int received = socket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, received);
Array.Clear(data, 0, received);
Debug.Log(message);
}

}
//类似析构函数,当组件销毁时调用
void OnDestroy()
{
//关闭socket
socket.Close();
}
}

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2022-2023 Junto
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信