019-直接利用Socket/TCP开发网络游戏二

Posted jake-caiee

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了019-直接利用Socket/TCP开发网络游戏二相关的知识,希望对你有一定的参考价值。

今天我们继续开始学习网络部分的知识。今天的部分是分为两个部分的一个数据传送,一个是mysql的开头。废话不多说我们开始今天的内容。

我们其实知道在vs中是有粘包与分包的机制的,是为了内部的优化机制。那么我们应该如何去进行数据的传出与发送呢,我们用到的是这个类BitConverter.GetBytes这个类将所有的字符串都转换成四个字节,我们在tcp客户端创建一个类message,在其中写下如下的动心:

   public class Message
    {
        public static byte[] GetBytes(string data)
        {
            //首先得到的是传来的字符串转换成字节数组
            byte[] dataBytes = Encoding.UTF8.GetBytes(data);
            //接着计算长度
            int dataLength = data.Length;
            //创建新数组
            byte[] lengthByte = BitConverter.GetBytes(dataLength);//取到字节数组的长度
            byte[] newBytes = lengthByte.Concat(dataBytes).ToArray();
            return newBytes;
        }
    }

然后在在program中写

 for (int i = 0; i < 100; i++)
            {
                clientSocket.Send(Message.GetBytes(i.ToString()));
            }

接着在tcp服务器端写message,如下

 private byte[] data = new byte[1024];
        private int startIndex = 0;//开始索引
        public byte[] Data { get { return data; } }
        public int StartIndex { get { return startIndex; } }

        //还剩余什么
        public int RemainSize
        {
            get { return data.Length - startIndex; }
        }

        public void AddCount(int count)
        {
            startIndex += count;
        }

        //读数据
        public void ReadMessage()
        {
            while (true)
            {
                //如果数据长度不足4的话,会返回 
                if (startIndex <= 4) return;
                //得到传来数据的长度,因为toint32一次只会解析前四个字节,这样就知道了数组中还有几个数据
                int count = BitConverter.ToInt32(data, 0);
                if ((startIndex - 4) >= count)
                {
                    //索引减4就是真正的数据长度,就接受数据
                    string s = Encoding.UTF8.GetString(data, 4, count);
                    Console.WriteLine("解析出来的数据为:" + s);
                    //将数据进行更新
                    Array.Copy(data, count + 4, data, 0, startIndex - 4 - count);
                    startIndex -= (count + 4);
                }
                else
                {
                    break;
                }
            }
        }

在tcp的program中写下

  static Message msg = new Message();
 static void AcceptCallBack(IAsyncResult ar)
        {
            Socket serverSocket = ar.AsyncState as Socket;
            Socket clientSocket = serverSocket.EndAccept(ar);
            string msgStr = "Hello Client 您好...";
            byte[] data = Encoding.UTF8.GetBytes(msgStr);
            clientSocket.Send(data);

            clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);
            serverSocket.BeginAccept(AcceptCallBack, serverSocket);
        }
        static void ReceiveCallBack(IAsyncResult ar)
        {
            Socket clientSocket = null;
            try
            {
                clientSocket = ar.AsyncState as Socket;
                int count = clientSocket.EndReceive(ar);
                if (count == 0)
                {
                    clientSocket.Close();
                    return;
                }
                msg.AddCount(count);
                msg.ReadMessage();
                clientSocket.BeginReceive(msg.Data, msg.StartIndex, msg.RemainSize, SocketFlags.None, ReceiveCallBack, clientSocket);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                if (clientSocket != null)
                {
                    clientSocket.Close();
                }
            }
        }

这样就写了。

接下来是数据部分MySQL的使用就不说了,

//创建连接
            string connStr = "database=text002;data source=localhost;port=3306;user Id=root;password=root;";
            MySqlConnection conn = new MySqlConnection(connStr);
            conn.Open();

            #region 查询
            //MySqlCommand cmd = new MySqlCommand("select *from user", conn);
            //MySqlDataReader reader = cmd.ExecuteReader();
            //while (reader.Read())
            //{
            //    string username = reader.GetString("username");
            //    string password = reader.GetString("password");
            //    Console.WriteLine(username + ":" + password);
            //}
            //reader.Close();
            #endregion

            #region 插入
            //string username = "你好"; string password = "世界";
            //MySqlCommand cmd = new MySqlCommand("insert into user set [email protected],[email protected]", conn);
            //cmd.Parameters.AddWithValue("un", username);
            //cmd.Parameters.AddWithValue("pwd", password);         
            //cmd.ExecuteNonQuery();
            #endregion


            conn.Close();//断开连接
            Console.ReadKey();

就是这么多了。

以上是关于019-直接利用Socket/TCP开发网络游戏二的主要内容,如果未能解决你的问题,请参考以下文章

OSI(七层)网络模型,三次握手四次挥手梳理,Socket.TCP/IP.HTTP三者说明

java 网络编程(Socket) TCP/UDP 总结案例

廖雪峰Java13网络编程-1Socket编程-2TCP编程

简单易懂的区分HTTPSocket与TCP

socket,tcp,http三者之间的区别和原理

[网络] SOCKET, TCP/UDP, HTTP, FTP