您的位置:首页 > 移动开发 > Unity3D

使用unity UGUI 利用Socket 实现 多客户端通讯

2015-12-11 10:53 585 查看
unity 5.1.1 UGUI VS2013

服务器端:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace SocketSever
{
class Program
{   static List<Client>clientList =new List<Client>();  //建立连接的数组!!!!
/// <summary>
/// 广播消息
/// </summary>
/// <param name="message"></param>
public  static void BroadcastMessage(string message)
{   var notConnectedList = new List<Client>();
foreach (var client in clientList)
{
if (client.Connected)
{
client.SendMessage(message);
}
else
{
notConnectedList.Add(client);
}
}
foreach (var temp in notConnectedList)
{
clientList.Remove(temp);
}
}
static void Main(string[] args)
{
int port = 6180;               //端口
string host = "192.168.10.75"; //IP
//创建终结点
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);

//创建Socket并开始监听
Socket TcpSever = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
//创建一个Socket对象,如果用UDP协议,则要用SocketTyype.Dgram类型的套接字
TcpSever.Bind(ipe);                                                                            //绑定EndPoint对象(6180端口和ip地址)
TcpSever.Listen(100);            //开始监听 监听数//接受到Client连接,为此连接建立新的Socket,并接受消息
Console.WriteLine("等待客户端连接。。。。。");
//死循环接受新的连接
while(true){
Socket temp = TcpSever.Accept();  //为新建立的连接创建新的Socket
Console.WriteLine("有一个已经连接过来了!");
Client client = new Client(temp); //把与客户的通讯交互逻辑做到Client 类里面(收发消息)
clientList.Add(client);           //新的连接放入集合
}

//Console.WriteLine("建立连接");
//string recvStr = "";
//byte[] recvBytes = new byte[1024];
//int bytes;
//bytes = temp.Receive(recvBytes, recvBytes.Length, 0); //从客户端接受消息
//recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

////给Client端返回信息
//Console.WriteLine("server get message:{0}", recvStr);    //把客户端传来的信息显示出来
//string sendStr = "ok!Client send message successful!";
//byte[] bs = Encoding.ASCII.GetBytes(sendStr);
//temp.Send(bs, bs.Length, 0);                             //返回信息给客户端
//temp.Close();
//TcpSever.Close();
//Console.ReadLine();
}
}
}


Client 类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SocketSever
{
/// <summary>
/// 与客户端做通讯
/// </summary>
class Client
{
private Socket clientSocket;
private Thread t;//建立线程
private byte[] data=new byte[1024];//数据容器
public Client(Socket s)
{
clientSocket = s;
//启动一个线程处理接收客户端的数据
t = new Thread(ReceiveMessage);
t.Start();
}
private void ReceiveMessage()
{
while(true){
//在接收数据之前 判断Socket连接是否断开
if (clientSocket.Poll(10,SelectMode.SelectRead))
{
clientSocket.Close();
break;//跳出循环 终止线程
}
try
{
int length = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
//TODO:接收数据之后把数据分发到客户端
//广播这个消息!!!!!!!!!
Program.BroadcastMessage(message);
Console.WriteLine("客户端发来的消息:" + message);
}
catch (Exception ex) { Console.WriteLine("有一个退出了:" +"这是一个异常"); }
}
}
/// <summary>
/// 分发出去
/// </summary>
/// <param name="message"></param>
public void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
public bool Connected
{
get { return clientSocket.Connected; }
}
}
}


unity 源码 客户端在关闭的时候没有关闭Socket连接,存在异常!!!!!
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine.UI;
using System.Threading;

public class ChatManager : MonoBehaviour
{
public string ipaddress = "192.168.10.75";
public int port = 6180;    //端口
private Socket clientSocket;  //Socket 对象
public Text T;   //输出框
string message = "";
public InputField InputText;//发送框
public InputField Username;//用户名
private Thread t;
private byte[] data = new byte[1024];
void Start()
{
ConnectToServer(); //创建连接
}

void Update()
{
if (message != null && message != "")
{
T.text += message + "\n";
message = "";//清空消息
}
}
/// <summary>
/// 与服务器建立连接
/// </summary>
void ConnectToServer()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//与服务器建立连接
clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress), port));
//创建一个新的线程 用来接收数据
t = new Thread(ReceiveMessage);//开启线程
t.Start();
}
/// <summary>
/// 这个线程方法用来循环接受消息
/// </summary>
void ReceiveMessage()
{
while (true)
{
if (!clientSocket.Connected)
{
break;
}
int length = clientSocket.Receive(data);
message = Encoding.UTF8.GetString(data, 0, length);
}
}
/// <summary>
/// 向服务器发送数据
/// </summary>
/// <param name="message"></param>
void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
/// <summary>
/// 点击发送数据
/// </summary>
public void OnSendButtonClick()
{
SendMessage(Username.text+":"+InputText.text);
InputText.text = "";
}
}
<img src="http://img.blog.csdn.net/20151211111828816?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
<img src="http://img.blog.csdn.net/20151211111856399?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="http://img.blog.csdn.net/20151211111923556?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: