예제 #1
0
        }             //Main

        void TCPListen()
        {
            try {
                TCP.Start();

                while (true)
                {
                    TcpClient Client = TCP.AcceptTcpClient();

                    //Program.ConsoleWriteLine(Client.Client.RemoteEndPoint.ToString() + " Connecting", Color.GreenYellow, Color.Black);

                    Client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

                    var ClientStream = Client.GetStream();

                    if (this.EnableAudio == false)
                    {
                        SCMessage message = new SCMessage {
                            MessageType = SCMessageType.Send_Client_Connection_Info, UDP_Video_Port = 1
                        };

                        var bytes = SCMessage.SerializeJSON_ToBytes(message);

                        ClientStream.Write(bytes, 0, bytes.Length);
                    }//if
                    else
                    {
                        SCMessage message = new SCMessage {
                            MessageType = SCMessageType.Send_Client_Connection_Info, UDP_Video_Port = 1, UDP_Audio_Port = 1
                        };

                        var bytes = SCMessage.SerializeJSON_ToBytes(message);

                        ClientStream.Write(bytes, 0, bytes.Length);
                    }//else

                    int BytesRead = 0;

                    try {
                        BytesRead = ClientStream.Read(this.MessageBuffer, 0, this.MessageBuffer.Length);

                        var message = SCMessage.DeserializeJSON_FromBytes(this.MessageBuffer, 0, BytesRead);

                        if (message.MessageType == SCMessageType.Send_Client_Connection_Info)
                        {
                            string Password = message.Message;

                            if (this.Password != Password)
                            {
                                SCMessage scmessage = new SCMessage {
                                    MessageType = SCMessageType.Invalid_Password
                                };

                                var bytes = SCMessage.SerializeJSON_ToBytes(scmessage);

                                ClientStream.Write(bytes, 0, bytes.Length);

                                Program.ConsoleWriteLine(Client.Client.RemoteEndPoint.ToString() + " (Invalid Password)", Color.Red, Color.Black);

                                Client.Close();

                                continue;
                            }//if

                            string NickName = message.From;

                            var checkNick = this.Clients.FirstOrDefault(c => c.NickName == NickName);

                            if (checkNick != null)
                            {
                                SCMessage scmessage = new SCMessage {
                                    MessageType = SCMessageType.Invalid_NickName
                                };

                                var bytes = SCMessage.SerializeJSON_ToBytes(scmessage);

                                ClientStream.Write(bytes, 0, bytes.Length);

                                Program.ConsoleWriteLine(Client.Client.RemoteEndPoint.ToString() + " (Invalid NickName)", Color.Red, Color.Black);

                                Client.Close();

                                continue;
                            }//if

                            SCMessage scmessageOK = new SCMessage {
                                MessageType = SCMessageType.Connection_OK, X = Width_X, Y = Height_Y
                            };

                            var bytesOK = SCMessage.SerializeJSON_ToBytes(scmessageOK);

                            ClientStream.Write(bytesOK, 0, bytesOK.Length);

                            BytesRead = ClientStream.Read(this.MessageBuffer, 0, this.MessageBuffer.Length);

                            scmessageOK = SCMessage.DeserializeJSON_FromBytes(this.MessageBuffer, 0, BytesRead);

                            if (scmessageOK.MessageType == SCMessageType.Connection_OK)
                            {
                                Program.ConsoleWriteLine(Client.Client.RemoteEndPoint.ToString() + $" Connected ({NickName})", Color.GreenYellow, Color.Black);

                                int Video_Udp_Port = message.UDP_Video_Port;

                                int Audio_Udp_Port = -1;

                                if (this.EnableAudio)
                                {
                                    Audio_Udp_Port = message.UDP_Audio_Port;
                                }//if

                                this.SendAll_Clients(SCMessage.SerializeJSON_ToBytes(new SCMessage {
                                    Message = NickName, MessageType = SCMessageType.ClientConnected_Message
                                }));

                                AddClientInfo(Client, Video_Udp_Port, Audio_Udp_Port, NickName);
                            }//if
                            else
                            {
                                continue;
                            }
                        }//if
                        else
                        {
                            Disconnect(Client);

                            continue;
                        } //else
                    }     //try
                    catch {
                        Disconnect(Client);

                        continue;
                    }//catch

                    Task.Run(() => {
                        try {
                            this.SendAllClientsOnline(Client);

                            int countRead = 0;

                            SCMessage scmessage = null;

                            byte[] clientMessage = new byte[MessageBufferSIZE];

                            while (true)
                            {
                                countRead = ClientStream.Read(clientMessage, 0, clientMessage.Length);

                                scmessage = SCMessage.DeserializeJSON_FromBytes(clientMessage, 0, countRead);

                                if (scmessage.MessageType == SCMessageType.Mouse_Click)
                                {
                                    MouseClick mouseclick = new MouseClick();

                                    mouseclick.Message = scmessage.From;

                                    mouseclick.X = scmessage.X;

                                    mouseclick.Y = scmessage.Y;

                                    MouseClick.DrawMouseClick(mouseclick);
                                }//if
                                else if (scmessage.MessageType == SCMessageType.PublicMessage)
                                {
                                    Program.ConsoleWriteLine($"{scmessage.From} : {scmessage.Message}", Program.Orange, Color.Black);

                                    var sender = this.Clients.FirstOrDefault(c => c.NickName == scmessage.From);

                                    if (sender != null)
                                    {
                                        this.SendAll_Clients(clientMessage, 0, countRead, sender);
                                    }
                                }//else if
                                else if (scmessage.MessageType == SCMessageType.PrivateMessage)
                                {
                                    var toClient = this.Clients.FirstOrDefault(c => c.NickName == scmessage.To);

                                    if (toClient != null)
                                    {
                                        this.SendTCP(clientMessage, 0, countRead, toClient.Client);
                                    }
                                }//else if
                                else if (scmessage.MessageType == SCMessageType.DeleteFileServer)
                                {
                                    var fname = scmessage.Message;

                                    var NickName_ = scmessage.From;

                                    Task.Run(() => {
                                        while (true)
                                        {
                                            try {
                                                if (File.Exists($"{Program.SV_Directory}/{fname}"))
                                                {
                                                    File.Delete($"{Program.SV_Directory}/{fname}");

                                                    return;
                                                } //if
                                            }     //try
                                            catch {
                                            }     //catch

                                            Thread.Sleep(1000);
                                        }//while
                                    });

                                    scmessage = new SCMessage {
                                        MessageType = SCMessageType.FileDeleted, Message = fname
                                    };

                                    var bytes_ = SCMessage.SerializeJSON_ToBytes(scmessage);

                                    var sender = this.Clients.FirstOrDefault(c => c.NickName == NickName_);

                                    if (sender != null)
                                    {
                                        this.SendAll_Clients(bytes_, 0, bytes_.Length, sender);
                                    }
                                }//else if
                                else if (scmessage.MessageType == SCMessageType.SendFile)
                                {
                                    string NickName_ = scmessage.From;

                                    SCMessage cMessage = new SCMessage {
                                        MessageType = SCMessageType.FileTCP_Port, UDP_Video_Port = this.FileSendTCP_Port
                                    };

                                    var bytes__ = SCMessage.SerializeJSON_ToBytes(cMessage);

                                    ClientStream.Write(bytes__, 0, bytes__.Length);

                                    Task.Run(() => {
                                        TcpClient client = null;

                                        try {
                                            if (!Directory.Exists(Program.SV_Directory))
                                            {
                                                Directory.CreateDirectory(Program.SV_Directory);
                                            }//if

                                            client = this.FileSendTCP.AcceptTcpClient();

                                            var NS = client.GetStream();

                                            var fname = $"{DateTime.Now.Ticks}_{scmessage.Message}";

                                            FileStream fileStream = new FileStream($"{Program.SV_Directory}/{fname}", FileMode.Create, FileAccess.Write);

                                            const long SendSize = 999;

                                            byte[] buffer = new byte[SendSize];

                                            byte[] messagebyffer = new byte[4] {
                                                7, 7, 7, 7
                                            };

                                            NS.Write(messagebyffer, 0, messagebyffer.Length);

                                            var fnameBytes = Encoding.UTF8.GetBytes(fname);

                                            NS.Write(fnameBytes, 0, fnameBytes.Length);

                                            while (true)
                                            {
                                                countRead = NS.Read(buffer, 0, buffer.Length);

                                                if (countRead == 9)
                                                {
                                                    bool error = true;

                                                    for (int j = 0; j < 9; j++)
                                                    {
                                                        if (buffer[j] != 7)
                                                        {
                                                            error = false;

                                                            return;
                                                        } //if
                                                    }     //for

                                                    if (error)
                                                    {
                                                        break;
                                                    }

                                                    fileStream.Write(buffer, 0, countRead);

                                                    NS.Write(messagebyffer, 0, messagebyffer.Length);

                                                    fileStream.Close();

                                                    break;
                                                }//if
                                                else if (countRead < SendSize)
                                                {
                                                    fileStream.Write(buffer, 0, countRead);

                                                    NS.Write(messagebyffer, 0, messagebyffer.Length);

                                                    fileStream.Close();

                                                    break;
                                                }//else if
                                                else
                                                {
                                                    fileStream.Write(buffer, 0, countRead);

                                                    NS.Write(messagebyffer, 0, messagebyffer.Length);
                                                } //else
                                            }     //while

                                            SCMessage sCMessage = new SCMessage {
                                                MessageType = SCMessageType.SendFileName, Message = fname
                                            };

                                            var bytes___ = SCMessage.SerializeJSON_ToBytes(sCMessage);

                                            var sender = this.Clients.FirstOrDefault(c => c.NickName == NickName_);

                                            if (sender != null)
                                            {
                                                this.SendAll_Clients(bytes___, 0, bytes___.Length, sender);
                                            }
                                        }//try
                                        catch (Exception ex) {
                                            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        }//catch

                                        if (client != null)
                                        {
                                            client.Close();
                                        }
                                    });
                                }//else if
                                else if (scmessage.MessageType == SCMessageType.SendFileName)
                                {
                                    if (File.Exists($"{Program.SV_Directory}/{scmessage.Message}") == false)
                                    {
                                        scmessage = new SCMessage {
                                            MessageType = SCMessageType.FileNotFound, Message = scmessage.Message
                                        };

                                        var bytes = SCMessage.SerializeJSON_ToBytes(scmessage);

                                        ClientStream.Write(bytes, 0, bytes.Length);

                                        return;
                                    }//if
                                    else
                                    {
                                        SCMessage cMessage = new SCMessage {
                                            MessageType = SCMessageType.SendFile, UDP_Video_Port = this.FileSendTCP_Port
                                        };

                                        var bytes = SCMessage.SerializeJSON_ToBytes(cMessage);

                                        ClientStream.Write(bytes, 0, bytes.Length);
                                    }//else

                                    Task.Run(() => {
                                        TcpClient client = null;

                                        try {
                                            client = this.FileSendTCP.AcceptTcpClient();

                                            var NS = client.GetStream();

                                            var fname = scmessage.Message;

                                            try {
                                                const long SendSize = 999;

                                                byte[] read = new byte[4];

                                                NS.Read(read, 0, read.Length);

                                                FileStream fileStream = new FileStream($"{Program.SV_Directory}/{fname}", FileMode.Open, FileAccess.Read);

                                                FileInfo fileInfo = new FileInfo($"{Program.SV_Directory}/{fname}");

                                                var countFullSend = (int)(fileInfo.Length / SendSize);

                                                var lastBytes = (int)(fileInfo.Length - (countFullSend * SendSize));

                                                int i = 0;

                                                byte[] buffer = new byte[SendSize];

                                                while (i < countFullSend)
                                                {
                                                    fileStream.Read(buffer, 0, buffer.Length);

                                                    NS.Write(buffer, 0, buffer.Length);

                                                    NS.Read(read, 0, read.Length);

                                                    i++;
                                                }//while

                                                if (lastBytes == 0)
                                                {
                                                    ClientStream.Write(new byte[9] {
                                                        7, 7, 7, 7, 7, 7, 7, 7, 7
                                                    }, 0, 9);
                                                }//if
                                                else
                                                {
                                                    fileStream.Read(buffer, 0, lastBytes);

                                                    NS.Write(buffer, 0, lastBytes);

                                                    NS.Read(read, 0, read.Length);

                                                    fileStream.Close();
                                                } //else
                                            }     //try
                                            catch (Exception ex) {
                                                ClientStream.Write(new byte[9] {
                                                    7, 7, 7, 7, 7, 7, 7, 7, 7
                                                }, 0, 9);

                                                MessageBox.Show(ex.Message, "Send File Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                            } //catch
                                        }     //try
                                        catch (Exception ex) {
                                            MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                        }//catch

                                        if (client != null)
                                        {
                                            client.Close();
                                        }
                                    });
                                } //else if
                            }     //while
                        }         //try
                        catch {
                            Disconnect(Client);

                            return;
                        } //catch
                    });
                }         //while
            }             //try
            catch (Exception ex) {
                //Program.ConsoleWriteLine($"TCP Error: {ex.Message}", Program.Red, Color.Black);
            } //catch
        }     //TCPListen