private static void SendToClient(object sockfile) { SocketAndFileName sf = (SocketAndFileName)sockfile; try { SendFile(sf.Socket, sf.FileName, sf.BreakPoint); } catch (System.Net.Sockets.SocketException es) { if (es.ErrorCode == 10054) { Log("客户端断开", es); } else if (es.ErrorCode == 10053) { Log("服务器主动断开", es); } else { Log("SocketException", es); } } catch (Exception e) { if (e.GetType().FullName != "System.ObjectDisposedException") { Log("Socket已经被销毁", e); } else { Log("其它异常", e); } } finally { sf.Socket.Close(); //sf.Socket.Dispose(); } }
/// <summary> /// 开始文件下载服务(在服务器端) /// </summary> /// <param name="ip"></param> /// <param name="port"></param> /// <param name="maxConnectCount"></param> public static void StartDownloadServer(string ip, int port, int maxConnectCount = 255) { TcpListener serverListener = null; try { //构建监听器 serverListener = new TcpListener(IPAddress.Parse(ip), port); serverListener.Start(maxConnectCount); stopServer = false; //监听客户连线请求 while (!stopServer) { Socket socket = serverListener.AcceptSocket(); //有客户请求连接 if (socket == null) { continue; } byte[] buffer = new Byte[socket.ReceiveBufferSize]; int i = socket.Receive(buffer); //接收请求数据. if (i <= 0) { continue; } if (i > 4) { byte[] lenBytes = new byte[4]; for (int j = 0; j < 4; j++) { lenBytes[j] = buffer[j]; } byte[] file = new byte[i - 4]; for (int j = 0; j < i - 4; j++) { file[j] = buffer[j + 4]; } int breakPoint = BitConverter.ToInt32(lenBytes, 0); string filename = Byte2Str(file); SocketAndFileName sf = new SocketAndFileName(); sf.Socket = socket; sf.FileName = filename; sf.BreakPoint = breakPoint; //采用多线程异步方式处理请求,以便不会阻塞后面的其它请求(以牺牲服务器CPU资源为代价) Thread thr = new Thread(new ParameterizedThreadStart(SendToClient)); thr.Start(sf); } } } catch (Exception e) { Log("StartDownloadServer出现异常,已停止文件下载服务监听", e); } finally { if (serverListener != null) { serverListener.Stop(); } stopServer = true; } }