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传输文件的资料请关注我们其它相关文章!

(0)

相关推荐

  • c# 用Base64实现文件上传

    Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字符来表示二进制数据的方法. 使用base64进行文件上传的具体流程是:前台使用js将文件转换为base64格式,后台通过高级编程语言,将base64格式的文件,转换为原文件.下面就来演示一下,C#语言配合js,如何实现图片的base64格式上传与解析保存.     首先看一下前台是如何将文件读取到的,请先看如下js代码: var DataforUp = ""; var reader = new

  • c# 使用WebRequest实现多文件上传

    c#中通常使用HttpWebRequest进行HTTP网络请求,HttpWebRequest只对Http请求进行了最简单的封装.如果要利用Http协议实现多文件上传,则必须使用POST方法multipart/form-data格式.为了重复使用,我封装了几个方法,实现了多参数文件上传. 添加引用 使用WebRequest需要添加引用System.Web,否则引入出错. 参数封装 方便起见,我把请求参数进行了封装,代码如下: namespace EasyHttp.Net.Core { public

  • C# 网络编程之UDP

    一.概述 UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClient.TcpListener .TcpClient这几个类对Socket进行了封装,使其使用更加方便, 本文就通过这几个封装过的类讲解一下相关应用. 二.UDP基本应用 与TCP通信不同,UDP通信是不分服务端和客户端的,通信双方是对等的.为了描述方便,我们把通信双方称为发送方和接收方. 发送方: 首先创建一个UDP对象: string locateIP

  • C# 使用HttpClient上传文件并附带其他参数的步骤

    HttpClient和MultipartFormDataContent(传送门)最低适用于.NET Framework 4.5版本 发送端代码 using (HttpClient client = new HttpClient()) { var content = new MultipartFormDataContent(); //添加字符串参数,参数名为qq content.Add(new StringContent("123456"), "qq"); strin

  • c# 网络编程之http

    一.概述 本文目的是通过C#代码提供一个HTTP服务,正常情况下如果我们需要向外界提供HTTP服务,常规做法就是通过ASP.NET来实现,有时我们的应用程序或Windows服务需要向外提供一些简单的HTTP服务就可以自己实现,从而避免部署IIS增加系统复杂性.这里必须强调是一些简单的应用,如果应用比较复杂,涉及到路径解析HTML解析等,还是用WEB方式实现比较靠谱. 将HTTP和UDP.TCP放在同一个系列实际上有一点不合适,因为UDP.TCP属于传输层协议,HTTP属于应用层协议,希望读者首先

  • C#语言使用gRPC、protobuf(Google Protocol Buffers)实现文件传输功能

    初识gRPC还是一位做JAVA的同事在项目中用到了它,为了C#的客户端程序和java的服务器程序进行通信和数据交换,当时还是对方编译成C#,我直接调用. 后来,自己下来做了C#版本gRPC编写,搜了很多资料,但许多都是从入门开始?调用说"Say Hi!"这种官方标准的入门示例,然后遇到各种问题-- 关于gRPC和Protobuf介绍,就不介绍了,网络上一搜一大把,随便一抓都是标准的官方,所以直接从使用说起. gPRC源代码:https://github.com/grpc/grpc: p

  • c# 实现文件上传下载功能的实例代码

    NuGet 安装SqlSugar 1.Model文件下新建 DbContext 类 public class DbContext { public DbContext() { Db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = "server=localhost;uid=root;pwd=woshishui;database=test", DbType = DbType.MySql, InitKeyTy

  • c# 网络编程之tcp

    一.概述 UDP和TCP是网络通讯常用的两个传输协议,C#一般可以通过Socket来实现UDP和TCP通讯,由于.NET框架通过UdpClient.TcpListener .TcpClient这几个类对Socket进行了封装,使其使用更加方便, 本文就通过这几个封装过的类讲解一下相关应用. 二.基本应用:连接.发送.接收 服务端建立侦听并等待连接: TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"

  • C#使用TcpListener及TcpClient开发一个简单的Chat工具实例

    本文使用的开发环境是VS2017及dotNet4.0,写此随笔的目的是给自己及新开发人员作为参考, 本例子比较简单,使用的是控制台程序开发,若需要使用该软件作为演示,必须先运行服务端,再运行客户端. 因为是首次接触该方面的知识,写得比较简陋,如有更好的建议,请提出,谢谢! 一.编写服务器端代码,如下: using System; using System.Text; using System.Net; using System.Net.Sockets; using System.Threadin

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

    目录 一.简述 二.内容 一.简述 利用C# TcpClient在局域网内传输文件,可是文件发送到对面的时候却要重新命名文件的.那可不可以连着文件名与文件一起发过去呢? 二.内容 如上图,把文件名字符流的长度的值的字符流(这个文件名字符流长度的值固定是11位的字符串,不足11位前面补0)与文件名的字符流合为一个byte数组然后与文件发送到对面.对面接收后解析出文件名字符流长度的值后,再根据长度解析出文件名,接下来再获取文件流. 服务端 using System; using System.Col

  • Python网络编程之使用TCP方式传输文件操作示例

    本文实例讲述了Python网络编程之使用TCP方式传输文件操作.分享给大家供大家参考,具体如下: TCP文件下载器 客户端 需求:输入要下载的文件名,从服务器端将文件拷贝到本地 步骤: 1.创建TCP套接字,绑定端口 2.连接服务端 3.输入要下载的文件名 4.将文件名编码,并发送到服务端 5.接收服务端返回的数据 6.关闭套接字 代码 # 导入模块 import socket # 创建套接字 tcp_client_socket = socket.socket(socket.AF_INET, s

  • Android 实现无网络传输文件的示例代码

    最近的项目需要实现一个 Android 手机之间无网络传输文件的功能,就发现了 Wifi P2P(Wifi点对点)这么一个功能,最后也实现了通过 Wifi 隔空传输文件 的功能,这里我也来整理下代码,分享给大家. Wifi P2P 是在 Android 4.0 以及更高版本系统中加入的功能,通过 Wifi P2P 可以在不连接网络的情况下,直接与配对的设备进行数据交换.相对于蓝牙,Wifi P2P 的搜索速度和传输速度更快,传输距离更远 实现的效果如下所示: 客户端.png 服务器端.png 一

  • c# socket网络编程接收发送数据示例代码

    代码分2块,server端: 复制代码 代码如下: class Program    {        static void Main(string[] args)        {            TcpListener lsner = new TcpListener(9000);            lsner.Start();            Console.WriteLine("started in port: 9000");            while

  • Java网络编程TCP实现文件上传功能

    本文实例为大家分享了Java网络编程TCP实现文件上传的具体代码,供大家参考,具体内容如下 上一篇博客,用网络编程TCP 实现聊天,这次实现文件上传. 客户端: package com.kuang.lesson02; import java.io.*; import java.net.InetAddress; import java.net.Socket; //客户端 public class TcpClientDemo2 { public static void main(String[] a

  • Linux网络编程之基于UDP实现可靠的文件传输示例

    了解网络传输协议的人都知道,采用TCP实现文件传输很简单.相对于TCP,由于UDP是面向无连接.不可靠的传输协议,所以我们需要考虑丢包和后发先至(包的顺序)的问题,所以我们想要实现UDP传输文件,则需要解决这两个问题.方法就是给数据包编号,按照包的顺序接收并存储,接收端接收到数据包后发送确认信息给发送端,发送端接收确认数据以后再继续发送下一个包,如果接收端收到的数据包的编号不是期望的编号,则要求发送端重新发送. 下面展示的是基于linux下C语言实现的一个示例程序,该程序定义一个包的结构体,其中

  • Android基于TCP和URL协议的网络编程示例【附demo源码下载】

    本文实例讲述了Android基于TCP和URL协议的网络编程.分享给大家供大家参考,具体如下: 手机本身是作为手机终端使用的,因此它的计算能力,存储能力都是有限的.它的主要优势是携带方便,可以随时打开,而且手机通常总是处于联网状态.因此网络支持对于手机应用非常重要. Android完全支持JDK本身的TCP,UDP网络通信API,也可以使用ServerSocket,Socket来建立基于TCP/IP协议的网络通信,也可以使用DatagramSocket,Datagrampacket来建立基于UD

  • Java编程利用socket多线程访问服务器文件代码示例

    这篇文章将向大家展示Java编程利用socket多线程访问服务器文件代码示例,如果您想先了解Java多线程socket编程的基础知识,可以看下这篇文章:Java多线程编程实现socket通信示例代码. 接下来进入正文,我们看看利用socket多线程访问服务器代码: ServerMain.java package com.ysk.webServer; import java.io.File; import java.io.IOException; import java.net.ServerSoc

  • Java使用Socket通信传输文件的方法示例

    本文实例讲述了Java使用Socket通信传输文件的方法.分享给大家供大家参考,具体如下: 前面几篇文章介绍了使用Java的Socket编程和NIO包在Socket中的应用,这篇文章说说怎样利用Socket编程来实现简单的文件传输. 这里由于前面一片文章介绍了NIO在Socket中的应用,所以这里在读写文件的时候也继续使用NIO包,所以代码看起来会比直接使用流的方式稍微复杂一点点. 下面的示例演示了客户端向服务器端发送一个文件,服务器作为响应给客户端回发一个文件.这里准备两个文件E:/test/

  • Python网络编程使用select实现socket全双工异步通信功能示例

    本文实例讲述了Python网络编程使用select实现socket全双工异步通信功能.分享给大家供大家参考,具体如下: 在前面一篇<Python网络编程之TCP套接字简单用法>中,我们实现了tcp客户端与服务器的通信,但是功能十分局限,发送消息与接收消息不能同时进行. 接下来我将通过select这个模块,来实现全双工通信(随时可以接收信息以及发送信息),当然,用多线程也可以完成,这是后话. 那么,select为何物? select  -在单线程网络服务中器程序中,管理多个套接字连接 selec

随机推荐