服务器同步客户端

本文详细介绍了使用C#编写的TCP服务器,包括创建Socket实例、绑定和监听端口、接受客户端连接、处理消息传递以及客户端的连接、接收和发送操作。展示了多线程在实时通信中的应用。
摘要由CSDN通过智能技术生成

服务器

//其他线程要使用所以要全局
static Socket socket;
static void Main(string[] args)
{
    //得有手机(使用ipv4查找地址,使用字节流传输数据,使用Tcp协议传输)
    socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    //创建手机卡(默认IP地址,自定义端口号)
    IPEndPoint iPEnd=new IPEndPoint(IPAddress.Any,222);
    //绑定手机号
    socket.Bind(iPEnd);
    //设定接听上线
    socket.Listen(10);

    //等待别人打电话(会阻塞线程)
    //子线程被输入阻塞的时候,主线程能继续正常运行
    ThreadPool.QueueUserWorkItem(Accept);
    while (true)
    {

    }
}
/// <summary>
/// 等待别人连接(会阻塞线程)
/// </summary>
/// <param name="state"></param>
private static void Accept(object state)
{
    Socket client=socket.Accept();
    //来电显示
    //获取ip地址和端口号
    IPEndPoint clientIP=client.RemoteEndPoint as IPEndPoint;
    Console.WriteLine(clientIP.Address+":"+clientIP.Port+"连接");
    //开线程收消息
    ThreadPool.QueueUserWorkItem(Receive, client);
    //等待下一个连接
    ThreadPool.QueueUserWorkItem(Accept);

}

private static void Receive(object state)
{
    Socket client=state as Socket;
    //创建一个字节流用来接收消息
    byte[] buffer=new byte[1024];
    //接收客户端发来的消息(会阻塞线程)
    int len = client.Receive(buffer, SocketFlags.None);

    //收到长度为0的消息时断开连接
    if(len>0)
    {
        //禁止收发消息
        client.Shutdown(SocketShutdown.Both);
        //关闭连接释放资源
        client.Close();
        return;
    }
    //1024是流的长度 len是消息的实际长度
    //截取数组前n位
    byte[] data = buffer.Take(len).ToArray();

    //解析data
    //byte数组转string
    string str=UTF8Encoding.UTF8.GetString(data);
    Console.WriteLine(str);
    //给客户端回消息
    Send(client, UTF8Encoding.UTF8.GetBytes("哦额你放哪"));
    //开线程收消息
    ThreadPool.QueueUserWorkItem(Receive,client);

}
//发送消息给客户端
private static void Send(Socket client, byte[] bytes)
{
    client.Send(bytes);
}

客户端

public Text text;
Socket socket;
Queue<byte[]> que=new Queue<byte[]>();
// Start is called before the first frame update
void Start()
{
    socket=new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    socket.Connect("127.0.0.1", 666);
    //收消息
    ThreadPool.QueueUserWorkItem(Receive);
}

private void Receive(object state)
{
    byte[] buffer=new byte[1024];
    int len = socket.Receive(buffer, SocketFlags.None);
    if(len <= 0)
    {
        socket.Shutdown(SocketShutdown.Both);
        socket.Close();
        return;
    }
    byte[] data = buffer.Take(len).ToArray();
    que.Enqueue(data);
    ThreadPool.QueueUserWorkItem(Receive);
}
public void OnBtn()
{
    string str = "写佛冈我看帮你";
    byte[] data=UTF8Encoding.UTF8.GetBytes(str);
    socket.Send(data);
}
// Update is called once per frame
void Update()
{
    //在主线程中取出队列的消息
    while( que.Count > 0 )
    {
        byte[] data=que.Dequeue();
        string str=UTF8Encoding.UTF8.GetString(data);
        text.text = str;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值