1. 程式人生 > >[工作小記]JAVA與C#的Socket通信

[工作小記]JAVA與C#的Socket通信

motion pmo sleep ddr trace ktr 不同的 ram target

在日常的開發中,不同的傳感器支持的開發語言常常是不同的。例如Kinect一般是用C++開發的,Leapmotion用JAVA開發比較多。

去年暑假(17年暑假)做的一個項目是:用Leapmotion捕捉人手的五個手指關節信息,然後經過變換,傳輸給一個同樣具有五個手指的機械手。

一開始拿到的開發框架,Leapmotion是用JAVA開發的;機械手AR10是用C#開發。

於是分別通過編程實現,使得JAVA端能夠使Leapmotion捕捉人手五個手指10個關節的信息並保存為文本文件;

C#端能夠使AR10讀取文本文件,轉化為各個關節的位置指令,實現同樣的動作指令。

然而這樣只能做到離線控制,需要通過Socket通信,實現數據的實時傳輸,才能實現控制。

JAVA端添加的代碼:

在一開始添加庫:

import java.net.ServerSocket;
import java.net.Socket;

在類裏面添加(其中tmp是需要不斷被實時發送的數據):

tmp = angleThumb12+" "+angleThumb23+" "+angleIndex01+" "+angleIndex12+" "+angleMiddle01+" "+angleMiddle12+" "+angleRing01+" "+angleRing12+" "+anglePinky01+" "+anglePinky12+" "+"\n";
System.out.println("Java Sockets Program has started.");
int i=0; try { DatagramSocket socket = new DatagramSocket(); System.out.println("Sending the udp socket..."); // Send the Message "HI" socket.send(toDatagram("",InetAddress.getByName("127.0.0.1"),3800)); //while (true) { System.out.println(tmp); System.out.println(
"Sending hi " + i); Thread.currentThread(); Thread.sleep(10); socket.send(toDatagram(String.valueOf(tmp),InetAddress.getByName("127.0.0.1"),3800)); i++; } catch (Exception e) { e.printStackTrace(); }

C#端添加的代碼

添加包含頭文件:

using System.Net;
using System.Net.Sockets;

在C#制作的GUI界面中需要觸發接收數據的按鈕下,例如

private void button1_Click(object sender, EventArgs e)
{

}

裏面添加:

      private void button1_Click(object sender, EventArgs e)
        {

            string returnData;
            byte[] receiveBytes;
            //ConsoleKeyInfo cki = new ConsoleKeyInfo();
            using (UdpClient udpClient =
                new UdpClient(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3800)))
            {
                IPEndPoint remoteIpEndPoint =
                    new IPEndPoint(IPAddress.Parse("127.0.0.1"), 3800);

                while (true)
                {
                    receiveBytes = udpClient.Receive(ref remoteIpEndPoint);
                    returnData = Encoding.ASCII.GetString(receiveBytes);
                    textBox1.AppendText(returnData + Environment.NewLine);
                    //Console.WriteLine(returnData);
                    float angle1 = 0;
                    float angle2 = 0;
                    float angle3 = 0;
                    float a0 = 0;
                    float a1 = 0;
                    float a2 = 0;
                    float a3 = 0;
                    float a4 = 0;
                    float a5 = 0;
                    float a6 = 0;
                    float a7 = 0;
                    float a8 = 0;
                    float a9 = 0;
                    int k = 0;

                    string[] arr = new string[10];
                    arr = returnData.Split(new char[] {   }, StringSplitOptions.RemoveEmptyEntries);
foreach (string i in arr) { mainTextBox.AppendText("target: " + k + "s" + i + "s" + Environment.NewLine); if (k == 1) { angle1 = Convert.ToSingle(i); angle2 = angle1 * (-20) + 2219; if (angle2 < 1621) { angle2 = 1621; } if (angle2 > 2000) { angle2 = 2000; } angle3 = angle2 * 4; a1 = angle2; TrySetTarget((byte)11, (ushort)angle3); } //.........//if (k == 9) { angle1 = Convert.ToSingle(i); angle2 = angle1 * (-16) + 2252; if (angle2 < 992) { angle2 = 992; } if (angle2 > 2000) { angle2 = 2000; } angle3 = angle2 * 4; a9 = angle2; TrySetTarget((byte)12, (ushort)angle3); } k = k + 1; } } } }

[工作小記]JAVA與C#的Socket通信