surpersocket客户端

大家在学习surpersocket时候,都是拿telnet测试的吧,是不是没有 客户端 而感到 烦恼。

我么,就抽了一点时间 写了个简单的客户端代码。

针对QuickStart的 1-Basic 第一部分那 几个  服务器demo

客户端也是c#写的,然后没啥大功能,就是 配合 服务器 粘包的方式,粘包拆包。

你们也可以 在 服务器上 for循环 send数据,看看客户端 是不是分包了。

链接:http://pan.baidu.com/s/1sjxDKQT 密码:xpeh

 

写在最后,很多人 学程序,心态都不好,头脑不好不要紧,但千万别厌恶世界,也许你花费了大量时间,不及我 三分钟学习。

但千万 不要嫉妒,凡事量力而行就好。

博客我会继续 更精彩的文章和代码给大家 。

 

核心代码:

using UnityEngine;
using System.Collections;
using System.ComponentModel;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Collections.Generic;
using LitJson;

public class SocketModel
{ 
    public Socket tcpClient;
    public Queue<JsonData> JsonList; 
    public void ClientSend()
    { 
        JsonList = new Queue<JsonData>();
        //主机IP
        IPEndPoint serverIp = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 3686);
        tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      
        tcpClient.BeginConnect(serverIp, asyncResult =>
        {
            try
            {
                tcpClient.EndConnect(asyncResult);
            }
            catch
            {
                JsonData message = new JsonData();
                message["type"] = "1";
                message["wifi"] = "false";
                tcpClient.Close();
                JsonList.Enqueue(message);///////////////// 加入队列  服务器连接失败   
            }

            ReceiveMessage(tcpClient);
        }, null);
    }
    private StringBuilder stringBuilder = new StringBuilder();             //这个是用来保存:接收到了的,但是还没有结束的消息
    private void ReceiveMessage(object state)            //这个函数会被以线程方式运行
    {
        string terminateString = "\r\n";
        Socket tcpClient = (Socket)state;
        while (true)
        {
            try
            {
                byte[] buffer = new byte[1024];  //buffer大小,此处为1024  

                int receivedSize = tcpClient.Receive(buffer);
                string rawMsg = Encoding.Unicode.GetString(buffer, 0, receivedSize);
                int rnFixLength = terminateString.Length;   //这个是指消息结束符的长度,此处为\r\n
                for (int i = 0; i < rawMsg.Length; )               //遍历接收到的整个buffer文本
                {
                    if (i <= rawMsg.Length - rnFixLength)
                    {
                        if (rawMsg.Substring(i, rnFixLength) != terminateString)//非消息结束符,则加入sb
                        {
                            stringBuilder.Append(rawMsg[i]);
                            i++;
                        }
                        else
                        {
                            JsonData jsontext = JsonMapper.ToObject(stringBuilder.ToString());  //转化成json格式数据   

                            if (jsontext["type"] != null)
                            {
                                JsonList.Enqueue(jsontext);////////////////// 加入队列   接收服务器消息
                                stringBuilder = new StringBuilder();
                                i += rnFixLength;
                            }
                            else {

                                JsonData message = new JsonData();
                                message["type"] = "4"; 
                                message["wifi"] = "false";
                                message["message"] = "ServerError服务器报错";
                                JsonList.Enqueue(message);////////////////// 加入队列   接收服务器消息
                                break;
                            } 
                        }
                    }
                    else
                    {
                        stringBuilder.Append(rawMsg[i]);
                        i++;
                    }
                }
            }
            catch
            {
                JsonData message = new JsonData();
                message["type"] = "3"; 
                message["wifi"] = "false";
                message["message"] = "ServerClosing服务器断开";
                JsonList.Enqueue(message);/////////////////// 加入队列  服务器连接失败   
                tcpClient.Close();
                break;
            }
        }
    }
    public void AsynSend(string message)
    {
        if (tcpClient.Connected)
        {
           
            byte[] data = Encoding.Unicode.GetBytes(message); 
            
            tcpClient.BeginSend(data, 0, data.Length, SocketFlags.None, asyncResult =>
            {
                //完成发送消息
                // int length = 
                tcpClient.EndSend(asyncResult);
            }, null);
        }
    }
}

 

posted on 2015-07-23 20:06  太粗难进  阅读(1379)  评论(2编辑  收藏  举报