コード例 #1
0
ファイル: SocketServer.cs プロジェクト: ypfly/SocketServer
        Thread threadWatch = null; // 负责监听客户端连接请求的 线程;

        #endregion Fields

        #region Methods

        // 发送消息
        public void btnSend(object sender, string ip, MyMessage Mmsg)
        {
            string strMsg = "服务器  -->" + Mmsg.msg ;

            byte[] arrMsg = Encoding.UTF8.GetBytes(JsonHelper.ToJson(Mmsg));

            string strKey = "";
            for (int i = 0; i < dictip.Count; i++)
            {
                if (dictip[i].ip == ip)
                    strKey = dictip[i].StrRemoteEndPoint;
            }

            if (string.IsNullOrEmpty(strKey))   // 判断是不是选择了发送的对象;
            {
                md.DoShowMSGFunc(sender, "请选择你要发送的Ip!!!");
            }
            else
            {
                dict[strKey].Send(arrMsg);// 解决了 sokConnection是局部变量,不能再本函数中引用的问题;
                md.DoShowMSGFunc(sender, strMsg);
            }
        }
コード例 #2
0
ファイル: SocketServer.cs プロジェクト: ypfly/SocketServer
        void RecMsg(object a)
        {
            object[] aa = (object[])a;
            Socket sokClient = aa[0] as Socket;
            object sender = (object)aa[1];
            while (true)
            {
                // 定义一个2M的缓存区;
                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
                // 将接受到的数据存入到输入  arrMsgRec中;
                int length = -1;
                try
                {
                    length = sokClient.Receive(arrMsgRec); // 接收数据,并返回数据的长度;
                }
                catch (SocketException se)
                {
                    md.DoShowMSGFunc(aa[1], "异常:" + se.Message);

                    // 从 通信套接字 集合中删除被中断连接的通信套接字;
                    dict.Remove(sokClient.RemoteEndPoint.ToString());
                    // 从通信线程集合中删除被中断连接的通信线程对象;
                    dictThread.Remove(sokClient.RemoteEndPoint.ToString());
                    // 从列表中移除被中断的连接IP
                    for (int i = 0; i < dictip.Count; i++)
                    {
                        if (dictip[i].StrRemoteEndPoint == sokClient.RemoteEndPoint.ToString())
                        {
                            dictip.RemoveAt(i);
                        }
                    }
                    //dictip.RemoveAt(sokClient.RemoteEndPoint.ToString());
                    break;
                }
                catch (Exception e)
                {
                    md.DoShowMSGFunc(sender, "异常:" + e.Message);
                    // 从 通信套接字 集合中删除被中断连接的通信套接字;
                    dict.Remove(sokClient.RemoteEndPoint.ToString());
                    // 从通信线程集合中删除被中断连接的通信线程对象;
                    dictThread.Remove(sokClient.RemoteEndPoint.ToString());
                    // 从列表中移除被中断的连接IP
                    dict.Remove(sokClient.RemoteEndPoint.ToString());
                    break;
                }

                MyMessage mmsg = new MyMessage();
                mmsg = JsonHelper.DeserializeJsonToObject<MyMessage>(Encoding.UTF8.GetString(arrMsgRec));

                // 将接受到的数据存入到输入  arrMsgRec中;
                if (mmsg == null)
                {
                    md.DoShowMSGFunc(sender, "异常:没有获取到数据");
                    return;
                }

                if (mmsg.id == "0") // 表示接收到的是消息数据;
                {
                    string sip = sokClient.RemoteEndPoint.ToString();
                    md.DoShowMSGFunc(sender, sip.Substring(0, sip.IndexOf(":")) + ":" + mmsg.msg);
                }

                //if (arrMsgRec[0] == 1) // 表示接收到的是文件;
                //{
                //    SaveFileDialog sfd = new SaveFileDialog();

                //    if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                //    {// 在上边的 sfd.ShowDialog() 的括号里边一定要加上 this 否则就不会弹出 另存为 的对话框,而弹出的是本类的其他窗口,,这个一定要注意!!!【解释:加了this的sfd.ShowDialog(this),“另存为”窗口的指针才能被SaveFileDialog的对象调用,若不加thisSaveFileDialog 的对象调用的是本类的其他窗口了,当然不弹出“另存为”窗口。】

                //        string fileSavePath = sfd.FileName;// 获得文件保存的路径;
                //        // 创建文件流,然后根据路径创建文件;
                //        using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
                //        {
                //            fs.Write(arrMsgRec, 1, length - 1);
                //            ShowMsg("文件保存成功:" + fileSavePath);
                //        }
                //    }
                //}
            }
        }