C# TcpClient网络编程传输文件的示例

作者:空白凌乱感 时间:2021-10-16 16:01:13 

目录
  • 一、简述

  • 二、内容

一、简述

利用C# TcpClient在局域网内传输文件,可是文件发送到对面的时候却要重新命名文件的。那可不可以连着文件名与文件一起发过去呢?

二、内容

C# TcpClient网络编程传输文件的示例

如上图,把文件名字符流的长度的值的字符流(这个文件名字符流长度的值固定是11位的字符串,不足11位前面补0)与文件名的字符流合为一个byte数组然后与文件发送到对面。对面接收后解析出文件名字符流长度的值后,再根据长度解析出文件名,接下来再获取文件流。

服务端


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace TCPSendFile
{
   public partial class Form1 : Form
   {
       public delegate void TxtReceiveAddContentEventHandler(string txtValue);

public Form1()
       {
           InitializeComponent();
       }

public void TxtAddContent(string txtValue)
       {
           if (textBox1.InvokeRequired)
           {
               TxtReceiveAddContentEventHandler addContent = TxtAddContent;
               textBox1.Invoke(addContent, new object[] { txtValue });
           }
           else
           {
               textBox1.Text = txtValue + "\r\n" + textBox1.Text;
           }
       }

private void button1_Click(object sender, EventArgs e)
       {

TcpListener tcpListener = new TcpListener(IPAddress.Any, 18001);
           tcpListener.Start();
           textBox1.Text = "开始侦听...";
           Thread thread = new Thread(SendFileFunc);
           thread.Start(tcpListener);
           thread.IsBackground = true;
       }

public void SendFileFunc(object obj)
       {
           TcpListener tcpListener = obj as TcpListener;
           while (true)
           {
               try
               {
                   TcpClient tcpClient = tcpListener.AcceptTcpClient();
                   if (tcpClient.Connected)
                   {
                       NetworkStream stream = tcpClient.GetStream();
                       string fileName = "testfile.rar";

byte[] fileNameByte = Encoding.Unicode.GetBytes(fileName);

byte[] fileNameLengthForValueByte = Encoding.Unicode.GetBytes(fileNameByte.Length.ToString("D11"));
                       byte[] fileAttributeByte = new byte[fileNameByte.Length + fileNameLengthForValueByte.Length];

fileNameLengthForValueByte.CopyTo(fileAttributeByte, 0);  //文件名字符流的长度的字符流排在前面。

fileNameByte.CopyTo(fileAttributeByte, fileNameLengthForValueByte.Length);  //紧接着文件名的字符流

stream.Write(fileAttributeByte, 0, fileAttributeByte.Length);
                       FileStream fileStrem = new FileStream(Application.StartupPath + "\\WebFile\\" + fileName, FileMode.Open);

int fileReadSize = 0;
                       long fileLength = 0;
                       while (fileLength < fileStrem.Length)
                       {
                           byte[] buffer = new byte[2048];
                           fileReadSize = fileStrem.Read(buffer, 0, buffer.Length);
                           stream.Write(buffer, 0, fileReadSize);
                           fileLength += fileReadSize;

}
                       fileStrem.Flush();
                       stream.Flush();
                       fileStrem.Close();
                       stream.Close();

TxtAddContent(string.Format("{0}文件发送成功", fileName));
                   }

}
               catch (Exception ex)
               {

}
           }
       }
   }
}

客户端


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace TCPReceiveFile
{
   public partial class Form1 : Form
   {
       public delegate void TxtReceiveAddContentEventHandler(string txtValue);
       public Form1()
       {
           InitializeComponent();
       }
       public void TxtReceiveAddContent(string txtValue)
       {
           if (txtReceive.InvokeRequired)
           {
               TxtReceiveAddContentEventHandler addContent = TxtReceiveAddContent;
               txtReceive.Invoke(addContent, new object[] { txtValue });
           }
           else
           {
               txtReceive.Text = txtValue + "\r\n" + txtReceive.Text;
           }
       }

private void button1_Click(object sender, EventArgs e)
       {
           IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Parse("192.168.1.101"), 18001);
           TxtReceiveAddContent("连接中。。。。。");
           Thread th = new Thread(ReceiveFileFunc);
           th.Start(ipEndPoint);
           th.IsBackground = true;
       }

private void ReceiveFileFunc(object obj)
       {
           IPEndPoint ipEndPoint = obj as IPEndPoint;
           TcpClient tcpClient = new TcpClient();
           try
           {
               tcpClient.Connect(ipEndPoint);
           }
           catch
           {
               TxtReceiveAddContent("连接失败,找不到服务器!");
           }

if (tcpClient.Connected)
           {

NetworkStream stream = tcpClient.GetStream();
               if (stream != null)
               {

byte[] fileNameLengthForValueByte = Encoding.Unicode.GetBytes((256).ToString("D11"));
                   byte[] fileNameLengByte = new byte[1024];
                   int fileNameLengthSize = stream.Read(fileNameLengByte, 0, fileNameLengthForValueByte.Length);
                   string fileNameLength = Encoding.Unicode.GetString(fileNameLengByte, 0, fileNameLengthSize);
                   TxtReceiveAddContent("文件名字符流的长度为:" + fileNameLength);

int fileNameLengthNum = Convert.ToInt32(fileNameLength);
                   byte[] fileNameByte = new byte[fileNameLengthNum];

int fileNameSize = stream.Read(fileNameByte, 0, fileNameLengthNum);
                   string fileName = Encoding.Unicode.GetString(fileNameByte, 0, fileNameSize);
                   TxtReceiveAddContent("文件名为:" + fileName);

string dirPath = Application.StartupPath + "\\WebFile";
                   if(!Directory.Exists(dirPath))
                   {
                       Directory.CreateDirectory(dirPath);
                   }
                   FileStream fileStream = new FileStream(dirPath + "\\" + fileName, FileMode.Create, FileAccess.Write);
                   int fileReadSize = 0;
                   byte[] buffer = new byte[2048];
                   while ((fileReadSize = stream.Read(buffer, 0, buffer.Length)) > 0)
                   {
                       fileStream.Write(buffer, 0, fileReadSize);

}
                   fileStream.Flush();
                   fileStream.Close();
                   stream.Flush();
                   stream.Close();
                   tcpClient.Close();
                   TxtReceiveAddContent("接收成功");
               }
           }
       }

}
}

实例图

C# TcpClient网络编程传输文件的示例

C# TcpClient网络编程传输文件的示例

来源:https://www.cnblogs.com/kongbailingluangan/p/6476855.html

标签:C#,TcpClient,传输文件,网络编程
0
投稿

猜你喜欢

  • Java图片裁剪和生成缩略图的实例方法

    2023-11-09 00:01:50
  • 详解Spring缓存注解@Cacheable,@CachePut , @CacheEvict使用

    2021-11-18 12:18:05
  • Java获取文件的路径及常见问题解决方案

    2023-04-16 04:24:15
  • Java语言中Swing组件编程详解

    2023-04-19 04:08:22
  • java实现简单的英文文本单词翻译器功能示例

    2023-11-28 10:22:15
  • java使用OGEngine开发2048

    2023-07-23 06:07:43
  • 从java源码分析线程池(池化技术)的实现原理

    2021-12-24 00:01:24
  • Netty分布式pipeline管道创建方法跟踪解析

    2023-11-03 02:55:51
  • SpringBoot选择自有bean优先加载实现方法

    2023-05-21 06:22:39
  • IDEA解决springboot热部署失效问题(推荐)

    2023-08-12 10:40:49
  • java字符串常用操作方法(查找、截取、分割)

    2023-11-29 03:21:13
  • windows下java环境变量的设置方法

    2022-12-01 03:13:14
  • Java 守护线程_动力节点Java学院整理

    2023-11-28 07:51:14
  • 解析C#中的装箱与拆箱的详解

    2023-03-15 23:52:36
  • 浅析Java设计模式编程中的单例模式和简单工厂模式

    2021-10-13 15:27:54
  • Java循环队列原理与用法详解

    2023-11-13 20:05:36
  • 基于spring security实现登录注销功能过程解析

    2023-11-29 06:09:05
  • MyBatis源码浅析(一)开篇

    2022-09-28 03:28:24
  • C语言文件操作函数大全(超详细)

    2023-07-15 06:20:42
  • c#解析jobject的数据结构

    2023-09-28 00:25:33
  • asp之家 软件编程 m.aspxhome.com