服务端
using System.Net.Sockets;
using System;
public class Connect
{
//套接字
public Socket socket;
//缓存区
public const int Buff_Size = 1024;
public byte[] buff = new byte[Buff_Size];
public int buffCount = 0;
//是否被启用
public bool isUse = false;
//构造函数
public Connect()
{
buff = new byte[Buff_Size];
}
//初始化
public void Init(Socket socket)
{
this.socket = socket;
isUse = true;
buffCount = 0;
}
//缓冲区剩余大小
public int BuffRemain()
{
return Buff_Size - buffCount;
}
//客户端地址
public string GetAdress()
{
if(!isUse)
{
return "无法获取地址";
}
return socket.RemoteEndPoint.ToString();
}
//关闭
public void Close()
{
if (!isUse)
{
return;
}
Console.WriteLine(GetAdress()+"与服务器断开连接");
socket.Close();
isUse = false;
}
}
using System;
using System.Net;
using System.Net.Sockets;
public class SeverNet
{
//套接字
public Socket socketlisen;
//连接池
public const int MaxSize = 50;
public Connect[] conns;
//返回连接池引用,如果没有则返回-1
public int NewIndex()
{
if (conns == null)
return -1;
for(int i = 0; i<conns.Length;i++)
{
if (conns[i] == null)
{
conns[i] = new Connect();
return i;
}
else if (conns[i].isUse == false)
return i;
}
return -1;
}
//启动
public void Start(string ip, int port)
{
//初始化连接池
conns = new Connect[MaxSize];
for (int i = 0; i < MaxSize; i++)
{
conns[i] = new Connect();
}
//初始化Socket
socketlisen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//Bind
IPAddress ipAr = IPAddress.Parse(ip);
IPEndPoint ipEP = new IPEndPoint(ipAr,port);
socketlisen.Bind(ipEP);
//设置最大监听数
socketlisen.Listen(MaxSize);
//Accept
socketlisen.BeginAccept(AcceptCb,null);
Console.WriteLine("服务器启动成功!");
}
//回调
private void AcceptCb(IAsyncResult ar)
{
try
{
Socket socket = socketlisen.EndAccept(ar);
int index = NewIndex();
//Console.WriteLine("Index:"+index);
if (index < 0)
{
socket.Close();
Console.WriteLine("连接池已满");
}
else
{
//为客户端分配连接池
Connect conn = conns[index];
conn.Init(socket);
string adr = conn.GetAdress();
Console.WriteLine("连接到:"+adr+" 号码:"+index);
//异步接收客户端数据
conn.socket.BeginReceive(conn.buff,conn.buffCount,conn.BuffRemain(),SocketFlags.None,ReceiveCb,conn);
}
socketlisen.BeginAccept(AcceptCb,null);
}
catch(Exception e)
{
Console.WriteLine("连接失败:"+e.Message);
}
}
//接收回调
private void ReceiveCb(IAsyncResult ar)
{
Connect conn = (Connect)ar.AsyncState;
try
{
int count = conn.socket.EndReceive(ar);//接收到的字节数
//如果没有收到消息说明连接断开
if(count<=0)
{
Console.WriteLine("收到["+conn.GetAdress()+"]断开连接");
conn.Close();
return;
}
string str = System.Text.Encoding.UTF8.GetString(conn.buff,0,count);
Console.WriteLine("收到[" + conn.GetAdress() + "]的信息:" + str);
//广播
str ="[" + conn.GetAdress() + ":]" + str;
byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
for(int i = 0;i<conns.Length;i++)
{
if(conns[i]==null || !conns[i].isUse)
{
continue;
}
Console.WriteLine("将消息传播给:"+conns[i].GetAdress());
conns[i].socket.Send(bytes);
}
//继续接收
conn.socket.BeginReceive(conn.buff,conn.buffCount, conn.BuffRemain(), SocketFlags.None, ReceiveCb, conn);
}
catch(Exception e)
{
Console.WriteLine("服务器与["+conn.GetAdress()+"]断开连接!");
conn.Close();
}
}
}
using System;
public class MainClient
{
public static void Main(String[] args)
{
//开启服务端
Console.WriteLine("启动服务器!");
SeverNet ser = new SeverNet();
ser.Start("127.0.0.1",1234);
while(true)
{
switch(Console.ReadLine())
{
case "quit":
return;
}
}
}
}
客户端
using UnityEngine;
using UnityEngine.UI;
using System.Net.Sockets;
using System;
public class Sys : MonoBehaviour
{
//收到的消息
public Text ReceiveText;
private string ReceiveStr;
//发送的消息
public InputField SendInputField;
//本地ip
public Text LocalEndPoint;
private Socket socket;
//缓存
private const int Buff_Size = 1024;
private byte[] buffBytes = new byte[Buff_Size];
//private int buffCount;
public Button link;
public Button send;
private void Start()
{
link.onClick.AddListener(Connection);
send.onClick.AddListener(Send);
}
private void Update()
{
ReceiveText.text = ReceiveStr;
}
public void Connection()
{
ReceiveStr = "";
//连接服务器
socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Connect("127.0.0.1",1234);
LocalEndPoint.text = socket.LocalEndPoint.ToString();
//接收消息
socket.BeginReceive(buffBytes,0,Buff_Size,SocketFlags.None,ReceiveCb,null);
}
//异步回调
private void ReceiveCb(IAsyncResult ar)
{
try
{
int count = socket.EndReceive(ar);
string str = System.Text.Encoding.UTF8.GetString(buffBytes, 0, count);
if (ReceiveStr.Length > 300) ReceiveStr = "";
ReceiveStr = "收到的消息为:" + str;
socket.BeginReceive(buffBytes, 0, Buff_Size, SocketFlags.None, ReceiveCb, null);
}
catch (Exception e)
{
ReceiveStr = "连接已断开";
socket.Close();
}
}
private void Send()
{
string str = SendInputField.text;
byte[] bytes = System.Text.Encoding.Default.GetBytes(str);
try
{
socket.Send(bytes);
}
catch
{
}
}
}