C#实现一个局域网文件传输工具

C#实现一个局域网文件传输工具工作需要,经常会在工作的台式机和笔记本之间传文件或者需要拷贝文本,两个机器都位于局域网内,传文件或者文本的方式有很多种,之前是通过共享文件夹来进行文件的拷贝,或者通过SVN进行同步。文本传递比较简单,可以通过两台机器上装QQ登两个号码,或者在共享目录下建一个TXT,或者发电子邮件等等。不过上面这些方法总觉得不直接,所以想基于P2P做一个小的局域网文件和文字传输小工具。WinForm的工程,

大家好,又见面了,我是你们的朋友全栈君。

工作需要,经常会在工作的台式机和笔记本之间传文件或者需要拷贝文本,两个机器都位于局域网内,传文件或者文本的方式有很多种,之前是通过共享文件夹来进行文件的拷贝,或者通过SVN进行同步。文本传递比较简单,可以通过两台机器上装QQ登两个号码,或者在共享目录下建一个TXT,或者发电子邮件等等。

不过上面这些方法总觉得不直接,所以想基于P2P做一个小的局域网文件和文字传输小工具。

WinForm的工程,界面方面的代码就不贴了,大家自己根据喜好设计就好了,主要把TCP数据传输的代码和逻辑贴出来:

1. 文件和文本传输的通用方法:

private string ReceiveControl(Socket socket)
{
    int bufSize = 1024;
    byte[] buf = new byte[bufSize];
    int len = socket.Receive(buf);
    return len > 0 ? Encoding.UTF8.GetString(buf, 0, len) : String.Empty;
}
private void SendControl(Socket socket, string controlMsg)
{
    byte[] msgBytes = Encoding.UTF8.GetBytes(controlMsg);
    socket.Send(msgBytes);
}
private string ReceiveContent(Socket socket, int contentLen)
{
    int receivedLen = 0;
    int bufSize = 1024;
    byte[] buf = new byte[bufSize];
    StringBuilder sb = new StringBuilder();
    while (receivedLen < contentLen)
    {
        int len = socket.Receive(buf);
        if (len > 0)
        {
            sb.Append(Encoding.UTF8.GetString(buf, 0, len));
            receivedLen += len;
        }
    }
    return sb.ToString();
}
private void SendContent(Socket socket, string content)
{
    byte[] contentBytes = Encoding.UTF8.GetBytes(content);
    SendControl(socket, contentBytes.Length.ToString());
    ReceiveControl(socket);
    socket.Send(contentBytes);
}
private void ReceiveFile(Socket socket, string fileName, int fileLen)
{
    string filePath = Path.Combine(GetCurrentUserDesktopPath(), RenameConflictFileName(fileName));
    using (Stream fs = new FileStream(filePath, FileMode.Create, FileAccess.ReadWrite))
    {
        int bufLen = 1024;
        int receivedLen = 0;
        byte[] buf = new byte[bufLen];
        int len = 0;
        while (receivedLen < fileLen)
        {
            len = socket.Receive(buf);
            fs.Write(buf, 0, len);
            receivedLen += len;
        }
    }
}
private void SendFile(Socket socket, string filePath)
{
    using (Stream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
    {
        SendControl(socket, GetFileNameFromPath(filePath));
        ReceiveControl(socket);
        SendControl(socket, fs.Length.ToString());
        ReceiveControl(socket);
        int bufLen = 1024;
        byte[] buf = new byte[bufLen];
        long readLen = 0;
        long fileLen = fs.Length;
        int len = 0;
        while (readLen < fileLen)
        {
            len = fs.Read(buf, 0, bufLen);
            readLen += len;
            int sentLen = 0;
            int realSent = 0;
            int left = 0;
            while (sentLen < len)
            {
                left = len - realSent;
                realSent = socket.Send(buf, sentLen, left, SocketFlags.None);
                sentLen += realSent;
            }
        }
    }
}

2.连接,发送文字/文件,重命名文件等方法:

private void SendText()
{
    if (connected)
    {
        if (!String.IsNullOrEmpty(this.TextToSend.Text))
        {
            string txt = this.TextToSend.Text;
            SendControl(clientSocket, "Text");
            ReceiveControl(clientSocket);
            SendContent(clientSocket, txt);
            ReceiveControl(clientSocket);
        }
    }
}

private void Connect()
{
    try
    {
        if (!connected)
        {
            passive = false;
            IPAddress serverIPAddress = IPAddress.Parse(this.ServerIPAddress.Text);
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(serverIPAddress, 60000);
            string msg = ReceiveControl(clientSocket);
            if (msg.Equals("Connected"))
            {
                this.ConnectBtn.Text = "Disconnect";
                connected = true;
            }
        }
        else
        {
            passive = true;
            SendControl(clientSocket, "Disconnect");
            clientSocket.Close();
            this.ConnectBtn.Text = "Connect";
            connected = false;
        }
    }
    catch (Exception err)
    {
        MessageBox.Show(string.Format("Failed to connect to server, error: {0}", err.ToString()));
    }
}

private void ServerThread()
{
    IPAddress local = IPAddress.Parse("0.0.0.0");
    Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    server.Bind(new IPEndPoint(local, 60000));
    server.Listen(1);
    while (true)
    {
        Socket receivedClientSocket = server.Accept();
        IPEndPoint clientEndPoint = (IPEndPoint)receivedClientSocket.RemoteEndPoint;
        SendControl(receivedClientSocket, "Connected");
        if (passive)
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(clientEndPoint.Address, 60000);
            string msg = ReceiveControl(clientSocket);
            if (msg.Equals("Connected"))
            {
                connected = true;
                this.ConnectBtn.Text = "Disconnect";
                this.ServerIPAddress.Text = clientEndPoint.Address.ToString();
            }
        }
        while (connected)
        {
            string msg = ReceiveControl(receivedClientSocket);
            switch (msg)
            {
                case "Disconnect":
                    receivedClientSocket.Close();
                    clientSocket.Close();
                    this.ConnectBtn.Text = "Connect";
                    passive = true;
                    connected = false;
                    break;
                case "Text":
                    SendControl(receivedClientSocket, "Received");
                    int length = Convert.ToInt32(ReceiveControl(receivedClientSocket));
                    SendControl(receivedClientSocket, "Received");
                    string content = ReceiveContent(receivedClientSocket, length);
                    SendControl(receivedClientSocket, "Received");
                    this.TextToSend.Text = content;
                    break;
                case "File":
                    SendControl(receivedClientSocket, "Received");
                    string fileName = ReceiveControl(receivedClientSocket);
                    SendControl(receivedClientSocket, "Received");
                    int fileLen = Convert.ToInt32(ReceiveControl(receivedClientSocket));
                    SendControl(receivedClientSocket, "Received");
                    ReceiveFile(receivedClientSocket, fileName, fileLen);
                    SendControl(receivedClientSocket, "Received");
                    MessageBox.Show("File Received");
                    break;
            }
        }
    }
}

private string GetFileNameFromPath(string path)
{
    int index = path.LastIndexOf('\\');
    return path.Substring(index + 1);
}

private string RenameConflictFileName(string originalName)
{
    string desktopPath = GetCurrentUserDesktopPath();
    int extensionIndex = originalName.LastIndexOf(".");
    string fileName = originalName.Substring(0, extensionIndex);
    string extensionName = originalName.Substring(extensionIndex + 1);

    int renameIndex = 1;
    string newNameSuffix = String.Format("({0})", renameIndex);
    string finalName = originalName;
    string filePath = Path.Combine(desktopPath, finalName);
    if (File.Exists(filePath))
    {
        finalName = String.Format("{0} {1}.{2}", fileName, newNameSuffix, extensionName);
        filePath = Path.Combine(desktopPath, finalName);
    }
    while (File.Exists(filePath))
    {
        renameIndex += 1;
        string oldNameSuffix = newNameSuffix;
        newNameSuffix = String.Format("({0})", renameIndex);
        finalName = finalName.Replace(oldNameSuffix, newNameSuffix);
        filePath = Path.Combine(desktopPath, finalName);
    }

    return finalName;
}

private string GetCurrentUserDesktopPath()
{
    return Environment.GetFolderPath(System.Environment.SpecialFolder.Desktop);
}

运行截图:

C#实现一个局域网文件传输工具

完整代码可以到下面的地址下载:

http://download.csdn.net/detail/qwertyupoiuytr/9895436


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136239.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 网络安全渗透高级工具(黑客工具软件大全100套)

    黑客工具软件大全100套1Nessus:最好的UNIX漏洞扫描工具Nessus是最好的免费网络漏洞扫描器,它可以运行于几乎所有的UNIX平台之上。它不止永久升级,还免费提供多达11000种插件(但需要注册并接受EULA-acceptance–终端用户授权协议)。它的主要功能是远程或本地(已授权的)安全检查,客户端/服务器架构,GTK(Linux下的一种图形界面)图形界面,内置脚本语言编译器…

    2022年4月5日
  • 管家婆crm9.2 sp2升级问题求助及解决方案

    管家婆crm9.2 sp2升级问题求助及解决方案

    2021年11月17日
  • python 股票历史数据(python获取股票历史数据)

    因为最近需要用到股市的各种指数数据,刚开始想的是从同花顺等交易软件直接导出,结果发现要用滚轮滚到最开始的日期,这过于繁琐了,我对于这种重复性的劳动一向不耐烦,而且这种方法在以后每日更新的时候也很不方便。所以我把视线转向了网上的各种api。网上比较普遍的主要有两种,一种是新浪的api,一种是雅虎的api。新浪的api很方便,速度也很快,不过就网上的资料而言,似乎只能提取当天的数据。雅虎的api功能更齐

    2022年4月17日
  • mysql 实现row number_mysql数据库可以使用row number吗?

    mysql 实现row number_mysql数据库可以使用row number吗?方法一:为了实现row_number函数功能,此方法我们要使用到会话变量,下面的实例是从employees表中选出5名员工,并为每一行添加行号:123456SET@row_number=0;SELECT(@row_number:=@row_number+1)ASnum,firstName,lastNameFROMemployeesLIMIT5;输出结果:在这个实例中:首先,…

    2022年6月13日
  • Windows系统日志分析_python日志采集分析

    Windows系统日志分析_python日志采集分析日志文件,它记录着Windows系统及其各种服务运行的每个细节,对增强Windows的稳定和安全性,起着非常重要的作用。但许多用户不注意对它保护,一些“不速之客”很轻易就将日志文件清空,给系统带来严重的安全隐患。  一、什么是日志文件  日志文件是Windows系统中一个比较特殊的文件,它记录着Windows系统中所发生的一切,如各种系统服务的启动、运行、关闭等信息。Windows日志包括应用

    2022年9月7日
  • StringBuffer与StringBuilder的区别_String

    StringBuffer与StringBuilder的区别_String1:StringBuffer、StringBuilder和String一样,也用来代表字符串。String类是不可变类,任何对String的改变都会引发新的String对象的生成;StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。2:HashTable是线程安全的,很多方法都是synchronized方法,而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。3:StringBuffer和StringBuilder类的区..

    2022年9月15日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号