初学Socket
服务器部分代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System;
public class NetManager : MonoBehaviour
{
private byte[] buffer = new byte[1024]; // 服务器设置最大接受客户端信息字段长度
void Start()
{
//开启服务器方法
StartServer();
}
/// <summary>
/// 开启服务器
/// 一:实例化一个socket对象
/// 二:创建一个终端
/// 三:建立绑定
/// 四:进行监听
/// </summary>
private void StartServer()
{
// 1:地址Ipv4 传输类型(流式) Tcp协议
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 2:终端 Ip+Port(端口)
IPEndPoint endPoiont = new IPEndPoint(IPAddress.Any, 8888);
// 3:绑定
server.Bind(endPoiont);
// 4:开启监听 10代表同一时间可以处理多少个客户端数据 并非最大连接量
server.Listen(10);
Debug.Log("server ok");
// 异步开启接收客户端
server.BeginAccept(AsyncAccept, server);
}
/// <summary>
/// 异步接收客户端
/// </summary>
/// <param name="content"></param>
void AsyncAccept(IAsyncResult content)
{
Socket server = content.AsyncState as Socket; //得到服务器
Socket client = server.EndAccept(content); //服务器结束对当前客户端监听
//再次开启异步 用于接收多个客户端
server.BeginAccept(AsyncAccept, server);
//接受客户端消息
/*异步接收数据 参数解析
* 1 接收的容器
* 2 从该容器某位置接受
* 3 接受最大长度
* 4 null
* 5 接收到之后接收到的回调
* 6 对象(一般传自己)
*/
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, AsyncReceive, client); // 接受客户端数据,并计算真正长度
}
/// <summary>
/// 异步接收客户端消息
/// </summary>
/// <param name="result"></param>
void AsyncReceive(IAsyncResult result)
{
Socket client = result.AsyncState as Socket;
int len = client.EndReceive(result); // 异步接收数据结束结算真正数据长度
//再次开启异步监听消息
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, AsyncReceive, client); // 接受客户端数据,并计算真正长度
//消息解析
byte[] res = new byte[len]; // 新建数组接受真正数据 去除冗余数据
System.Buffer.BlockCopy(buffer, 0, res, 0, len); // 数组间赋值
string msg = System.Text.Encoding.UTF8.GetString(res); // 将数据重新转化为字符
Debug.Log(msg);
}
}
//客户端部分代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace SocketClient
{
class Program
{
static void Main(string[] args)
{
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//客户端连接服务器
client.Connect(IPAddress.Parse("127.0.0.1"), 8888);
while (true)
{
//阻塞数据 客户端输入消息
string msg = Console.ReadLine();
//将消息转化为数据格式
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(msg);
//发送数据
client.Send(buffer);
}
}
}
}
浙公网安备 33010602011771号