新提醒Unity3D教程实现基于Socket通讯的公共聊天室.docx
《新提醒Unity3D教程实现基于Socket通讯的公共聊天室.docx》由会员分享,可在线阅读,更多相关《新提醒Unity3D教程实现基于Socket通讯的公共聊天室.docx(6页珍藏版)》请在冰豆网上搜索。
![新提醒Unity3D教程实现基于Socket通讯的公共聊天室.docx](https://file1.bdocx.com/fileroot1/2023-2/6/6715caf0-07ba-4a80-b847-45aef8d7f8e5/6715caf0-07ba-4a80-b847-45aef8d7f8e51.gif)
新提醒Unity3D教程实现基于Socket通讯的公共聊天室
【新提醒】【Unity3D教程:
实现基于Socket通讯的公共聊
天室】
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Net.Sockets;
namespaceTestServer
classProgram
//设置连接端口
constintportNo=500;
staticvoidMain(string[]args)
//初始化服务器IP
System.Net.IPAddresslocalAdd=
System.Net.IPAddress.Parse("127.0.0.1");
//创建TCP侦听器
TcpListenerlistener=newTcpListener(localAdd,portNo);
listener.Start();
//显示服务器启动信息
Console.WriteLine("Serverisstarting...");
while(true)
ChatClientuser=new
ChatClient(listener.AcceptTcpClient());
//显示连接客户端的IP与端口
Console.WriteLine(user._clientIP+"isjoined...");
}ChatClient.csusingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Collections;
usingSystem.Net.Sockets;
namespaceTestServerclassChatClientpublicstaticHashtableALLClients=newHashtable();//
客户列表
privateTcpClient_client;//客户端实体
publicstring_clientIP;//客户端IP
privatestring_clientNick;//客户端昵称
privateboolReceiveNick=true;
publicChatClient(TcpClientclient)this._client=client;
this._clientIP=client.Client.RemoteEndPoint.ToString();
//把当前客户端实例添加到客户列表当中
ALLClients.Add(this._clientIP,this);
client.GetStream().BeginRead(data,0,
System.Convert.ToInt32(this._client.ReceiveBufferSize),
ReceiveMessage,null);
//从客戶端获取消息
publicvoidReceiveMessage(IAsyncResultar)intbytesRead;
try
bytesRead=this._client.GetStream().EndRead(ar);
if(bytesRead<1)
ALLClients.Remove(this._clientIP);
Broadcast(this._clientNick+"hasleftthechat");
return;
else
stringmessageReceived=
System.Text.Encoding.ASCII.GetString(data,0,bytesRead);
if(ReceiveNick)this._clientNick=messageReceived;
Broadcast(this._clientNick+"hasjoinedthechat.");
//this.sendMessage("hello");
ReceiveNick=false;
else
lock(this._client.GetStream())this._client.GetStream().BeginRead(data,0,
System.Convert.ToInt32(this._client.ReceiveBufferSize),
ReceiveMessage,null);
catch(Exceptionex)
Broadcast(this._clientNick+"hasleftthechat.");
//向客戶端发送消息
publicvoidsendMessage(stringmessage)try
System.Net.Sockets.NetworkStreamns;
lock(this._client.GetStream())
ns=this._client.GetStream();
//对信息进行编码
byte[]bytesToSend=
System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(bytesToSend,0,bytesToSend.Length);
ns.Flush();
catch(Exceptionex)
publicvoidBroadcast(stringmessage)
Console.WriteLine(message);
foreach(DictionaryEntrycinALLClients)
((ChatClient)(c.Value)).sendMessage(message+
Environment.NewLine);
using
}unity3d客户端的代码ClientHandler.cs:
UnityEngine;
usingSystem.Collections;
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Text;
usingSystem.Net.Sockets;
publicclassClientHandler:
MonoBehaviourconstintportNo=500;
privateTcpClient_client;
byte[]data;//UsethisforinitializationvoidStart()
{}//UpdateiscalledonceperframevoidUpdate()
{}publicstringnickName="";
publicstringmessage="";
voidOnGUI()
publicstringsendMsg="";
nickName=GUI.TextField(newRect(10,10,100,20),
nickName);
message=GUI.TextArea(newRect(10,40,300,200),
message);
sendMsg=GUI.TextField(newRect(10,250,210,20),
sendMsg);if(GUI.Button(newRect(120,10,80,20),"Connect"))
//Debug.Log("hello");
this._client=newTcpClient();
this._client.Connect("127.0.0.1",portNo);
data=newbyte[this._client.ReceiveBufferSize];
//SendMessage(txtNick.Text);
SendMessage(nickName);
this._client.GetStream().BeginRead(data,0,
System.Convert.ToInt32(this._client.ReceiveBufferSize),
ReceiveMessage,null);
};if(GUI.Button(newRect(230,250,80,20),"Send"))
SendMessage(sendMsg);
sendMsg="";
};
}publicvoidSendMessage(stringmessage)try
NetworkStreamns=this._client.GetStream();
byte[]data=
System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(data,0,data.Length);
ns.Flush();
catch(Exceptionex)
//MessageBox.Show(ex.ToString());
}publicvoidReceiveMessage(IAsyncResultar)tryintbytesRead;
bytesRead=this._client.GetStream().EndRead(ar);
if(bytesRead<1)return;
else
{Debug.Log(System.Text.Encoding.ASCII.GetString(data,0,bytesRead));message+=
System.Text.Encoding.ASCII.GetString(data,0,bytesRead);
this._client.GetStream().BeginRead(data,0,
System.Convert.ToInt32(this._client.ReceiveBufferSize),
ReceiveMessage,null);}
catch(Exceptionex)