Exemple #1
0
        public void StartTask(FileTransportTask task) //Sender
        {
            if (task == null)
            {
                throw new ArgumentNullException("task");
            }
            if (task.State != FileTransportState.Waiting)
            {
                throw new ArgumentException();
            }
            Tasks.Add(task);
            var t = new Task(() =>
            {
                #region Daten verkleinern nur ohne Datasets
                if (CompressBytes && task.DatasetCount == 0)
                {
                    task.State = FileTransportState.CompressBytes;
                    using (var m = new MemoryStream())
                        using (var comp = new DeflateStream(m, CompressionMode.Compress))
                            using (var r = new BinaryReader(m))
                                using (var w = new BinaryWriter(comp))
                                {
                                    w.Write(task.Data);
                                    m.Position           = 0;
                                    task.CompressedBytes = r.ReadBytes((int)m.Length);
                                }
                }
                else
                {
                    task.CompressedBytes = task.Data;
                }
                task.Size = task.CompressedBytes.Length;
                #endregion
                //Verbinden
                task.State     = FileTransportState.WaitForLocalConnector;
                Connection con = null;
                if (Role == ServerClientRole.Server)
                {
                    con = FindEmptyConnection();
                    while (con == null)
                    {
                        System.Threading.Thread.Sleep(10);
                        con = FindEmptyConnection();
                    }
                    SetUsedState(con, true);
                    task.Connection = con;
                }
                task.State = FileTransportState.ConnectToServer;
                Action act = null;
                act        = new Action(() =>
                {
                    if (task.State == FileTransportState.Transport && task.TransportedBytes == 0)
                    {
                        TcpClient tcp      = null;
                        TcpListener server = null;
                        if (Role == ServerClientRole.Server)
                        {
                            server = new TcpListener(IPAddress.Any, con.Port);
                            server.Start();
                            tcp = server.AcceptTcpClient();
                            server.Stop();
                            server = null;
                        }
                        else
                        {
                            tcp = new System.Net.Sockets.TcpClient();
                            tcp.Connect(new System.Net.IPEndPoint(System.Net.IPAddress.Parse(task.Connection.Target), task.Connection.Port));
                        }

                        var stream = tcp.GetStream();

                        if (task.DatasetCount == 0)
                        {
                            var offset = 0;
                            while (offset < task.CompressedBytes.Length)
                            {
                                stream.Write(task.CompressedBytes, offset, Math.Min(task.CompressedBytes.Length - offset, tcp.SendBufferSize));
                                System.Threading.Thread.Sleep(1);
                                offset += tcp.SendBufferSize;
                                task.TransportedBytes = Math.Min(task.CompressedBytes.Length, offset);
                                task.OnServerStateUpdated();
                            }
                        }
                        else
                        {
                            for (task.CurrentDataset = 0; task.CurrentDataset < task.DatasetCount; ++task.CurrentDataset)
                            {
                                var bytes      = task.OnGetDatasetData(task.CurrentDataset);
                                var datalength = BitConverter.GetBytes(bytes.Length);
                                stream.Write(datalength, 0, datalength.Length);
                                var offset            = 0;
                                task.Size             = bytes.Length;
                                task.TransportedBytes = 0;
                                while (offset < bytes.Length)
                                {
                                    if (!tcp.Connected)
                                    {
                                        break;
                                    }
                                    stream.Write(bytes, offset, Math.Min(bytes.Length - offset, tcp.SendBufferSize));
                                    System.Threading.Thread.Sleep(1);
                                    offset += tcp.SendBufferSize;
                                    task.TransportedBytes = Math.Min(bytes.Length, offset);
                                    task.OnServerStateUpdated();
                                }
                                if (!tcp.Connected)
                                {
                                    break;
                                }
                            }
                        }

                        tcp.Close();
                        task.State = FileTransportState.Finished;
                        Tasks.Remove(task);
                        task.OnServerStateUpdated();
                        task.ServerStateUpdated -= act;
                        if (con != null)
                        {
                            SetUsedState(con, false);
                        }
                    }
                });
                task.ServerStateUpdated += act;
                var mes         = new PrimaryMessage();
                var ftd         = new FileTransportData();
                ftd.TransportID = task.ID;
                ftd.SenderID    = Manager.CurrentId.Id;
                ftd.Type        = FileTransportType.WantSendFile;
                ftd.Size        = task.Size;
                ftd.Datasets    = task.DatasetCount;
                ftd.Connection  = task.Connection;
                mes.ClientData.SetSerializeAble(ftd);
                mes.MessageType            = PrimaryMessageType.FileTransportServerToClient;
                mes.MessageRoot.Connection = task.TargetUser.DefaultConnection;
                mes.MessageRoot.Connector  = task.TargetUser.DefaultConnector;
                mes.MessageRoot.RemoteId   = task.TargetUser.Id;
                Manager.SendMessage(mes);
            });

            t.Start();
        }