打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C# TcpClient网络编程传输文件(带文件名)
userphoto

2017.03.12

关注

一、简述

  利用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("接收成功");                }            }        }          }}

  实例图

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C# .net2.0 套接字编程实例 UDP TCP通信
你也可以写个聊天程序
C#网络编程入门
C# 实现基本的套接字TCP通信
用C#实现基于TCP协议的网络通讯--51编程网
C# TcpListener和TcpClient的应用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服