golang 與unity socket 通訊
1.golang 程式碼:
////////////////////////////

TIM截圖20181005155919.png
package main
import (
"fmt"
"log"
"net"
"sync"
)
func main() {
var waitGroup = new(sync.WaitGroup)
waitGroup.Add(1)
addr := "0.0.0.0:666" //表示監聽本地所有ip的8080埠,也可以這樣寫:addr := ":8080"
listener, err := net.Listen("tcp", addr) //使用協議是tcp,監聽的地址是addr
if err != nil {
log.Fatal(err)
}
conn, err := listener.Accept() //用conn接收連結
if err!=nil {
return
}
go func() {
defer listener.Close() //關閉監聽的埠
for {
buf := make([]byte, 1024)
ln,err_:=conn.Read(buf)
if err_!=nil {
break
}
fmt.Println(string(buf[:ln]))
if err != nil {
log.Fatal(err)
break
}
conn.Write([]byte("huhao\n")) //通過conn的wirte方法將這些資料返回給客戶端。
}
waitGroup.Done()
}() waitGroup.Wait()
}
////////////////////
2.unity 程式碼:
![QV@R]UZNQ(MGMP%4~XX9S1O.png]( ofollow,noindex">https://upload-images.jianshu.io/upload_images/5395507-b36b60196d306517.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240 )
自己create 一個sense 然後新增UI元件Text,InputField ,Button 就可以進行測試了
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;
public class login : MonoBehaviour
{
public string ipaddress = "127.0.0.1";
public int port = 666;
private Socket clientSocket;
public InputField MessageInput;
public Text MessageText;
private Thread thread;
private byte[] data = new byte[1024];// 資料容器
private string message = "";
public Button btn;
// Use this for initialization void Start() { ConnectToServer(); btn.onClick.AddListener(OnSendButtonClick); thread = new Thread(ReceiveMessage); thread.Start(); } // Update is called once per frame void Update() { //只有在主執行緒才能更新UI if (message != "" && message != null) { MessageText.text += "\n" + message; message = ""; } } /** *連線伺服器端函式 **/ void ConnectToServer() { clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//跟伺服器連線 clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress), port));//客戶端開啟執行緒接收資料thread = new Thread(ReceiveMessage);thread.Start();} } void ReceiveMessage() { while (true) { if (clientSocket.Connected == false) { break; } int length = clientSocket.Receive(data); message = Encoding.UTF8.GetString(data, 0, length); print(message); } } new void SendMessage(string message) { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); } public void OnSendButtonClick() { string value = MessageInput.text; SendMessage(value); MessageInput.text = " "; } /** * * unity自帶方法 * * 停止執行時會執行 * * */ void OnDestroy() { //關閉連線,分接收功能和傳送功能,both為兩者均關閉 clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); }
}