目录
1.项目说明
项目使用unity3D搭建环境,并通过python程序控制unity环境。在控制过程中,需要使用socket通信将python处理后的数据发送到unity环境中。由于第一次接触socket通信,因此,首先使用C#搭建了客户端和服务器端进行实验,然后使用python搭建服务器,C#搭建客户端进行实验,最后在unity上进行测试。由于unity和python程序都运行在同一台电脑上,我们使用IP地址为127.0.0.1。整个通信过程是,建立连接后,客户端向服务器端发送字符串“location”,服务器端接收到字符串后,将一个坐标发送到客户端。
2.Socket通信
Socket封装了TCP/IP协议,可以视为TCP/IP协议向程序员开发所提供的接口,从而简化了网络编程。Socket在网络通信中的位置如图所示。
2.1C#实现socket通信
我们使用的是异步socket通信,主要流程为建立socket连接,收发数据,关闭连接。
(1)引入命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
(2)建立socket对象和事件状态
由于异步通信,当socket进行通信时,主线程将会执行后面的内容。但后面的程序可能需要在 socket通信之后才能进行,因此需要事件状态来阻塞主线程的运行。
public Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
public static ManualResetEvent allDone = new ManualResetEvent(false);
private static ManualResetEvent receiveDone =
new ManualResetEvent(false);
private static ManualResetEvent connectDone = new ManualResetEvent(false);
private static ManualResetEvent sendDone =
new ManualResetEvent(false);
private static String response = String.Empty;
static void Main(string[] args)
(3)建立socket连接
biginconnect对远程主机发送建立连接的异步请求,这里异步方法除了一般的参数外,还有两个参数,一个是回调函数,另一个是状态对象,状态对象向回调函数提供异步通信的状态,对应于回调函数中的参数IAsyncResult。IAsyncResult是接口,里面有几个属性用来查看可以查看异步操作的状态:AsyncState 获取用户定义的对象,它限定或包含关于异步操作的信息。回调函数主要对后续任务和通信的状态进行处理。回调函数中,应调用 EndConnect 方法。 当应用程序调用 BeginConnect 时,系统将使用单独的线程执行指定的回调方法,并在 EndConnect 上一直阻止到 Socket成功连接或引发异常为止。 此外,我们不希望在建立socket连接时,主线程执行其他任务,因此主线程中使用waitone进行阻塞。当需要原始线程继续执行时,在回调方法中调用ManualResetEvent 的 Set 方法。
string address = "127.0.0.1";
IPAddress hostIP = IPAddre