示例#1
0
        private void ListenCallback(IAsyncResult ar)
        {
            try
            {
                Socket listener = (Socket)ar.AsyncState;
                Socket handler  = listener.EndAccept(ar);
                s = handler;
                byte[] bytes    = new byte[1024 * 5000];
                int    bytesRec = handler.Receive(bytes);
                string currUser = Encoding.UTF8.GetString(bytes, 0, bytesRec);
                connectedUsername = currUser;
                convoDT           = DateTime.Now;

                /* Accept or decline incoming connection request */

                if (!p2p.MainWindow.AppWindow.AcceptRequestBox(currUser))  // if not accepted connection
                {
                    connectionAccepted = false;
                    DataProtocol declineRequest     = new DataProtocol("connectionDeclined", myUsername, "null", new byte[1]);
                    string       jsonDeclineRequest = JsonConvert.SerializeObject(declineRequest);
                    byte[]       msg       = System.Text.Encoding.UTF8.GetBytes(jsonDeclineRequest);
                    int          bytesSent = s.Send(msg);
                    s.Shutdown(SocketShutdown.Both);
                    s.Close();
                    p2p.MainWindow.AppWindow.DisconnectCallback();
                }
                else
                {
                    connectionAccepted = true;
                    HistoryDB.InitConvo(currUser);
                    HistoryDB.AddMessage("New conversation started", convoDT, currUser, "System");
                    p2p.MainWindow.AppWindow.EnableDisconnectButton();
                    p2p.MainWindow.AppWindow.AddMessage("System", "New conversation started", convoDT);
                    DataProtocol acceptRequest     = new DataProtocol("connectionAccepted", myUsername, "null", new byte[1]);
                    string       jsonAcceptRequest = JsonConvert.SerializeObject(acceptRequest);
                    byte[]       msg       = System.Text.Encoding.UTF8.GetBytes(jsonAcceptRequest);
                    int          bytesSent = s.Send(msg);
                }
                String data = null;
                while (connectionAccepted)
                {
                    byte[] rbytes    = new byte[1024 * 5000];
                    int    rbytesRec = handler.Receive(rbytes);
                    if (handler.Connected && rbytesRec != 0)
                    {
                        data = Encoding.UTF8.GetString(rbytes, 0, rbytesRec);
                        DataProtocol responseMessage = JsonConvert.DeserializeObject <DataProtocol>(data);
                        DateTime     timestamp       = DateTime.Now;
                        if (responseMessage.Type == "disconnect")
                        {
                            DataProtocol disconnect     = new DataProtocol("disconnect", myUsername, " disconnected", new byte[1]);
                            string       jsonDisconnect = JsonConvert.SerializeObject(disconnect);
                            byte[]       disconnectMsg  = System.Text.Encoding.UTF8.GetBytes(jsonDisconnect);
                            int          bytesSen       = s.Send(disconnectMsg);
                            HistoryDB.AddMessage(connectedUsername + " disconnected", timestamp, connectedUsername, "System");
                            p2p.MainWindow.AppWindow.AddMessage("System", connectedUsername + " disconnected", convoDT);
                            connectionAccepted = false;
                            s.Shutdown(SocketShutdown.Both);
                            s.Close();
                            p2p.MainWindow.AppWindow.DisconnectCallback();
                        }
                        else if (responseMessage.Type == "Image")
                        {
                            byte[] img = responseMessage.imgByte;
                            HistoryDB.AddImage(img, DateTime.Now, connectedUsername);
                            using (var ms = new System.IO.MemoryStream(img))
                            {
                                var image = new BitmapImage();
                                image.BeginInit();
                                image.CacheOption       = BitmapCacheOption.OnLoad; // here
                                image.StreamSource      = ms;
                                image.DecodePixelHeight = 150;
                                image.DecodePixelWidth  = 150;
                                image.EndInit();
                                image.Freeze();

                                JpegBitmapEncoder encoder       = new JpegBitmapEncoder();
                                string            photolocation = "img.jpg"; //file name
                                encoder.Frames.Add(BitmapFrame.Create((BitmapImage)image));
                                using (var filestream = new FileStream(photolocation, FileMode.Create))
                                    encoder.Save(filestream);
                                p2p.MainWindow.AppWindow.DisplayImg(responseMessage.Username, timestamp, image);
                            }
                        }
                        else
                        {
                            HistoryDB.AddMessage(responseMessage.Message, timestamp, responseMessage.Username, responseMessage.Username);
                            p2p.MainWindow.AppWindow.AddMessage(responseMessage.Username, responseMessage.Message, timestamp);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch (SocketException se)
            {
                connectionAccepted = false;
                s.Shutdown(SocketShutdown.Both);
                s.Close();
                p2p.MainWindow.AppWindow.ConnectionBroken();
                p2p.MainWindow.AppWindow.DisconnectCallback();
            }
        }
示例#2
0
        private void ConnectCallback(IAsyncResult ar)
        {
            try
            {
                Socket connector = (Socket)ar.AsyncState;
                connector.EndConnect(ar);

                byte[] msg       = System.Text.Encoding.UTF8.GetBytes(myUsername);
                int    bytesSent = s.Send(msg);

                byte[]       acceptDecline    = new byte[1024 * 5000];
                int          acceptDeclineRec = connector.Receive(acceptDecline);
                String       data             = Encoding.UTF8.GetString(acceptDecline, 0, acceptDeclineRec);
                DataProtocol response         = JsonConvert.DeserializeObject <DataProtocol>(data);
                if (response.Type == "connectionDeclined")
                {
                    p2p.MainWindow.AppWindow.ShowMessageBoxCLientDecline();
                    connectionAccepted = false;
                    s.Shutdown(SocketShutdown.Both);
                    s.Close();
                    p2p.MainWindow.AppWindow.DisconnectCallback();
                    return;
                }
                else
                {
                    connectionAccepted = true;
                    HistoryDB.InitConvo(response.Username);
                    connectedUsername = response.Username;
                    convoDT           = DateTime.Now;
                    HistoryDB.AddMessage("New conversation started", convoDT, response.Username, "System");
                    p2p.MainWindow.AppWindow.AddMessage("System", "New conversation started", convoDT);
                    p2p.MainWindow.AppWindow.AcceptedRequest(response.Username);
                }
                while (connectionAccepted)
                {
                    byte[] bytes    = new byte[1024 * 5000];
                    int    bytesRec = connector.Receive(bytes);
                    if (connector.Connected && bytesRec != 0)
                    {
                        data = Encoding.UTF8.GetString(bytes, 0, bytesRec);
                        DataProtocol responseMessage = JsonConvert.DeserializeObject <DataProtocol>(data);
                        DateTime     timestamp       = DateTime.Now;

                        if (responseMessage.Type == "disconnect")
                        {
                            DataProtocol disconnect     = new DataProtocol("disconnect", myUsername, " disconnected", new byte[1]);
                            string       jsonDisconnect = JsonConvert.SerializeObject(disconnect);
                            byte[]       disconnectMsg  = System.Text.Encoding.UTF8.GetBytes(jsonDisconnect);
                            HistoryDB.AddMessage(connectedUsername + " disconnected", timestamp, connectedUsername, connectedUsername);
                            p2p.MainWindow.AppWindow.AddMessage("System", connectedUsername + " disconnected", convoDT);
                            int byteSent = s.Send(disconnectMsg);
                            connectionAccepted = false;
                            s.Shutdown(SocketShutdown.Both);
                            s.Close();
                            p2p.MainWindow.AppWindow.DisconnectCallback();
                        }

                        else if (responseMessage.Type == "Image")
                        {
                            byte[] img = responseMessage.imgByte;

                            HistoryDB.AddImage(img, DateTime.Now, connectedUsername);

                            using (var ms = new System.IO.MemoryStream(img))
                            {
                                var image = new BitmapImage();
                                image.BeginInit();
                                image.CacheOption       = BitmapCacheOption.OnLoad; // here
                                image.StreamSource      = ms;
                                image.DecodePixelHeight = 150;
                                image.DecodePixelWidth  = 150;
                                image.EndInit();
                                image.Freeze();

                                JpegBitmapEncoder encoder       = new JpegBitmapEncoder();
                                string            photolocation = "tmper.jpg"; //file name
                                encoder.Frames.Add(BitmapFrame.Create((BitmapImage)image));
                                using (var filestream = new FileStream(photolocation, FileMode.Create))
                                    encoder.Save(filestream);
                                p2p.MainWindow.AppWindow.DisplayImg(responseMessage.Username, timestamp, image);
                            }
                        }
                        else
                        {
                            HistoryDB.AddMessage(responseMessage.Message, timestamp, responseMessage.Username, responseMessage.Username);
                            p2p.MainWindow.AppWindow.AddMessage(responseMessage.Username, responseMessage.Message, timestamp);
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch (SocketException se)
            {
                if (connectionAccepted)
                {
                    connectionAccepted = false;
                    s.Shutdown(SocketShutdown.Both);
                    s.Close();
                    p2p.MainWindow.AppWindow.ConnectionBroken();
                }
                else
                {
                    p2p.MainWindow.AppWindow.ShowMessage("There is no friend listening on that port!");
                    p2p.MainWindow.AppWindow.DisconnectCallback();
                }
            }
        }