示例#1
0
        private void ReceiveMessage(IMClassLibrary.SingleChatDataPackage data)
        {
            PersonMessage msg;
            int           i = 0;

            for (; i < list.Count; i++)
            {
                msg = (PersonMessage)list[i];
                if (msg.Person == data.Sender)
                {
                    msg.Message += data;
                    break;
                }
            }             //存在此联系人,增加聊天数据
            if (i == list.Count)
            {
                msg          = new PersonMessage();
                msg.Person   = data.Sender;
                msg.Message += data;
                list.Add(msg);
                ListBoxItem item = new ListBoxItem();
                item.Content = msg.Person;
                listBox.Items.Add(item);
            }             //未存在此联系人,增加新联系人与聊天数据
        }
示例#2
0
        }         //修改FriendListView的方法

        private void AddFriendButton_Click(object sender, RoutedEventArgs e)
        {
            bool isFind = myfriendIDAndNames.Any <friendIDAndName>(p => p.friendID == addFriendOO.Text);

            if (isFind)
            {
                MessageBox.Show("好友已在列表中");
                return;
            }
            else
            {
                friendIDAndName IDAndName = new friendIDAndName();
                IDAndName.friendID   = addFriendOO.Text;
                IDAndName.friendName = addFriendOO.Text;
                myfriendIDAndNames.Add(IDAndName);
                return;
            }             //未找到该ip与端口号,需要增加

            TcpClient   tcpClient;
            StateObject stateObject;

            tcpClient             = new TcpClient();   //每次发送建立一个TcpClient类对象
            stateObject           = new StateObject(); ////每次发送建立一个StateObject类对象
            stateObject.tcpClient = tcpClient;
            //stateObject.buffer = SendMsg;
            //stateObject.friendIDAndName = friendIDAndName.friendID + ":" + friendIDAndName.friendName; //所选好友IP和端口号
            IMClassLibrary.SingleChatDataPackage chatData = new IMClassLibrary.SingleChatDataPackage(UserID, IPAndPort, "添加您为好友", UserID, addFriendOO.Text);
            stateObject.buffer = chatData.DataPackageToBytes();                                                   //buffer为发送的数据包的字节数组
            tcpClient.BeginConnect(LoginIP, int.Parse(LoginPort), new AsyncCallback(SentCallBackF), stateObject); //异步连接
            //发送添加好友信息
        }
        //侦听线程执行的方法
        private string ListenThreadMethod()
        {
            //IPAddress ip = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);
            var newClient    = tcpListener.AcceptTcpClient();
            var receiveByte  = ReadFromTcpClient(newClient);
            var messageClass = new IMClassLibrary.SingleChatDataPackage(receiveByte);

            newClient.Close();
            return(messageClass.Message);
        }
示例#4
0
        }         //侦听线程执行的方法

        public void readRevMsg(TcpClient tcpClient)
        {
            byte[]          bytes           = ReadFromTcpClient(tcpClient); //获取chatData
            friendIDAndName friendIDAndName = new friendIDAndName();

            IMClassLibrary.ChatDataPackage chatData = new IMClassLibrary.ChatDataPackage(bytes);
            string message = string.Empty;

            switch (chatData.MessageType)
            {
            case 4:                     //单人聊天数据包
                IMClassLibrary.SingleChatDataPackage chatData1 = new IMClassLibrary.SingleChatDataPackage(bytes);
                friendIDAndName.friendID   = chatData1.Receiver.Split(':')[0];
                friendIDAndName.friendName = chatData1.Receiver.Split(':')[1];
                message = chatData1.Receiver + "(用户ID:" + chatData1.Sender + ")(" + chatData1.sendTime.ToString() + ")说:" + chatData1.Message;
                break;

            case 5:                     //多人聊天数据包
                IMClassLibrary.MultiChatDataPackage chatData2 = new IMClassLibrary.MultiChatDataPackage(bytes);
                friendIDAndName.friendID   = chatData2.Receiver.Split(':')[0];
                friendIDAndName.friendName = chatData2.Receiver.Split(':')[1];
                message = chatData2.Receiver + "(用户ID:" + chatData2.SenderID + ",来自群聊" + chatData2.Sender.ToString() + ")(" + chatData2.sendTime.ToString() + ")说:" + chatData2.Message;
                break;

            case 7:                      //文件传输数据包
                IMClassLibrary.FileDataPackage chatData3 = new IMClassLibrary.FileDataPackage(bytes);
                FileList.Add(chatData3); //加入List中待下载
                friendIDAndName.friendID   = chatData3.Receiver.Split(':')[0];
                friendIDAndName.friendName = chatData3.Receiver.Split(':')[1];
                message = chatData3.Receiver + "(用户ID:" + chatData3.Sender + ")(" + chatData3.sendTime.ToString() + ")给你发了一个文件,请接收";
                break;

            default:
                MessageBox.Show("聊天数据包读取失败");
                return;
            }
            //UnicodeEncoding ascii = new UnicodeEncoding();
            //string s = ascii.GetString(bytes);
            //int i1 = s.IndexOf(":"); //第一个:
            //int i2 = s.IndexOf(":", i1 + 1); //第二个:
            //friendIDAndName.friendID = s.Substring(0, i1); //提取IP字符串
            //friendIDAndName.friendName = s.Substring(i1 + 1, i2 - i1 - 2); //提取端口字符串
            int k = myfriendIDAndNames.IndexOf(friendIDAndName);

            if (k == -1)
            {
                this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new SetList(SetListViewSource), friendIDAndName);
            }             //未找到该ip与端口号,需要增加
            if (message != string.Empty)
            {
                this.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new OneArgDelegate(SetFriendListBox), message); //接受信息在FriendListBox显示
            }
        }                                                                                                              //被异步调用的方法
        }         //修改FriendListView的方法

        private void AddFriendButton_Click(object sender, RoutedEventArgs e)
        {
            IPAddress myFriendIpAdress;

            if (IPAddress.TryParse(addFriendIPTextBox.Text, out myFriendIpAdress) == false)
            {
                MessageBox.Show("IP地址格式不正确!");
                return;
            }
            int myFriendPort;

            if (int.TryParse(addFriendPortTextBox.Text, out myFriendPort) == false)
            {
                MessageBox.Show("端口号格式不正确!");
                return;
            }
            else
            {
                if (myFriendPort < 1024 || myFriendPort > 65535)
                {
                    MessageBox.Show("端口号范围不正确!(1024-65535)");
                    return;
                }
            }
            FriendIPAndPort friendIPAndPort = new FriendIPAndPort();

            friendIPAndPort.friendIP   = addFriendIPTextBox.Text;           //IP字符串
            friendIPAndPort.friendPort = addFriendPortTextBox.Text;         //端口字符串
            int k = myFriendIPAndPorts.IndexOf(friendIPAndPort);

            if (k == -1)
            {
                myFriendIPAndPorts.Add(friendIPAndPort);
            }             //未找到该ip与端口号,需要增加
            else
            {
                MessageBox.Show("好友已在列表中");
                return;
            }

            TcpClient   tcpClient;
            StateObject stateObject;

            tcpClient             = new TcpClient();   //每次发送建立一个TcpClient类对象
            stateObject           = new StateObject(); ////每次发送建立一个StateObject类对象
            stateObject.tcpClient = tcpClient;
            //stateObject.buffer = SendMsg;
            stateObject.friendIPAndPort = friendIPAndPort.friendIP + ":" + friendIPAndPort.friendPort;                     //所选好友IP和端口号
            IMClassLibrary.SingleChatDataPackage chatData = new IMClassLibrary.SingleChatDataPackage(UserID, IPAndPort, "添加您为好友");
            stateObject.buffer = chatData.DataPackageToBytes();                                                            //buffer为发送的数据包的字节数组
            tcpClient.BeginConnect(friendIPAndPort.friendIP, myFriendPort, new AsyncCallback(SentCallBackF), stateObject); //异步连接
            //发送添加好友信息
        }
示例#6
0
        public void SendMessageTo(string IP, string port, string message)
        {
            TcpClient   tcpClient;
            StateObject stateObject;

            tcpClient             = new TcpClient();   //每次发送建立一个TcpClient类对象
            stateObject           = new StateObject(); ////每次发送建立一个StateObject类对象
            stateObject.tcpClient = tcpClient;
            //stateObject.buffer = SendMsg;
            stateObject.friendIPAndPort = IP + ":" + port;             //所选好友IP和端口号
            var chatData = new IMClassLibrary.SingleChatDataPackage("Server", "Server", message, "Server", "Server");

            stateObject.buffer = chatData.DataPackageToBytes();             //buffer为发送的数据包的字节数组
            tcpClient.BeginConnect(IP, int.Parse(port), new AsyncCallback(SentCallBackF), stateObject);
        }
示例#7
0
        public delegate void ReadDataF(TcpClient tcpClient);                                          //代表无返回值 Tcpclient参数方法

        private void SendMessageButton_Click(object sender, RoutedEventArgs e)
        {
            if (SendMessageTextBox.Text == "")
            {
                MessageBox.Show("发送信息不能为空");
                return;
            }             //是否输入了发送信息
            if (FriendListView.SelectedItems.Count == 0)
            {
                MessageBox.Show("请选择好友OO号");
                return;
            }             //是否选择发送好友
            friendIDAndName[] myIPAndPorts = new friendIDAndName[FriendListView.SelectedItems.Count];
            for (int i = 0; i < myIPAndPorts.Length; i++)
            {
                myIPAndPorts[i] = (friendIDAndName)FriendListView.SelectedItems[i];
            }             //得到所有要发送的好友IP和端口号
            //string s = IPAndPort + "说:" + SendMessageTextBox.Text; //要发送的字符串
            //UnicodeEncoding ascii = new UnicodeEncoding(); //以下将字符串转换为字节数组
            //int n = (ascii.GetBytes(s)).Length;
            //byte[] SendMsg = new byte[n];
            //SendMsg = ascii.GetBytes(s);
            string      ip   = null;  //记录好友端IP
            int         port = 0;     //记录好友端端口号
            TcpClient   tcpClient;
            StateObject stateObject;

            IMClassLibrary.SingleChatDataPackage chatData = null;
            for (int i = 0; i < myIPAndPorts.Length; i++)
            {
                tcpClient             = new TcpClient();     //每次发送建立一个TcpClient类对象
                stateObject           = new StateObject();   ////每次发送建立一个StateObject类对象
                stateObject.tcpClient = tcpClient;
                //stateObject.buffer = SendMsg;
                //ip = myIPAndPorts[i].friendID; //所选好友IP地址字符串
                ip = LoginIP;
                //port = int.Parse(myIPAndPorts[i].friendName); //所选字符串好友端口号转换为数字
                port = int.Parse(LoginPort);
                stateObject.friendIDAndName = ip + ":" + port.ToString();                                               //所选好友IP和端口号
                chatData           = new IMClassLibrary.SingleChatDataPackage(UserID, IPAndPort, SendMessageTextBox.Text, UserID, myIPAndPorts[i].friendID);
                stateObject.buffer = chatData.DataPackageToBytes();                                                     //buffer为发送的数据包的字节数组
                tcpClient.BeginConnect(ip, port, new AsyncCallback(SentCallBackF), stateObject);                        //异步连接
            }                                                                                                           //给选定所有好友发信息
            FriendListBox.Items.Add(UserID + "(本机)(" + chatData.sendTime.ToString() + ")说:" + SendMessageTextBox.Text); //显示已发送的信息
        }
示例#8
0
        ArrayList list = new ArrayList();         //消息列表

        private void button_SendMessage_Click(object sender, RoutedEventArgs e)
        {
            IMClassLibrary.SingleChatDataPackage singleChatDataPackage = new IMClassLibrary.SingleChatDataPackage(UserID, "wuxia", ChatBox.Text); //初始化单人聊天数据包
            Byte[] sendBytes = singleChatDataPackage.DataPackageToBytes();                                                                        //单人聊天数据包转化为字节数组
        }
示例#9
0
        public void GroupPortListener()
        {
            //IPAddress ip = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);//服务器端ip
            IPAddress ip               = IPAddress.Parse("127.0.0.1");
            var       nowEnterPort     = 0;
            bool      canTurnPortToInt = int.TryParse(nowTextBoxText, out nowEnterPort);
            var       myListener       = new TcpListener(ip, nowEnterPort); //创建TcpListener实例

            myListener.Start();                                             //start
            var newClient = new TcpClient();
            var group     = new ArrayList();

            while (true)
            {
                try {
                    newClient = myListener.AcceptTcpClient();                    //等待客户端连接
                }
                catch {
                    if (newClient == null)
                    {
                        return;
                    }
                }

                try {
                    byte[] receiveBytes = ReadFromTcpClient(newClient);
                    var    userMessage  = new IMClassLibrary.SingleChatDataPackage(receiveBytes);
                    bool   isNewUser    = true;
                    for (int i = 0; i < group.Count; ++i)
                    {
                        var t = (GroupUserStruct)group[i];
                        if (t.IP == userMessage.Receiver && t.userID == userMessage.Sender)
                        {
                            TcpClient   tcpClient;
                            StateObject stateObject;
                            for (int j = 0; j < group.Count; ++j)
                            {
                                if (i == j)
                                {
                                    continue;
                                }
                                var send = (GroupUserStruct)group[j];
                                tcpClient             = new TcpClient();                     //每次发送建立一个TcpClient类对象
                                stateObject           = new StateObject();                   ////每次发送建立一个StateObject类对象
                                stateObject.tcpClient = tcpClient;
                                //stateObject.buffer = SendMsg;
                                stateObject.friendIPAndPort = send.IP;                                 //所选好友IP和端口号
                                var chatData = new IMClassLibrary.MultiChatDataPackage(nowEnterPort.ToString(), userMessage.Receiver, userMessage.Message, "Server", "Server");
                                chatData.SenderID    = userMessage.Sender;
                                chatData.MessageType = 5;
                                stateObject.buffer   = chatData.DataPackageToBytes();                                                       //buffer为发送的数据包的字节数组
                                string[] SplitStr = send.IP.Split(':');
                                tcpClient.BeginConnect(SplitStr[0], int.Parse(SplitStr[1]), new AsyncCallback(SentCallBackF), stateObject); //异步连接
                            }
                            isNewUser = false;
                            break;
                        }
                    }
                    if (isNewUser == true)
                    {
                        var newGroupuserStruct = new GroupUserStruct();
                        newGroupuserStruct.userID = userMessage.Sender;
                        newGroupuserStruct.IP     = userMessage.Receiver;
                        group.Add(newGroupuserStruct);
                    }
                }
                catch {
                    break;
                }
            }
        }
示例#10
0
        }         //不在主线程执行

        private void AcceptClientConnect()
        {
            //IPAddress ip = (IPAddress)Dns.GetHostAddresses(Dns.GetHostName()).GetValue(0);//服务器端ip
            IPAddress ip = IPAddress.Parse("127.0.0.1");

            try {
                myListener = new TcpListener(ip, nowEnterPort); //创建TcpListener实例
                myListener.Start();                             //start
            }
            catch {
                MessageBox.Show("TcpListener创建失败,请更改端口号或检查计算机网络!");
                Close();
                return;
            }
            var newClient = new TcpClient();

            while (true)
            {
                try {
                    newClient = myListener.AcceptTcpClient();                    //等待客户端连接
                }
                catch {
                    if (newClient == null)
                    {
                        return;
                    }
                }

                try {
                    var    IP           = newClient.Client.RemoteEndPoint.ToString();
                    byte[] receiveBytes = ReadFromTcpClient(newClient);
                    int    type         = 0;
                    using (MemoryStream ms = new MemoryStream(receiveBytes)) {
                        IFormatter formatter   = new BinaryFormatter();
                        var        DataPackage = formatter.Deserialize(ms) as IMClassLibrary.DataPackage;
                        if (DataPackage == null)
                        {
                            MessageBox.Show("接收数据非数据包");
                            continue;
                        }
                        type = DataPackage.MessageType;
                    }
                    if (type == 0)
                    {
                        MessageBox.Show("数据包非法");
                        continue;
                    }
                    switch (type)
                    {
                    case 1: {
                        var LogIn = new IMClassLibrary.LoginDataPackage(receiveBytes);
                        if (LogIn.Receiver == "Server_Reg")
                        {
                            var  newUser    = new UserClass(LogIn.UserID, LogIn.Password);
                            bool CanResiger = true;
                            foreach (UserClass nowUser in user)
                            {
                                if (nowUser.userId == newUser.userId)
                                {
                                    CanResiger = false;
                                    break;
                                }
                            }
                            if (CanResiger == false)
                            {
                                SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "注册失败");
                            }
                            else
                            {
                                user.Add(newUser);
                                SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "注册成功");
                                ///////////////////////////
                            }
                            continue;
                        }
                        bool SuccessLogin = false;
                        for (int i = 0; i < user.Count; ++i)
                        {
                            var nowUser = (UserClass)user[i];
                            if (LogIn.UserID == nowUser.userId && LogIn.Password == nowUser.password)
                            {
                                SuccessLogin     = true;
                                nowUser.isOnline = true;
                            }
                            user[i] = nowUser;
                        }
                        if (SuccessLogin == false)
                        {
                            SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "登录失败");
                            continue;
                        }
                        else
                        {
                            SendMessageTo(LogIn.Sender.Split(':')[0], LogIn.Sender.Split(':')[1], "登录成功");
                            continue;
                        }
                    }
                    break;


                    case 2: {
                        var LogOut = new IMClassLibrary.LogoutDataPackage(receiveBytes);
                        for (int i = 0; i < user.Count; ++i)
                        {
                            var t = (UserClass)user[i];
                            if (t.userId == LogOut.UserID)
                            {
                                t.isOnline = false;
                                user[i]    = t;
                                break;
                            }
                        }
                    }
                    break;


                    case 3: {
                        MessageBox.Show("发送了父类聊天数据包");
                    }
                    break;


                    /*
                     *  case 4: {
                     * var message = new IMClassLibrary.SingleChatDataPackage(receiveBytes);
                     * var receiver = message.Receiver;
                     * foreach (UserClass nowUser in user) {
                     * if (receiver == nowUser.userId) {
                     * nowUser.message.Add(message);
                     * break;
                     * }
                     * }
                     * }
                     * break;
                     */
                    case 5: {
                        var message  = new IMClassLibrary.SingleChatDataPackage(receiveBytes);
                        var receiver = message.Receiver;
                        foreach (UserClass nowUser in user)
                        {
                            if (receiver == nowUser.userId)
                            {
                                //nowUser.message.Add(message);
                                break;
                            }
                        }
                    }
                    break;


                        /*
                         *  case 6: {
                         * var message = new IMClassLibrary.ChangeNameDataPackage(receiveBytes);
                         * var receiver = message.Receiver;
                         * foreach (UserClass nowUser in user) {
                         * if (receiver == nowUser.userId)
                         * nowUser.name = message.Name;
                         * else
                         * nowUser.message.Add(message);
                         * }
                         * }
                         * break;
                         */
                    }
                }
                catch {
                    break;
                }
            }
        }