/** * 关闭 * 等待数据完成关闭,shutdown取代 */ public void Close() { isClose = true; //不能真实关闭 if (sendLen == 0) { Stop(); Console.WriteLine("物理关闭socket"); } else { //有过发送数据则缓冲 //SocketManager.getInstance().add(socket); if (closeThread == null) { closeThread = new Thread(() => { int num = 0; while (true) { if (socket.GetSender().IsSenderEmpty()) { Stop(); break; } else { Thread.Sleep(100); num++; if (waitClose <= num * 100) { Stop(); break; } } } }); closeThread.IsBackground = true; closeThread.Name = "closeThread"; } if (!closeThread.IsAlive) { closeThread.Start(); } } }
public void Run() { try { FlashLogger.Info("Handling request from " + socket.GetSession().Destination); UDTInputStream intStream = socket.GetInputStream(); UDTOutputStream outStream = socket.GetOutputStream(); byte[] readBuf = new byte[32768]; //read file name info while (intStream.Read(readBuf) == 0) { Thread.Sleep(100); } //how many bytes to read for the file name byte[] len = new byte[4]; //bb.get(len); Array.Copy(readBuf, 0, len, 0, 4);//文件名称长度 if (verbose) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < len.Length; i++) { sb.Append((len[i]).ToString()); sb.Append(" "); } Console.WriteLine("[SendFile] name length data: " + sb.ToString()); } long length = Decode(len, 0); if (verbose) { Console.WriteLine("[SendFile] name length : " + length); } byte[] fileName = new byte[(int)length]; //读取文件名称 Array.Copy(readBuf, 4, fileName, 0, fileName.Length); FileInfo file = new FileInfo(Encoding.UTF8.GetString(fileName));//兼容java Console.WriteLine("[SendFile] File requested: '" + file.FullName + "'"); FileStream fis = null; try { long size = file.Length; Console.WriteLine("[SendFile] File size: " + size); //send size info outStream.Write(Encode64(size)); //先写入大小 outStream.Flush(); //传输完成 long start = DateTime.Now.Ticks; fis = new FileStream(file.FullName, FileMode.Open); CopyFile(fis, outStream, size, false); Console.WriteLine("[SendFile] Finished sending data."); long end = DateTime.Now.Ticks; Console.WriteLine(socket.GetSession().Statistics.toString()); double rate = 1000.0 * size / 1024 / 1024 / (end - start); Console.WriteLine("[SendFile] Rate: " + rate.ToString(format) + " MBytes/sec. " + (8 * rate).ToString(format) + " MBit/sec."); } finally { socket.GetSender().Stop(); if (fis != null) { fis.Close(); } } FlashLogger.Info("Finished request from " + socket.GetSession().Destination); } catch (Exception ex) { FlashLogger.Error(ex.Message); } }