WEB开发网
开发学院软件开发C语言 C#网络编程(接收文件) - Part.5 阅读

C#网络编程(接收文件) - Part.5

 2009-03-26 08:22:19 来源:WEB开发网   
核心提示: 服务端的sendFile方法和客户端的SendFile()方法完全类似,上面的代码几乎是一次编写成功的,C#网络编程(接收文件) - Part.5(2),另外注意我将客户端使用的SendStatus类也拷贝到了服务端,接下来我们看下客户端,为了避免文件名重复,我将服务端的generateF

服务端的sendFile方法和客户端的SendFile()方法完全类似,上面的代码几乎是一次编写成功的。另外注意我将客户端使用的SendStatus类也拷贝到了服务端。接下来我们看下客户端。

4.2客户端的实现

首先要注意的是客户端的SendFile()接收的参数是文件全路径,但是在写入到协议时只获取了路径中的文件名称。这是因为服务端不需要知道文件在客户端的路径,所以协议中只写文件名;而为了使客户端的SendFile()方法更通用,所以它接收本地文件的全路径。

客户端的ReceiveFile()的实现也和服务端的receiveFile()方法类似,同样,由于要保存到本地,为了避免文件名重复,我将服务端的generateFileName()方法复制了过来。

public class ServerClient :IDisposable {
    // 字段略

    public ServerClient() {}

    // 发送消息到服务端
    public void SendMessage(string msg) {}

    // 发送文件 - 异步方法
    public void BeginSendFile(string filePath) {    }

    private void SendFile(object obj) { }
   
    // 发送文件 -- 同步方法
    public void SendFile(string filePath) {}
   
    // 接收文件 -- 异步方法
    public void BeginReceiveFile(string fileName) {
        ParameterizedThreadStart start =
            new ParameterizedThreadStart(ReceiveFile);
        start.BeginInvoke(fileName, null, null);
    }

    public void ReceiveFile(object obj) {
        string fileName = obj as string;
        ReceiveFile(fileName);
    }

    // 接收文件 -- 同步方法
    public void ReceiveFile(string fileName) {

        IPAddress ip = IPAddress.Parse("127.0.0.1");
        TcpListener listener = new TcpListener(ip, 0);
        listener.Start();

        // 获取本地侦听的端口号
        IPEndPoint endPoint = listener.LocalEndpoint as IPEndPoint;
        int listeningPort = endPoint.Port;

        // 获取发送的协议字符串
        FileProtocol protocol =
            new FileProtocol(FileRequestMode.Receive, listeningPort, fileName);
        string pro = protocol.ToString();

        SendMessage(pro);       // 发送协议到服务端

        // 中断,等待远程连接
        TcpClient localClient = listener.AcceptTcpClient();
        Console.WriteLine("Start sending file...");
        NetworkStream stream = localClient.GetStream();

        // 获取文件保存的路劲
        string filePath =
            Environment.CurrentDirectory + "/" + generateFileName(fileName);

        // 创建文件流
        FileStream fs = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write);
        byte[] fileBuffer = new byte[1024];     // 每次传1KB
        int bytesRead;
        int totalBytes = 0;

        // 从缓存buffer中读入到文件流中
        do {
            bytesRead = stream.Read(buffer, 0, BufferSize);
            fs.Write(buffer, 0, bytesRead);
            totalBytes += bytesRead;
            Console.WriteLine("Receiving {0} bytes ...", totalBytes);
        } while (bytesRead > 0);

        Console.WriteLine("Total {0} bytes received, Done!", totalBytes);

        fs.Dispose();          
        stream.Dispose();
        localClient.Close();
        listener.Stop();
    }


    // 随机获取一个图片名称
    private string generateFileName(string fileName) {}

    public void Dispose() {
        if (streamToServer != null)
            streamToServer.Dispose();
        if (client != null)
            client.Close();
    }
}

Tags:网络编程 接收 文件

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接