皮影小游戏(2)——网络联机部署学习(Socket)

using System.Net.Sockets;
using System.Net;
using System;
using System.Text;

引入命名空间

服务器部分代码:Uni

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

namespace SocketMutiplayGameServer
{
    class Program
    {
        private static Socket socket;
        private static byte[] buffer = new byte[1024];
        static void Main(string[] args)
        {
            //三个参数:IP协议(我们用IPv4)、套接字的传输类型(用流式传输)、传输协议(用TCP协议)
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //进行绑定
            socket.Bind(new IPEndPoint(IPAddress.Any, 6666));
            //监听(int类型参数:同一个时间同时处理的请求最大数,超出这个最大数会让其他的客户端排队,再进行连接)
            socket.Listen(0);
            StartAccept();
            Console.Read();
        }

        static void StartAccept()
        {
            //异步应答连接(回调函数,传的参数)
            socket.BeginAccept(AcceptCallback, null);
        }



        static void StartReceive(Socket client)
        {
            //参数:存储载体、从第几位开始传,存储大小,(没用的),回调函数,可以把任何东西传进回调函数中使用
            //注意!!! 这里我们要把client传入回调函数作为参数,因为这个是服务器,是一对多的服务,不传参的话不知道处理的是哪一个的请求
            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, client);
        }

        /// 
        /// 把传进来的参数强制转换成Socket类型
        /// 
        /// 
        static void ReceiveCallback(IAsyncResult iar)
        {
            Socket client = iar.AsyncState as Socket;
            int len = client.EndReceive(iar);
            if (len == 0)
            {
                return;
            }
            string str = Encoding.UTF8.GetString(buffer, 0, len);
            Console.WriteLine(str);
            StartReceive(client);
        }

        /// 
        /// 应答接收
        /// 
        /// 
        static void AcceptCallback(IAsyncResult iar)
        {
            Socket client = socket.EndAccept(iar);
            StartReceive(client);
            StartAccept();
        }
    }
}

Unity里的Client.cs代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;


public class Client : MonoBehaviour
{
    private Socket socket;
    /// 
    /// 定义一个用来存消息的载体,定义大小空间
    /// 
    private byte[] buffer = new byte[1024];
    // Start is called before the first frame update
    void Start()
    {
        //三个参数:IP协议(我们用IPv4)、套接字的传输类型(用流式传输)、传输协议(用TCP协议)
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //进行服务端连接,参数:服务器IP地址(本机测试),服务器对应的端口号,
        socket.Connect("127.0.0.1",6666);
        StartReceive();
        Send();
    }

    /// 
    /// 异步接收消息
    /// 
    void StartReceive()
    {
        //参数:存储载体、从第几位开始传,存储大小,(没用的),回调函数,可以把任何东西传进回调函数中使用
        socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, null);
    }

    /// 
    /// 回调函数,用来处理消息,
    /// 处理消息之前需要得到接收到消息的长度,
    /// 在解析之前要进行消息长度的判断,
    /// 因为万一有一端强制关闭了连接,
    /// 消息接收状态就会一直接收,
    /// 他返回的数据是0的话就会一直输出空的消息,
    /// 有消息过来了就对消息进行解析
    /// 
    void ReceiveCallback(IAsyncResult iar)
    {
        int len = socket.EndReceive(iar);
        if (len==0)
        {
            return;
        }
        string str = Encoding.UTF8.GetString(buffer,0,len);
        Debug.Log(str);
        StartReceive();
    }

    /// 
    /// 连接成功后给服务器发送一段字符串
    /// 
    void Send()
    {
        //把字符串转换成字节数组
        socket.Send(Encoding.UTF8.GetBytes("你好"));
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

 这样之后先开c#控制台服务器,再打开Unity客户端,就可以发现,服务器收到了客户端发送的信息!!!

你可能感兴趣的:(联机皮影游戏,网络)