用Unity打包Android程序并与PC端通过USB进行Socket通信(下)
这篇主要介绍一些简单代码,用程序打开ADB运行等,讲的稍微详细点,如果哪些地方用的不好,可以自己修改,这里只是给个思路。 按照上期流程,先开启ADB服务的连接,再开启Android端的服务,最后再开启PC上的端的程序作为客户端。由于每次手动打开win上的cmd或者linux上的终端比较麻烦,现在就用程序解决。以下都是使用C#写的程序。另外,需要稍微掌握一点linux知识,否则理解优点。
以下分三个部分: 一、在Windows中打开ADB方式 二、在Linux中两种打开ADB的方式 三、列出简单的TCP代码用于测试
一、在Windows中打开ADB ADB属于外部程序,所有这里使用C#中的Process类。具体的可以看C#的官方文档。 C# Process 的官方描述
这个类主要是提供对本地和远程进程的访问,使你能够启动和停止本地系统进程。但是注意:需要开一个新的线程打开,否则会卡死主线程。 (1)在上期的手动配置打开时,使用的是win中的cmd,这里也可以用代码打开
private Thread processThread;
public void StartOpen()
{
processThread = new Thread(new ThreadStart(Start_Process_Win));
processThread.Start();
}
public void Start_Process_Win()
{
ProcessStartInfo info = new ProcessStartInfo("cmd.exe");
info.CreateNoWindow = true;
info.ErrorDialog = true;
info.UseShellExecute = false;
info.RedirectStandardError = true;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
m_Process = Process.Start(info);
m_Process.StandardInput.WriteLine("E:");
m_Process.StandardInput.WriteLine("cd E:/ADB/platform-tools");
m_Process.StandardInput.WriteLine("adb start-server");
m_Process.StandardInput.WriteLine("adb forward tcp:13561 tcp:13562");
m_Process.StandardInput.WriteLine("exit");
m_Process.StandardInput.AutoFlush = true;
string output = m_Process.StandardOutput.ReadToEnd();
UnityEngine.Debug.Log(output);
string error = m_Process.StandardError.ReadToEnd();
UnityEngine.Debug.Log(error);
m_Process.WaitForExit();
m_Process.Close();
}
上述通过打开cmd,再打开ADB似乎是一种特殊情况,因为中linux中是不能这样使用的。可以使用打开一次adb ,传入一次参数这种形式打开。在linux中测试是可以的,win中没有测试(因为懒),但想来也是可以的。下面提供简单的测试代码。
void OpenWithArguments()
{
Process.Start("E:/ADB/platform-tools/adb.exe", "start-server");
Process.Start("E:/ADB/platform-tools/adb.exe", "forward tcp:13561 tcp:13562");
}
二、在Linux中两种打开ADB的方式 (1)在linux中打开的方式也是类似的。也是要注意路径问题。还有一个要十分注意的地方是:如果想使用相对路径,你的程序使用的位置,是程序当前
void OpenWithArguments()
{
Process.Start("/ADB/platform-tools/adb.exe", "start-server");
Process.Start("/ADB/platform-tools/adb.exe", "forward tcp:13561 tcp:13562");
}
(2)这种方式是直接写一个shell文件,在你的C#程序中,直接用Process打开这个文件就可以了。可以在终端里输入:cat -n /etc/shells 看看可以兼容哪些shell程序。新建一个以.sh结尾的文件输入下列内容。
#!/etc/sh
dir=$PWD
dir/platform-tools/adb start-server
dir/platform-tools/adb forward tcp:13561 tcp:13562
exit
如果你把ADB工具放固定的位置,用绝对路径也可以。 如果用相对路径,那么,特别需要注意:脚本中$PWD 的路径是你的C#程序的路径,谁打开上述那个文件dir 就是那个位置的路径,使用时需要特别注意。
三、列出简单的TCP代码用于测试 这个是TCP连接中的客户端的部分代码,以前从网上抄的,但我找不到是抄谁的了(捂脸)。主要代码如下,也可以自己从网上找,参考一下。
public void Init(string ipStr, int port)
{
IPAddress ip = IPAddress.Parse(ipStr);
IPEndPoint point = new IPEndPoint(ip, port);
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
client.Connect(point);
Debug.Log("连接成功,服务器IP:"+client.RemoteEndPoint.ToString());
Debug.Log("客户端IP:" + client.LocalEndPoint.ToString());
receiveThread = new Thread(ReceiveMsg);
IsWhile = true;
receiveThread.IsBackground = true;
receiveThread.Start();
}
catch (Exception ex)
{
Debug.LogError(ex.Message);
}
}
void ReceiveMsg()
{
while (IsWhile)
{
try
{
byte[] buffer = new byte[1024];
int n = client.Receive(buffer);
string str = Encoding.UTF8.GetString(buffer, 0, n);
if (!str.Equals(string.Empty))
{
lock (Message)
{
}
}
else
{
Debug.Log("net消息为空");
}
}
catch (Exception ex)
{
Debug.LogError(ex.Message);
break;
}
}
}
public void Send_To_Sever(string msg)
{
if (client != null)
{
try
{
byte[] buffer = Encoding.UTF8.GetBytes(msg);
client.Send(buffer);
}
catch (Exception ex)
{
Debug.LogError(ex.Message);
}
}
}
TCP服务端的
Dictionary<string,Socket> dic=new Dictionary<string, Socket>();
private void StartServer(int port)
{
IPAddress ip = IPAddress.Any;
IPEndPoint point=new IPEndPoint(ip,port);
Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
try
{
socket.Bind(point);
socket.Listen(10);
Debug.Log("服务器开始监听");
Thread thread = new Thread(AcceptInfo);
thread.IsBackground = true;
thread.Start(socket);
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
void AcceptInfo(object o)
{
Socket socket = o as Socket;
while (true)
{
try
{
Socket tSocket = socket.Accept();
string point = tSocket.RemoteEndPoint.ToString();
Debug.Log(point + "连接成功!");
dic.Add(point, tSocket);
Thread th = new Thread(ReceiveMsg);
th.IsBackground = tr
th.Start(tSocket);
}
catch (Exception ex)
{
Debug.Log(ex.Message);
break;
}
}
}
void ReceiveMsg(object o)
{
Socket client = o as Socket;
while (true)
{
try
{
byte[] buffer = new byte[1024 * 1024];
int n = client.Receive(buffer);
string words = Encoding.UTF8.GetString(buffer, 0, n);
Debug.Log(client.RemoteEndPoint.ToString() + ":" + words);
}
catch (Exception ex)
{
Debug.Log(ex.Message);
break;
}
}
}
|