總共三個腳本
@第一個(工具類腳本)單例
using?System.Collections;
using?System.Collections.Generic;
using?System.Net;
using?System.Net.Sockets;
using?System.Text;
using?System;
///?
///?工具類
///?
public?class?NetWorkManager??{
????#region?單例
????private?static?NetWorkManager?instance;
????public?static?NetWorkManager?Instance?{
????????get?{
????????????if?(instance?==?null)?{
????????????????instance?=?new?NetWorkManager?();
????????????}
????????????return?instance;
????????}
????}
????#endregion
????public?delegate?void?MyCallBack(string?msg);
????#region?服務(wù)器端
????/*
?????*?服務(wù)器創(chuàng)建流程
?????*?1狈孔、創(chuàng)建服務(wù)器
?????*?2崎溃、等待客戶端連接
????*/
????/*
????*?使用到Socket的哪些方法
????*?1、創(chuàng)建套接字
????*?2穆端、綁定IP地址和端口
????*?3忠售、監(jiān)聽客戶端連接的方法
????*?4传惠、接收客戶端請求
????*?5、收發(fā)信息
????*/
????///?
????///?服務(wù)端的套接字對象
????///?
????private?Socket?serverSocket;
????///?
????///?服務(wù)端的輸入輸出緩沖區(qū)
????///?
????private?byte[]?serverBuffer?=?new?byte[1024];
????///?
????///?服務(wù)端的委托
????///?
????private?MyCallBack?serverCallBack;
????///?
????///?初始化服務(wù)器
????///?
????///?外界傳進來的委托方法
????public?void?ServerInit(MyCallBack?userCallBack)?{
????????serverCallBack?=?userCallBack;
????????//?創(chuàng)建
????????serverSocket?=?new?Socket?(
????????????AddressFamily.InterNetwork,?
????????????SocketType.Stream,?
????????????ProtocolType.Tcp
????????);
????????//?綁定
????????IPEndPoint?point?=?new?IPEndPoint(IPAddress.Parse("127.0.0.1"),12345);
????????serverSocket.Bind?(point);
????????//?開始監(jiān)聽
????????serverSocket.Listen(10);
????????serverCallBack?("服務(wù)器啟動成功");
????????//?接受客戶端的請求
????????serverSocket.BeginAccept(ServerAccept,serverSocket);
????}
????///?
????///?當(dāng)服務(wù)器接受到客戶端請求的回調(diào)事件
????///?
????///?Ar.
????void?ServerAccept(IAsyncResult?ar)?{
????????serverSocket?=?ar.AsyncState?as?Socket;
????????//?接受結(jié)束
????????Socket?workingSocket?=?serverSocket.EndAccept(ar);
????????//?開始基于新的Socket進行收發(fā)信息
????????workingSocket.BeginReceive?(
????????????//?收發(fā)緩沖區(qū)
????????????serverBuffer,
????????????//?起始位置
????????????0,
????????????//?接受數(shù)據(jù)的的長度
????????????serverBuffer.Length,
????????????//?特殊服務(wù)
????????????SocketFlags.None,
????????????//?當(dāng)接收到信息的回調(diào)委托
????????????ServerReceive,
????????????//?當(dāng)前的套接字狀態(tài)
????????????workingSocket
????????);
????????serverSocket.BeginAccept?(ServerAccept,?serverSocket);
????}
????///?
????///?服務(wù)器接收到客戶端的消息的委托回調(diào)
????///?
????///?Ar.
????void?ServerReceive(IAsyncResult?ar)?{
????????Socket?workingSocket?=?ar.AsyncState?as?Socket;
????????//?接收到的字節(jié)數(shù)據(jù)
????????int?count?=?workingSocket.EndReceive(ar);
????????string?result?=?UTF8Encoding.UTF8.GetString?(serverBuffer,0,count);
????????serverCallBack?(result);
????????workingSocket.BeginReceive?(
????????????//?收發(fā)緩沖區(qū)
????????????serverBuffer,
????????????//?起始位置
????????????0,
????????????//?接受數(shù)據(jù)的的長度
????????????serverBuffer.Length,
????????????//?特殊服務(wù)
????????????SocketFlags.None,
????????????//?當(dāng)接收到信息的回調(diào)委托
????????????ServerReceive,
????????????//?當(dāng)前的套接字狀態(tài)
????????????workingSocket
????????);
????}
????#endregion
????#region?客戶端
????///?
????///?客戶端的套接字
????///?
????Socket?clientSocket;
????///?
????///?客戶端的緩沖區(qū)
????///?
????byte[]?clientBuffer?=?new?byte[1024];
????///?
????///?客戶端的委托
????///?
????MyCallBack?clientCallBack;
????///?
????///??開始連接服務(wù)器
????///?
????///?IP地址
????///?端口號
????///?委托事件
????public?void?ClientConnect(string?ip,?int?port,?MyCallBack?userCallBack)?{
????????clientSocket?=?new?Socket?(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
????????clientSocket.Connect?(IPAddress.Parse(ip),port);
????????clientCallBack?=?userCallBack;
????????clientCallBack?("客戶端連接成功");
????}?
????///?
????///??客戶端發(fā)送消息的回調(diào)事件
????///?
????///?Message.
????public?void?ClientSendMessage(string?message)?{
????????clientBuffer?=?UTF8Encoding.UTF8.GetBytes?(message);
????????clientSocket.BeginSend(
????????????clientBuffer,
????????????0,
????????????message.Length,
????????????SocketFlags.None,
????????????SendSuccess,
????????????clientSocket
????????);
????}
????//消息發(fā)送成功的回調(diào)方法
????void?SendSuccess(IAsyncResult?ar)?{
????????Socket?workingSocket?=?ar.AsyncState?as?Socket;
????????workingSocket.EndSend?(ar);
????}
????#endregion
}
@第二個腳本(服務(wù)器)
using?System.Collections;
using?System.Collections.Generic;
using?UnityEngine;
using?UnityEngine.UI;
public?class?Server?:?MonoBehaviour?{
????Text?text;
????void?Awake(){
????????text?=?GameObject.Find?("Text").GetComponent?();
????????Application.runInBackground?=?true;
????}
????void?Start?()?{
????????NetWorkManager.Instance.ServerInit?(
????????????(string?msg)?=>?{
????????????????if?(msg?==?"1")?{
????????????????????msg?=?"開啟";
????????????????}else{
????????????????????msg?=?"關(guān)閉";????????????????
????????????????}
????????????????text.text?=?msg;
????????????}
????????);
????}
}
@第三腳本(客戶端)
using?System.Collections;
using?System.Collections.Generic;
using?UnityEngine;
using?UnityEngine.UI;
public?class?Client?:?MonoBehaviour?{
????Button?send; // 發(fā)送指令的按鈕
??? InputField?text; ? // 發(fā)送的指令
????void?Awake(){
????????Application.runInBackground?=?true; // 后臺運行
????????send?=?GameObject.Find?("Button").GetComponent?();
????????text?=?GameObject.Find?("InputField").GetComponent?();
????????send.onClick.AddListener?(SendMessage);
????}
????void?Start?()?{
????????NetWorkManager.Instance.ClientConnect?(
????????????"127.0.0.1",
????????????12345,
????????????(string?msg)?=>?{
????????????}
????????);
????}
????void?SendMessage(){
????????NetWorkManager.Instance.ClientSendMessage?(text.text);
????}
}
3
如下效果圖
如果想寫及時通訊(聊天對話框)稻扬,直接修改一些代碼即可卦方。如有不當(dāng),多多指教泰佳!?