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

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

 2009-03-26 08:22:19 来源:WEB开发网   
核心提示:本文源代码下载地址:http://flashview.ddvip.com/2009_03/Network-Part5.rar这篇文章将完成Part.4中剩余的部分,它们本来是一篇完整的文章,C#网络编程(接收文件) - Part.5,但是因为上一篇比较长,合并起来页数太多,对服务端来说则是接收文件 receiveFil

本文源代码下载地址:

http://flashview.ddvip.com/2009_03/Network-Part5.rar

这篇文章将完成Part.4中剩余的部分,它们本来是一篇完整的文章,但是因为上一篇比较长,合并起来页数太多,浏览起来可能会比较不方便,我就将它拆为两篇了,本文便是它的后半部分。我们继续进行上一篇没有完成的步骤:客户端接收来自服务端的文件。

4.客户端接收文件

4.1服务端的实现

对于服务端,我们只需要实现上一章遗留的sendFile()方法就可以了,它起初在handleProtocol中是注释掉的。另外,由于创建连接、获取流等操作与receiveFile()是没有区别的,所以我们将它提出来作为一个公共方法getStreamToClient()。下面是服务端的代码,只包含新增改过的代码,对于原有方法我只给出了签名:

class Server {
    static void Main(string[] args) {
        Console.WriteLine("Server is running ... ");
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        TcpListener listener = new TcpListener(ip, 8500);

        listener.Start();           // 开启对控制端口 8500 的侦听
        Console.WriteLine("Start Listening ...");

        while (true) {
            // 获取一个连接,同步方法,在此处中断
            TcpClient client = listener.AcceptTcpClient(); 
            RemoteClient wapper = new RemoteClient(client);
            wapper.BeginRead();
        }
    }
}

public class RemoteClient {
    // 字段 略

    public RemoteClient(TcpClient client) {}

    // 开始进行读取
    public void BeginRead() { }

    // 再读取完成时进行回调
    private void OnReadComplete(IAsyncResult ar) { }

    // 处理protocol
    private void handleProtocol(object obj) {
        string pro = obj as string;
        ProtocolHelper helper = new ProtocolHelper(pro);
        FileProtocol protocol = helper.GetProtocol();

        if (protocol.Mode == FileRequestMode.Send) {
            // 客户端发送文件,对服务端来说则是接收文件
            receiveFile(protocol);
        } else if (protocol.Mode == FileRequestMode.Receive) {
            // 客户端接收文件,对服务端来说则是发送文件
            sendFile(protocol);
        }
    }

    // 发送文件
    private void sendFile(FileProtocol protocol) {
        TcpClient localClient;
        NetworkStream streamToClient = getStreamToClient(protocol, out localClient);

        // 获得文件的路径
        string filePath = Environment.CurrentDirectory + "/" + protocol.FileName;

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

        // 创建获取文件发送状态的类
        SendStatus status = new SendStatus(filePath);

        // 将文件流转写入网络流
        try {
            do {
                Thread.Sleep(10);           // 为了更好的视觉效果,暂停10毫秒:-)
                bytesRead = fs.Read(fileBuffer, 0, fileBuffer.Length);
                streamToClient.Write(fileBuffer, 0, bytesRead);
                totalBytes += bytesRead;            // 发送了的字节数
                status.PrintStatus(totalBytes); // 打印发送状态
            } while (bytesRead > 0);
            Console.WriteLine("Total {0} bytes sent, Done!", totalBytes);
        } catch {
            Console.WriteLine("Server has lost...");
        }

        streamToClient.Dispose();
        fs.Dispose();
        localClient.Close();
    }

    // 接收文件
    private void receiveFile(FileProtocol protocol) { }

    // 获取连接到远程的流 -- 公共方法
    private NetworkStream getStreamToClient(FileProtocol protocol, out TcpClient localClient) {
        // 获取远程客户端的位置
        IPEndPoint endpoint = client.Client.RemoteEndPoint as IPEndPoint;
        IPAddress ip = endpoint.Address;

        // 使用新端口号,获得远程用于接收文件的端口
        endpoint = new IPEndPoint(ip, protocol.Port);

        // 连接到远程客户端
        try {
            localClient = new TcpClient();
            localClient.Connect(endpoint);
        } catch {
            Console.WriteLine("无法连接到客户端 --> {0}", endpoint);
            localClient = null;
            return null;
        }

        // 获取发送文件的流
        NetworkStream streamToClient = localClient.GetStream();
        return streamToClient;
    }

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

1 2 3  下一页

Tags:网络编程 接收 文件

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