예제 #1
0
 private void BT_Save_Click(object sender, RoutedEventArgs e)
 {
     UserSource.Uname     = TEXT_Name.Text;
     UserSource.Utag      = TEXT_Tag.Text;
     UserSource.Upassword = TEXT_Pwd.Text;
     SocketTool.GetClientUDP().SendToServer(TheMessageModel.UPDATE_USER(0, UserSource, HeadImageBytes));
 }
        private string PostToSyncServer(string subUrl, string sentXml)
        {
            string result = "";

            try
            {
                string str     = SocketTool.GetUrl();
                string url_Imp = SocketTool.GetUrl_Imp();
                if (MeetingID.ToLower().StartsWith("i"))
                {
                    str = url_Imp;
                }
                HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(str + subUrl);
                byte[]         bytes          = Encoding.UTF8.GetBytes(sentXml);
                httpWebRequest.Method        = "POST";
                httpWebRequest.ContentType   = "text/xml; encoding='utf-8'";
                httpWebRequest.ContentLength = bytes.Length;
                Stream requestStream = httpWebRequest.GetRequestStream();
                requestStream.Write(bytes, 0, bytes.Length);
                requestStream.Close();
                WebResponse response = httpWebRequest.GetResponse();
                requestStream = response.GetResponseStream();
                StreamReader streamReader = new StreamReader(requestStream);
                result = streamReader.ReadToEnd();
                streamReader.Close();
                requestStream.Close();
                response.Close();
                return(result);
            }
            catch (Exception ex)
            {
                LogTool.Debug(ex);
                return(result);
            }
        }
예제 #3
0
        private void BT_SendAddFriendMessage_Click(object sender, RoutedEventArgs e)
        {
            ContentControl bt  = sender as ContentControl;
            long           num = Convert.ToInt64(bt.Tag);

            SocketTool.GetClientUDP().SendToServer(TheMessageModel.MAKEFRIEND(UserSource.UloginNumber ?? 0, num, Model.MessageContent.MakeFriendType.SendStart));
        }
예제 #4
0
 public static SocketTool GetInstance()
 {
     if (instance == null)
     {
         instance = new SocketTool();
     }
     return(instance);
 }
예제 #5
0
    private void OnGUI()
    {
        //设置皮肤
        GUI.skin = skin;

        //【未联网状态】
        if (currentState == 0)
        {
            GUILayout.Label("请输入服务端IP:");
            serverIP = GUILayout.TextField(serverIP);
            GUILayout.Label("请输入服务端Port:");
            serverPort = GUILayout.TextField(serverPort);

            if (GUILayout.Button("创建服务器"))
            {
                //创建服务器,服务器收到的回调消息,传输给Log去显示
                SocketTool.GetInstance().ServerInit(msg =>
                {
                    log += msg + "\n";
                });
                //改变状态为【服务器状态】
                currentState = 1;
            }

            if (GUILayout.Button("连接服务器"))
            {
                SocketTool.GetInstance().ClientConnect(
                    serverIP, int.Parse(serverPort),
                    msg =>
                {
                    log += msg + "\n";
                });
                //改变状态为【客户端状态】
                currentState = 2;
            }
        }
        //【服务器状态】
        else if (currentState == 1)
        {
            //暂无操作
        }
        //【客户端状态】
        else if (currentState == 2)
        {
            GUILayout.Label("请输入要发送的消息:");
            sendMsg = GUILayout.TextField(sendMsg);

            if (GUILayout.Button("发送..."))
            {
                //客户端发送消息
                SocketTool.GetInstance().ClientSend(sendMsg);
            }
        }

        //显示日志
        GUILayout.Label(log);
    }
예제 #6
0
        private void MENUITEM_Friends_Click(object sender, RoutedEventArgs e)
        {
            MenuItem item         = (sender as MenuItem);
            User     SelectedUser = item.DataContext as User;

            switch (item.Tag.ToString().ToUpper())
            {
            case "DELETEFRIEND":
                SocketTool.GetClientUDP().SendToServer(TheMessageModel.MAKEFRIEND(UserSource.UloginNumber ?? 0, SelectedUser.UloginNumber ?? 0, MakeFriendType.Delete))
                ; break;
            }
        }
예제 #7
0
파일: Form1.cs 프로젝트: MrLurk/CoCo-IM
        private void btn_login_Click(object sender, EventArgs e)
        {
            var userName = this.txt_userName.Text.Trim();
            var password = this.txt_passWord.Text.Trim();

            if (string.IsNullOrWhiteSpace(userName) || string.IsNullOrWhiteSpace(password))
            {
                MessageBox.Show("请填写完整账号密码密码!");
                return;
            }

            var message = $"Login {userName} {password} \r\n";


            SocketTool.Send(socket, message);
        }
예제 #8
0
 public override void OnApplyTemplate()
 {
     SocketClient       = SocketTool.GetClientUDP();
     SendMessageCommand = new ActionCommand(() =>
     {
         MessageContent_String MsgContent = new MessageContent_String(Text);
         MessageModel msg = new MessageModel(MessageType.String, UserFrom.UloginNumber ?? 0, UserTo.UloginNumber ?? 0, SocketTool.IPV4Address.ToString(), MsgContent);
         int MsgState     = SocketClient.SendTo(msg, StaticResource.ServerIpaddress);
         SendedMessage?.Invoke(this, UserFrom, UserTo, msg, MsgState);
         Text = "";
     });
     SendImageCommand = new ActionCommand(() =>
     {
         OpenFileDialog SelectDialog = new OpenFileDialog();
         SelectDialog.Multiselect    = true;
         SelectDialog.Filter         = "*.jpg|*.png";
         SelectDialog.ShowDialog();
         String[] files = SelectDialog.FileNames;
         long FromNum   = UserFrom.UloginNumber ?? 0;
         long ToNum     = UserTo.UloginNumber ?? 0;
         foreach (String file in files)
         {
             ThreadPool.QueueUserWorkItem(call =>
             {
                 String FileName = "";
                 SocketTool.TCPSendFile(file, FromNum, ToNum, DataPacketType.ImageDataPacket, out FileName);
                 MessageModel msg = TheMessageModel.IMAGE(FileName, FromNum, ToNum);
                 int MsgState     = SocketTool.GetClientUDP().SendToServer(msg);
                 //将自己选择的文件位置作为图片发送出去
                 MessageContent_Image localImg = MessageModel.ToModel <MessageContent_Image>(msg.MessageContent);
                 localImg.SetContent(file);
                 msg.MessageContent = localImg;
                 Dispatcher.Invoke(() =>
                 {
                     SendedMessage?.Invoke(this, UserFrom, UserTo, msg, MsgState);
                 });
                 Thread.Sleep(1000);
             });
         }
     });
     base.OnApplyTemplate();
 }
예제 #9
0
        private static void Init_Instance(string _MeetingID, string _UserID, string _UserName, bool InitToSync)
        {
            UserName  = _UserName;
            MeetingID = _MeetingID;
            _UserID   = Socket_FixEmailUserID.ToSocket(_UserID);
            UserID    = _UserID;
            ClearInstance();
            string str     = SocketTool.GetUrl();
            string url_Imp = SocketTool.GetUrl_Imp();

            if (_MeetingID.ToLower().StartsWith("i"))
            {
                str = url_Imp;
            }
            instance = new SocketClient(str + "/JoinSyncServer", _MeetingID, 100, _UserID, _UserName, InitToSync, 2, "12");
            if (ReaderEvent != null)
            {
                instance.AddEventManager(ReaderEvent);
            }
            instance.AddEventManager(OpenEventList);
            instance.AddCloseEventManager(CloseEventList);
            if (CS_0024_003C_003E9__CachedAnonymousMethodDelegate3 == null)
            {
                CS_0024_003C_003E9__CachedAnonymousMethodDelegate3 = new ThreadStart(_003CInit_Instance_003Eb__2);
            }
            thread = new Thread(CS_0024_003C_003E9__CachedAnonymousMethodDelegate3);
            thread.IsBackground = false;
            thread.Start();
            for (int i = 0; i < 10; i++)
            {
                if (instance != null && instance.GetIsConnected())
                {
                    return;
                }
                Thread.Sleep(10);
            }
            if (instance == null || !instance.GetIsConnected())
            {
                instance = null;
            }
        }
예제 #10
0
        private string PostToSyncServer(string subUrl, string sentXml)
        {
            string getXml = "";

            try
            {
                string SyncServerUrl     = SocketTool.GetUrl();
                string SyncServerUrl_Imp = SocketTool.GetUrl_Imp();
                if (MeetingID.ToLower().StartsWith("i") == true)
                {
                    SyncServerUrl = SyncServerUrl_Imp;
                }

                HttpWebRequest request  = (HttpWebRequest)WebRequest.Create(SyncServerUrl + subUrl);
                string         data     = sentXml;
                byte[]         postData = Encoding.UTF8.GetBytes(data);

                request.Method        = "POST";
                request.ContentType   = "text/xml; encoding='utf-8'";
                request.ContentLength = postData.Length;

                Stream dataStream = request.GetRequestStream();
                dataStream.Write(postData, 0, postData.Length);
                dataStream.Close();

                WebResponse response = request.GetResponse();
                dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                getXml = reader.ReadToEnd();
                reader.Close();
                dataStream.Close();
                response.Close();
            }
            catch (Exception ex)
            {
                LogTool.Debug(ex);
            }

            return(getXml);
        }
예제 #11
0
        private void SocketServer_GetNewMessage(MessageModel Msg, EndPoint From)
        {
            Object b = Msg.MessageContent;

            if (Msg.MessageType == MessageType.Login)
            {
                MessageContent_Login info = MessageModel.ToModel <MessageContent_Login>(Msg.MessageContent);
                //如果是登录消息
                if (info.LoginType == LoginType.Submit)
                {
                    //这里判断是否登录成功,返回一个Result类型的Login信息
                    if (IsOnline(info.GetContent().UloginNumber ?? 0))
                    {
                        SocketServer.SendTo(new MessageModel(MessageType.Login, 0, info.GetContent().UloginNumber ?? 0, SocketTool.IPV4Address.ToString(), new MessageContent_Login(LoginType.Result, info.GetContent(), MessageStringMark.GetCodeMsg(MessageStringMark.CodeMessageType.LoginError_UserOnline).ToString())), From);
                        return;
                    }
                    Dispatcher.Invoke(() =>
                    {
                        AddOnlineUser(new UserInfo()
                        {
                            UserIP = From,
                            User   = info.GetContent(),
                        });
                        SocketServer.SendTo(new MessageModel(MessageType.Login, 0, info.GetContent().UloginNumber ?? 0, SocketTool.IPV4Address.ToString(), new MessageContent_Login(LoginType.Result, info.GetContent(), MessageStringMark.GetCodeMsg(MessageStringMark.CodeMessageType.LoginSuccess).ToString())), From);
                    });
                }
                //如果是在线确认消息
                else if (info.LoginType == LoginType.ImOnline)
                {
                    long clientNum = info.GetContent().UloginNumber ?? 0;
                    //如果已存在
                    if (OnlineUsersDateTime.Keys.Where(k => k == clientNum).Count() > 0)
                    {
                        OnlineUsersDateTime[clientNum] = DateTime.Now;
                    }
                    else
                    {
                        //如果不存在就表明已经被下线了
                        // OnlineUsersDateTime.Add(clientNum, DateTime.Now);
                    }
                }
            }
            else
            {
                //!!!!!!!!!!!!!!!!
                //!!!!!!!!!!!!!!!!
                //这里的消息需要手动添加
                //不然无法显示出来
                MessageContent_Base content_base = MessageModel.ToModel <MessageContent_Base>(Msg.MessageContent);
                //如果是文字消息
                if (Msg.MessageType == MessageType.String)
                {
                    MessageContent_String info = MessageModel.ToModel <MessageContent_String>(Msg.MessageContent);
                    content_base = info;
                    MessageRouter();
                }
                else if (Msg.MessageType == MessageType.Get)
                {
                    MessageContent_Get m = MessageModel.ToModel <MessageContent_Get>(Msg.MessageContent);
                    content_base = m;
                    long lnum = long.Parse(m.RequestArg.ToString());
                    if (m.RequestType == Get_Type.File)
                    {
                        if (m.RequestFileType == File_Type.HeadImagoe)
                        {
                            User u = DB.Users.Where(u => u.UloginNumber == lnum).First();
                            m.RequestArg = u.UheadImage;
                        }
                        if (IoTool.IsExists(m.RequestArg.ToString()))
                        {
                            m.Content = IoTool.GetFileByte(m.RequestArg.ToString());
                        }
                        else
                        {
                            m.Content = IoTool.GetFileByte(StaticResource.DefaultUserHeadImageBasePath);
                        }
                        m.RequestArg = lnum.ToString();
                    }
                    SocketServer.SendTo(new MessageModel(MessageType.Get, 0, Msg.FromLoginNumber, StaticResource.IPV4Address.ToString(),
                                                         m), From);
                }
                else if (Msg.MessageType == MessageType.DataPacket)
                {
                    MessageContent_DataPacket data = MessageModel.ToModel <MessageContent_DataPacket>(Msg.MessageContent);
                    content_base = data;
                    MessageRouter();
                }
                else if (Msg.MessageType == MessageType.Image)
                {
                    MessageContent_Image img = MessageModel.ToModel <MessageContent_Image>(Msg.MessageContent);
                    content_base = img;
                    MessageRouter();
                }
                //如果是加好友
                else if (Msg.MessageType == MessageType.MakeFriend)
                {
                    MessageContent_MakeFriend friend = MessageModel.ToModel <MessageContent_MakeFriend>(Msg.MessageContent);
                    content_base = friend;
                    if (friend.MakeFriendType == MakeFriendType.SendStart)
                    {
                        MessageRouter();
                    }
                    else if (friend.MakeFriendType == MakeFriendType.Success)
                    {
                        DB.Friends.Add(new Friend()
                        {
                            AcceptUser = friend.ToNum,
                            SendUser   = friend.FromNum,
                            CreateDate = friend.CreateDate,
                            LockDate   = DateTime.UtcNow,
                        });
                        if (DB.SaveChanges() > 0)
                        {
                            MessageRouter();
                        }
                    }
                    //如果是删好友
                    else if (friend.MakeFriendType == MakeFriendType.Delete)
                    {
                        DB.Entry(DB.Friends.Where(f => f.SendUser == friend.FromNum && f.AcceptUser == friend.ToNum || f.SendUser == friend.ToNum & f.AcceptUser == friend.FromNum).First()).State = EntityState.Deleted;
                        //如果数据库删除成功
                        if (DB.SaveChanges() > 0)
                        {
                            //把消息给两方发过去
                            friend.MakeFriendType = MakeFriendType.DeleteSuccess;
                            Msg.MessageContent    = friend;
                            MessageRouter();
                            MessageRouterToFrom();
                        }
                    }
                }
                else if (Msg.MessageType == MessageType.UpdateUser)
                {
                    MessageContent_UpdateUser content = MessageModel.ToModel <MessageContent_UpdateUser>(Msg.MessageContent);
                    Msg.MessageContent = content;
                    User   ContentUser       = content.GetContent();
                    User   EFuser            = DB.Users.Where(u => u.Uid == ContentUser.Uid).First();
                    String HeadImageSavePath = null;
                    //如果上传头像了
                    if (content.HeadImageBytes.Length != 0)
                    {
                        //保存图片 把地址放到数据库
                        HeadImageSavePath = StaticResource.UserHeadImageBasePath + ContentUser.UloginNumber + ".png";
                        IoTool.SaveFile(HeadImageSavePath, content.HeadImageBytes);
                        EFuser.UheadImage = HeadImageSavePath;
                    }

                    EFuser.Uname     = ContentUser.Uname;
                    EFuser.Upassword = ContentUser.Upassword;
                    EFuser.Utag      = ContentUser.Utag;

                    DB.Update(EFuser);
                    if (DB.SaveChanges() > 0)
                    {
                        //成功后再把修改后的User发送回去
                        //如果想要所有人都实时改变就再判断一下分别向好友发送更改后的User
                        content.SetContent(EFuser);
                        Msg.MessageContent = content;
                        MessageRouterToFrom();
                    }
                }


                //将当前消息进行统一处理
                void MessageRouter(MessageContent_Base c = null)
                {
                    if (c != null)
                    {
                        Msg.MessageContent = c;
                    }
                    //如果目标在线
                    if (IsOnline(Msg.ToLoginNumber))
                    {
                        UserInfo UserTo = OnlineUsers[Msg.ToLoginNumber];
                        SocketTool.GetServerUDP().SendTo(Msg, UserTo.UserIP);
                    }
                    //如果目标不在线
                    //输入到数据库------------->
                    else
                    {
                    }
                }

                //将消息返回给发送者
                void MessageRouterToFrom()
                {
                    //如果目标在线
                    if (IsOnline(Msg.FromLoginNumber))
                    {
                        UserInfo UserTo = OnlineUsers[Msg.FromLoginNumber];
                        SocketTool.GetServerUDP().SendTo(Msg, UserTo.UserIP);
                    }
                    //如果目标不在线
                    //输入到数据库------------->
                    else
                    {
                    }
                }

                Dispatcher.Invoke(() =>
                {
                    Msg.MessageContent      = content_base;
                    DisplayMessageModel msg = new DisplayMessageModel()
                    {
                        IsFrom = true,
                        Msg    = Msg,
                    };
                    LIST_MessageLogs.Items.Add(msg);
                    LIST_MessageLogs.ScrollIntoView(msg);
                });
            }
        }
예제 #12
0
 public void OnInitMessageRouter()
 {
     SocketTool.GetClientUDP().GetNewMessage += ClientSocket_GetNewMessage_ChatForm;
 }
예제 #13
0
 private void OnApplicationQuit()
 {
     //收尾
     SocketTool.GetInstance().SocketDispose();
 }
 private async void RunTool()
 {
     SocketTool tool = new SocketTool();
     await Task.Run(() => tool.Run());
 }
예제 #15
0
        //------------------消息处理-----------------
        private void ClientSocket_GetNewMessage_ChatForm(MessageModel Msg, System.Net.EndPoint From)
        {
            if (Msg.MessageType == MessageType.String)
            {
                MessageContent_String c = MessageModel.ToModel <MessageContent_String>(Msg.MessageContent);
                Msg.MessageContent = c;
                PrintMessageRouter();
            }
            else if (Msg.MessageType == MessageType.Get)
            {
                MessageContent_Get get = MessageModel.ToModel <MessageContent_Get>(Msg.MessageContent);
                if (get.RequestType == Get_Type.File)
                {
                    if (get.RequestFileType == File_Type.HeadImagoe)
                    {
                        IoTool.CreateDirectory(StaticResource.UserHeadImageBasePath);
                        String headPath = StaticResource.ToUserHeadImagePath(get.RequestArg + ".png");
                        IoTool.SaveFile(headPath, get.Content);
                        Dispatcher.Invoke(() =>
                        {
                            StaticResource.SetHeadImageSource(long.Parse(get.RequestArg.ToString()), ImageTool.GetUserHeadeImage(long.Parse(get.RequestArg.ToString())));
                        });
                    }
                }
            }
            else if (Msg.MessageType == MessageType.Login)
            {
                MessageContent_Login login = MessageModel.ToModel <MessageContent_Login>(Msg.MessageContent);
                if (login.LoginType == LoginType.OffOnLine)
                {
                    MessageBox.Show(MessageStringMark.GetCodeMsg(login.WithMessage));
                    Dispatcher.Invoke(() =>
                    {
                        OnCloseALL();
                    });
                }
            }
            else if (Msg.MessageType == MessageType.DataPacket)
            {
                MessageContent_DataPacket packet = MessageModel.ToModel <MessageContent_DataPacket>(Msg.MessageContent);
                //如果是图片的数据
                if (packet.PacketType == DataPacketType.ImageDataPacket)
                {
                    String fname = packet.FileName;
                    //如果是第一个包
                    if (packet.PacketIndex == 1)
                    {
                        DataPacketsFile.Add(fname, new WritingFile(StaticResource.MessageImagePath + fname)
                        {
                            Tag = packet.FileToken//这条实在没什么用
                        });
                    }
                    DataPacketsFile[fname].Writer(packet.Content);
                    if (packet.IsLastPacket)
                    {
                        DataPacketsFile[fname].WriterEnd();
                    }
                }
            }
            else if (Msg.MessageType == MessageType.Image)
            {
                MessageContent_Image img = MessageModel.ToModel <MessageContent_Image>(Msg.MessageContent);
                Msg.MessageContent = img;
                PrintMessageRouter();
            }
            else if (Msg.MessageType == MessageType.MakeFriend)
            {
                ChatHotContext DB = new ChatHotContext();

                MessageContent_MakeFriend content = MessageModel.ToModel <MessageContent_MakeFriend>(Msg.MessageContent);
                Msg.MessageContent = content;
                if (content.MakeFriendType == MakeFriendType.SendStart)
                {
                    if (MessageBox.Show("好友请求", "来自" + content, MessageBoxButton.YesNoCancel) == MessageBoxResult.Yes)
                    {
                        //这个是返回消息所以是反着来的
                        //SocketTool.GetClientUDP().SendToServer(TheMessageModel.MAKEFRIEND(content.ToNum, content.FromNum, content.FromNum, content.ToNum, MakeFriendType.Success));
                        Msg.FromIpaddress      = StaticResource.IPV4Address.ToString();
                        Msg.FromLoginNumber    = content.ToNum;
                        Msg.ToLoginNumber      = content.FromNum;
                        content.MakeFriendType = MakeFriendType.Success;
                        Msg.MessageContent     = content;
                        SocketTool.GetClientUDP().SendToServer(Msg);
                        Dispatcher.Invoke(() =>
                        {
                            UserListForm.MainUserListForm.AddFriendsItem(DB.Users.Where(u => u.UloginNumber == content.FromNum).First());
                        });
                    }
                }
                else if (content.MakeFriendType == MakeFriendType.Success)
                {
                    MessageBox.Show("对方同意");
                    Dispatcher.Invoke(() =>
                    {
                        UserListForm.MainUserListForm.AddFriendsItem(DB.Users.Where(u => u.UloginNumber == content.ToNum).First());
                    });
                }
                else if (content.MakeFriendType == MakeFriendType.Fail)
                {
                    MessageBox.Show("对方拒绝");
                }
                else if (content.MakeFriendType == MakeFriendType.DeleteSuccess)
                {
                    Dispatcher.Invoke(() => {
                        UserListForm.MainUserListForm.RemoveFriendsItem(UserSource.UloginNumber == content.FromNum ? content.ToNum : content.FromNum);
                    });
                }
                DB.Dispose();
                return;
            }
            else if (Msg.MessageType == MessageType.UpdateUser)
            {
                MessageContent_UpdateUser content = MessageModel.ToModel <MessageContent_UpdateUser>(Msg.MessageContent);
                StaticResource.ALLUserSource = content.GetContent();
                Dispatcher.Invoke(() =>
                {
                    UserInfoChanged(content.GetContent());
                });
                //PrintMessageRouter(content);
            }
            //如果是需要提醒用户的消息就调用一下这个方法
            void PrintMessageRouter(Object content = null)
            {
                if (content != null)
                {
                    Msg.MessageContent = content;
                }
                //如果存在打开的对应登录号的聊天窗体
                if (MainChatForm != null && HasChatUser(Msg.FromLoginNumber))
                {
                    Dispatcher.Invoke(() =>
                    {
                        User UserFrom = GetUserByChatUsersItem(Msg.FromLoginNumber);
                        PrintMessage(Msg, UserFrom, UserSource);
                    });
                }
                //如果不存在
                else
                {
                    //MessageBox.Show("有新的消息--->>" + Msg.FromLoginNumber);
                    Dispatcher.Invoke(() =>
                    {
                        UserListForm.MainUserListForm.AppendToMessageQueue(Msg);
                    });
                }
            }
        }
예제 #16
0
파일: Program.cs 프로젝트: ahbaer/baer
 static void Main(string[] args)
 {
     SocketTool.OnStart();
 }
예제 #17
0
        public virtual void ReceiveCallback(IAsyncResult ar)
        {
            if (TotalSession >= 10000)
            {
                TotalSession = 0;
            }
            TotalSession++;
            System.Net.Sockets.Socket handler = ConnectSocket;
            var srb = ar.AsyncState as SocketReceiveBack;

            try
            {
                if (handler != null && !handler.Connected) //当近端主动Disconnect时会触发
                {
                    Sktconfig?.DisConnectCallback?.Invoke(this);
                    LogMsg(handler.LocalEndPoint.ToString(), handler.RemoteEndPoint.ToString(), $"disconnect remote {handler.RemoteEndPoint}\r\n");
                    return;
                }
                //最大是设置的msgbuffer的长度,如果发送的数据超过了buffer的长度就分批次接收
                //这里在客户端强制关闭也会进去这个回调,但是执行到EndReceive时会出错
                SocketError se;
                var         rEnd = handler?.EndReceive(ar, out se);

                if (rEnd > 0 && srb != null)
                {
                    var receiveBytes = srb.Buffer.Take(rEnd.Value).ToArray();

                    if (LastSessionTime == DateTime.MinValue)
                    {//websockethttp协议升级
                        #region 分析报文、文本
                        LastSessionTime = DateTime.Now;
                        string receiveText = Encoder.GetString(receiveBytes);
                        //确认客户端发送的是websocket握手协议包,解析出key
                        if (receiveText.IndexOf("Sec-WebSocket-Version:", StringComparison.Ordinal) != -1)
                        {
                            SocketConnectType = SocketConnectType.WebSocket;
                            string[] rawClientHandshakeLines = receiveText.Split(new [] { "\r\n" },
                                                                                 StringSplitOptions.RemoveEmptyEntries);

                            string secwebSocketKey =
                                rawClientHandshakeLines.FirstOrDefault(e => e.Contains("Sec-WebSocket-Key:"));
                            string acceptKey =
                                SocketTool.ComputeWebSocketHandshakeSecurityHash09(
                                    secwebSocketKey?.Substring(secwebSocketKey.IndexOf(":", StringComparison.Ordinal) + 2));
                            var newHandshake = Encoder.GetBytes(SocketTool.ComputeNewHandshake(acceptKey));
                            //返回websocket握手包
                            handler.BeginSend(newHandshake, 0, newHandshake.Length, 0, SendCallback, null);
                            handler.BeginReceive(srb.Buffer, 0, BufferSize, 0, ReceiveCallback, srb);
                            LogMsg(handler.LocalEndPoint.ToString(), handler.RemoteEndPoint.ToString(), $"from remote {handler.RemoteEndPoint} webSocket first session receive data [{receiveText}]\r\n");
                            return;
                        }
                        #endregion
                    }
                    else if (SocketConnectType == SocketConnectType.WebSocket)
                    {//websocket解析明文内容
                        receiveBytes = new DataFrame(receiveBytes).Content;
                    }

                    #region 解析每一个数据包
                    //LogMsg(handler.LocalEndPoint.ToString(), handler.RemoteEndPoint.ToString(), $"current session from remote {handler.RemoteEndPoint} receive data [{ BitConverter.ToString(receiveBytes)}]\r\n");
                    var bytepackage = GetPackage(receiveBytes);
                    int queeCount   = bytepackage.Count;
                    handler.BeginReceive(srb.Buffer, 0, BufferSize, 0, ReceiveCallback, srb);
                    for (int i = 0; i < queeCount; i++)
                    {
                        //下面是正常业务逻辑处理
                        var bytemsg = bytepackage.Dequeue();
                        if (bytemsg.Length == 0)
                        {
                            continue;
                        }
                        LogMsg(handler.LocalEndPoint.ToString(), handler.RemoteEndPoint.ToString(), $"from {handler.RemoteEndPoint} receive [{ BitConverter.ToString(bytemsg)}]\r\n");

                        if (srb.MsgRecevieCallBack != null)
                        {
                            srb.MsgRecevieCallBack(bytemsg, this);
                        }
                        else
                        {
                            Sktconfig?.ReceiveCallback?.Invoke(bytemsg, this);
                        }
                        //else //如果回调是空就原样返回,正常收发可达5000次/s
                        //{
                        //    Send(bytemsg);
                        //}
                    }
                    #endregion
                }
                else //远端主动Disconnect时会到达这里
                {
                    if (handler != null)
                    {
                        Sktconfig?.DisConnectCallback?.Invoke(this);
                        LogMsg(handler.LocalEndPoint.ToString(), handler.RemoteEndPoint.ToString(), $"remote {handler.RemoteEndPoint} has close\r\n");
                    }
                }
                LastSessionTime = DateTime.Now;
            }
            catch (SocketException sktex)
            {
                SocketException(handler, sktex);
            }
            catch (Exception ex)
            {
                Exception(ex);
            }
        }
예제 #18
0
        private static void Init_Instance(string _MeetingID, string _UserID, string _UserName, bool InitToSync)
        {
            UserName  = _UserName;
            MeetingID = _MeetingID;
            _UserID   = Socket_FixEmailUserID.ToSocket(_UserID);
            UserID    = _UserID;
            ClearInstance();
            //if (thread != null)
            //{
            //    thread.Abort();
            //}
            //if (instance != null)
            //{
            //    instance = null;
            //}

            // new SocketClient(syncServerUrl, meetingId, maxClient, clientId, clientName, isSync, clientType, func, true);
            // clientType 2是PC
            string SyncServerUrl     = SocketTool.GetUrl();
            string SyncServerUrl_Imp = SocketTool.GetUrl_Imp();

            if (_MeetingID.ToLower().StartsWith("i") == true)
            {
                SyncServerUrl = SyncServerUrl_Imp;
            }
            instance = new SocketClient(SyncServerUrl + "/JoinSyncServer", _MeetingID, 100, _UserID, _UserName, InitToSync, 2, "12");
            if (ReaderEvent != null)
            {
                instance.AddEventManager(ReaderEvent);
            }
            instance.AddEventManager(OpenEventList);
            instance.AddCloseEventManager(CloseEventList);


            thread = new Thread(delegate()
            {
                try
                {
                    //run()方法是無窮迴圈,所以要開Thread去跑
                    if (instance != null)
                    {
                        instance.run();
                    }
                }
                catch (Exception ex)
                {
                    LogTool.Debug(ex);
                }
            });
            thread.IsBackground = true;
            thread.Start();

            // 延遲一下,等待IEventManager.run 開始跑。
            //Thread.Sleep(100);

            int i = 0;

            while (i < 10)
            {
                if (instance != null && instance.GetIsConnected() == true)
                {
                    return;
                }

                Thread.Sleep(10);

                i++;
            }

            if (instance == null || instance.GetIsConnected() == false)
            {
                instance = null;
            }
        }
예제 #19
0
 /// <param name="From">当前客户端的用户</param>
 /// <param name="To">与当前客户端聊天的用户</param>
 public ChatTextBox(SocketTool socket, User From, User To)
 {
     SocketClient = socket;
     UserFrom     = From;
     UserTo       = To;
 }
예제 #20
0
 /// <param name="From">当前客户端的用户</param>
 /// <param name="To">与当前客户端聊天的用户</param>
 public ChatTextBox(User From, User To)
 {
     SocketClient = SocketTool.GetClientUDP();
     UserFrom     = From;
     UserTo       = To;
 }