也是從多方找的,做完到了收到數據解析完轉換成float數據報錯,不轉換float的話正常傳輸沒問題
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Diagnostics;
//收到消息後的委託回調
public delegate void ReceiveCallBack(string content);
public class LOSocket : MonoBehaviour {
//可以創建的Socket端口類型
public enum LOSocketType
{
CLIENT = 0,
SERVER = 1,
}
#region --------取消構造器
private LOSocket()
{
}
#endregion
#region --------公共代碼
//通過靜態方法獲取不同的端口類型
public static LOSocket GetSocket(LOSocket.LOSocketType type)
{
LOSocket socket = null;
switch (type)
{
case LOSocketType.CLIENT:
{
//創建一個新的客戶端
socket = new LOSocket();
break;
}
case LOSocketType.SERVER:
{
//獲取服務端
socket = GetServer();
break;
}
}
return socket;
}
#endregion
#region --------客戶端部分代碼
private Socket clientSocket;
//聲明客戶端收到服務端返回消息後的回調委託函數
private ReceiveCallBack clientReceiveCallBack;
//用來存儲服務端返回的消息數據
byte[] Buffer = new byte[1024];
//public void ReceiveReturn(ReceiveCallBack ccb)
//{
// this.clientReceiveCallBack = ccb;
//}
//初始化客戶端Socket信息
public void InitClient(string ip, int port, ReceiveCallBack ccb)
{
this.clientReceiveCallBack = ccb;
this.clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress address = IPAddress.Parse(ip);
IPEndPoint ep = new IPEndPoint(address, port);
this.clientSocket.Connect(ep);
//開始異步等待接收服務端消息
this.clientSocket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new System.AsyncCallback(ReceiveFromServer), this.clientSocket);
}
//收到服務端返回消息後的回調函數
void ReceiveFromServer(System.IAsyncResult ar)
{
//獲取當前正在工作的Socket對象
Socket worker = ar.AsyncState as Socket;
int ByteRead = 0;
try
{
//接收完畢消息後的字節數
ByteRead = worker.EndReceive(ar);
}
catch (System.Exception ex)
{
this.clientReceiveCallBack(ex.ToString());
}
if (ByteRead > 0)
{
string Content = Encoding.Default.GetString(Buffer);
//msg1 = Content;
// SendMessage(Content);
UnityEngine.Debug.Log("接收的信息時:"+ Content);
//通過回調函數將消息返回給調用者
this.clientReceiveCallBack(Content);
}
//繼續異步等待接受服務器的返回消息
worker.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new System.AsyncCallback(ReceiveFromServer), worker);
}
//private void OnDestroy()
//{
// clientSocket.Shutdown(SocketShutdown.Both);
// clientSocket.Close();
//}
//客戶端主動發送消息
public void SendMessage(string message)
{
if (message == null)
return;
message += "\r\n";
byte[] sendData = Encoding.UTF8.GetBytes(message);
//異步發送消息請求
clientSocket.BeginSend(sendData, 0, sendData.Length, SocketFlags.None, new System.AsyncCallback(SendToServer), clientSocket);
}
//發送消息結束的回調函數
void SendToServer(System.IAsyncResult ar)
{
Socket worker = ar.AsyncState as Socket;
worker.EndSend(ar);
}
#endregion
#region -------服務器部分代碼
//服務器端收到消息的存儲空間
byte[] ReceiveBuffer = new byte[1024];
//服務器收到消息後的回調委託
private ReceiveCallBack callback;
//單例模式
private static LOSocket serverSocket;
private static LOSocket GetServer()
{
if (serverSocket == null)
{
serverSocket = new LOSocket();
}
return serverSocket;
}
//初始化服務器信息
public void InitServer(ReceiveCallBack cb)
{
this.callback = cb;
// 1.
Socket server_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 2.
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 2222);
// 3.
server_socket.Bind(endPoint);
// 4.
server_socket.Listen(10);
// 5.開始異步等待客戶端的請求鏈接
server_socket.BeginAccept(new System.AsyncCallback(Accept), server_socket);
this.callback("開啓服務器" + endPoint.ToString());
}
//接受到客戶端的鏈接請求後的回調函數
void Accept(System.IAsyncResult ar)
{
//獲取正在工作的Socket對象
Socket socket = ar.AsyncState as Socket;
//存儲異步操作的信息,以及用戶自定義的數據
Socket worker = socket.EndAccept(ar);
SocketError error;
//開始異步接收客戶端發送消息內容
worker.BeginReceive(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, new System.AsyncCallback(Receive), worker);
//繼續異步等待新的客戶端鏈接請求
socket.BeginAccept(new System.AsyncCallback(Accept), socket);
}
//服務端收到客戶端的消息後的回調函數
void Receive(System.IAsyncResult ar)
{
//獲取正在工作的Socket對象
Socket worker = ar.AsyncState as Socket;
int ByteRead = 0;
try
{
ByteRead = worker.EndReceive(ar);
}
catch (System.Exception ex)
{
this.callback(ex.ToString());
}
if (ByteRead > 0)
{
string Content = Encoding.Default.GetString(ReceiveBuffer);
this.callback(Content);
}
//繼續異步等待客戶端的發送消息請求
worker.BeginReceive(ReceiveBuffer, 0, ReceiveBuffer.Length, SocketFlags.None, new System.AsyncCallback(Receive), worker);
}
#endregion
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ClientScript : MonoBehaviour {
string msg = "hello";
public GameObject cube;
// Use this for initialization
LOSocket client;
void Start()
{
client = LOSocket.GetSocket(LOSocket.LOSocketType.CLIENT);
//"192.168.101.21", 6666
client.InitClient("192.168.101.136", 10086,((string content) => {
//收到服務器的回饋信息
//client.SendMessage("我是socket發送的數據爲:" + content);
SocketTransform.Start(cube, content);
}));
}
private void Update()
{
}
void OnGUI()
{
msg = GUI.TextField(new Rect(0, 0, 500, 40), msg);//Convert.ToString(transform.position)
if (GUI.Button(new Rect(0, 50, 100, 30), "Send"))
{
client.SendMessage(msg);
}
}
}