日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

基于TCP協(xié)議Socket編程,使用WPF實現(xiàn)文件上傳和保存文件完整示例

來源: 責編: 時間:2024-02-02 09:20:06 281觀看
導讀需求分析假設我們需要實現(xiàn)一個基于網(wǎng)絡的文件上傳系統(tǒng),用戶可以通過客戶端將本地文件上傳到服務端。這種情況經常出現(xiàn)在文件存儲和共享、云存儲等應用場景中。使用Socket編程可以實現(xiàn)高效可靠的文件傳輸。1、客戶端需

ynt28資訊網(wǎng)——每日最新資訊28at.com

需求分析

假設我們需要實現(xiàn)一個基于網(wǎng)絡的文件上傳系統(tǒng),用戶可以通過客戶端將本地文件上傳到服務端。這種情況經常出現(xiàn)在文件存儲和共享、云存儲等應用場景中。使用Socket編程可以實現(xiàn)高效可靠的文件傳輸。ynt28資訊網(wǎng)——每日最新資訊28at.com

1、客戶端需求:

  • 用戶可以選擇本地文件進行上傳。
  • 用戶需要輸入服務端的IP地址和端口號。
  • 客戶端需要將選擇的文件發(fā)送給服務端進行保存。

2、服務端需求:

  • 服務端需要監(jiān)聽指定的端口,等待客戶端連接請求。
  • 接收到客戶端連接后,服務端需要接收文件數(shù)據(jù)。
  • 服務端需要將接收到的文件保存到指定位置。

3、文件傳輸需求:

  • 傳輸協(xié)議:使用TCP協(xié)議確保可靠的數(shù)據(jù)傳輸。
  • 文件分片:為了減小內存開銷和網(wǎng)絡負載,將大文件分成多個較小的數(shù)據(jù)包進行傳輸。
  • 文件校驗:傳輸過程中需要對文件進行校驗,確保數(shù)據(jù)的完整性。

4、錯誤處理需求:

  • 連接錯誤:需要處理連接失敗、超時等錯誤情況。
  • 文件錯誤:需要處理文件讀取失敗、傳輸中斷等錯誤情況。
  • 異常處理:需要處理網(wǎng)絡異常、IO異常等情況,并提供相應的錯誤提示和處理機制。

基于以上需求,我們可以使用C#的Socket編程實現(xiàn)一個文件上傳系統(tǒng),包括客戶端和服務端的程序。在程序中使用Socket進行網(wǎng)絡連接和數(shù)據(jù)傳輸,同時對連接錯誤和文件錯誤進行適當處理和異常捕獲。ynt28資訊網(wǎng)——每日最新資訊28at.com

客戶端代碼和實現(xiàn)過程

dotnet new wpf -n "FileUploaderClient"

MainWindow.xaml:ynt28資訊網(wǎng)——每日最新資訊28at.com

<Window x:Class="FileUploaderClient.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        Title="文件上傳客戶端" Height="350" Width="500">    <Grid>        <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">            <TextBlock Text="選擇要上傳的文件:" Margin="0 0 0 10" />            <Button Content="瀏覽..." Click="BrowseButton_Click" Width="80" Height="30" Margin="0 0 0 10" />            <TextBox x:Name="FilePathTextBox" Text="{Binding FilePath}" Width="300" Height="30" Margin="0 0 0 10" />            <TextBlock Text="輸入服務端IP地址:" Margin="0 0 0 10" />            <TextBox x:Name="ServerIPTextBox" Text="{Binding ServerIP}" Width="200" Height="30" Margin="0 0 0 10" />            <TextBlock Text="輸入服務端端口號:" Margin="0 0 0 10" />            <TextBox x:Name="ServerPortTextBox" Text="{Binding ServerPort}" Width="100" Height="30" Margin="0 0 0 10" />            <Button Content="上傳" Click="UploadButton_Click" Width="80" Height="30" Margin="0 0 0 10" />            <TextBlock x:Name="ResultTextBlock" Text="{Binding ResultMessage}" Margin="0 10" TextWrapping="Wrap" />        </StackPanel>    </Grid></Window>

ynt28資訊網(wǎng)——每日最新資訊28at.com

MainWindow.xaml.cs:ynt28資訊網(wǎng)——每日最新資訊28at.com

using System;using System.ComponentModel;using System.IO;using System.Net.Sockets;using System.Security.Cryptography;using System.Text;using System.Windows;namespace FileUploaderClient{    public partial class MainWindow : Window, INotifyPropertyChanged    {        public event PropertyChangedEventHandler PropertyChanged;        private string filePath;        public string FilePath        {            get { return filePath; }            set            {                filePath = value;                OnPropertyChanged("FilePath");            }        }        private string serverIP;        public string ServerIP        {            get { return serverIP; }            set            {                serverIP = value;                OnPropertyChanged("ServerIP");            }        }        private int serverPort;        public int ServerPort        {            get { return serverPort; }            set            {                serverPort = value;                OnPropertyChanged("ServerPort");            }        }        private string resultMessage;        public string ResultMessage        {            get { return resultMessage; }            set            {                resultMessage = value;                OnPropertyChanged("ResultMessage");            }        }        public MainWindow()        {            InitializeComponent();            DataContext = this;        }        private void OnPropertyChanged(string propertyName)        {            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));        }        private void BrowseButton_Click(object sender, RoutedEventArgs e)        {            Microsoft.Win32.OpenFileDialog openFileDialog = new Microsoft.Win32.OpenFileDialog();            if (openFileDialog.ShowDialog() == true)            {                FilePath = openFileDialog.FileName;            }        }        private void UploadButton_Click(object sender, RoutedEventArgs e)        {            try            {                // 讀取本地文件                byte[] fileData = File.ReadAllBytes(FilePath);                // 連接服務端并發(fā)送文件                using (TcpClient client = new TcpClient(ServerIP, ServerPort))                {                    using (NetworkStream stream = client.GetStream())                    {                        // 發(fā)送文件名和文件長度                        string fileName = Path.GetFileName(FilePath);                        byte[] fileNameBytes = Encoding.UTF8.GetBytes(fileName);                        byte[] fileNameLengthBytes = BitConverter.GetBytes(fileNameBytes.Length);                        byte[] fileLengthBytes = BitConverter.GetBytes(fileData.Length);                        stream.Write(fileNameLengthBytes, 0, 4);                        stream.Write(fileNameBytes, 0, fileNameBytes.Length);                        stream.Write(fileLengthBytes, 0, 4);                        // 發(fā)送文件內容                        int bufferSize = 1024;                        int bytesSent = 0;                        while (bytesSent < fileData.Length)                        {                            int remainingBytes = fileData.Length - bytesSent;                            int bytesToSend = Math.Min(bufferSize, remainingBytes);                            stream.Write(fileData, bytesSent, bytesToSend);                            bytesSent += bytesToSend;                        }                        ResultMessage = "文件上傳成功!";                    }                }            }            catch (Exception ex)            {                ResultMessage = "文件上傳失敗:" + ex.Message;            }        }    }}

使用該客戶端程序,用戶可以選擇本地文件進行上傳,并輸入服務端的IP地址和端口號。客戶端會將選擇的文件發(fā)送給服務端進行保存。ynt28資訊網(wǎng)——每日最新資訊28at.com

這個示例實現(xiàn)了基于TCP協(xié)議的文件上傳功能,使用TcpClient和NetworkStream進行連接和數(shù)據(jù)傳輸。文件被分成較小的數(shù)據(jù)包進行傳輸,發(fā)送前會計算文件名和文件長度,并通過4字節(jié)的長度前綴指示接收方應該接收多少數(shù)據(jù)。ynt28資訊網(wǎng)——每日最新資訊28at.com

服務端代碼和實現(xiàn)過程

dotnet new wpf -n "FileUploaderServer"

MainWindow.xaml:ynt28資訊網(wǎng)——每日最新資訊28at.com

<Window x:Class="FileUploaderServer.MainWindow"        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        Title="文件上傳服務端" Height="350" Width="500">    <Grid>        <StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">            <TextBlock Text="輸入要監(jiān)聽的端口號:" Margin="0 0 0 10" />            <TextBox x:Name="PortTextBox" Text="{Binding Port}" Width="100" Height="30" Margin="0 0 0 10" />            <Button Content="啟動服務" Click="StartButton_Click" Width="80" Height="30" Margin="0 0 0 10" />            <TextBlock x:Name="ResultTextBlock" Text="{Binding ResultMessage}" Margin="0 10" TextWrapping="Wrap" />        </StackPanel>    </Grid></Window>

ynt28資訊網(wǎng)——每日最新資訊28at.com

MainWindow.xaml.cs:ynt28資訊網(wǎng)——每日最新資訊28at.com

using System;using System.ComponentModel;using System.IO;using System.Net;using System.Net.Sockets;using System.Security.Cryptography;using System.Text;using System.Threading;using System.Windows;namespace FileUploaderServer{    public partial class MainWindow : Window, INotifyPropertyChanged    {        public event PropertyChangedEventHandler PropertyChanged;        private int port;        public int Port        {            get { return port; }            set            {                port = value;                OnPropertyChanged("Port");            }        }        private string resultMessage;        public string ResultMessage        {            get { return resultMessage; }            set            {                resultMessage = value;                OnPropertyChanged("ResultMessage");            }        }        private TcpListener serverListener;        private Thread serverThread;        public MainWindow()        {            InitializeComponent();            DataContext = this;        }        private void OnPropertyChanged(string propertyName)        {            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));        }        private void StartButton_Click(object sender, RoutedEventArgs e)        {            try            {                // 啟動服務端監(jiān)聽                IPAddress ipAddress = IPAddress.Any;                serverListener = new TcpListener(ipAddress, Port);                serverListener.Start();                // 啟動服務端線程                serverThread = new Thread(new ThreadStart(ServerThreadProc));                serverThread.IsBackground = true;                serverThread.Start();                ResultMessage = "服務啟動成功!";            }            catch (Exception ex)            {                ResultMessage = "服務啟動失敗:" + ex.Message;            }        }        private void ServerThreadProc()        {            while (true)            {                try                {                    // 接受客戶端連接請求                    TcpClient client = serverListener.AcceptTcpClient();                    // 處理客戶端連接請求                    Thread clientThread = new Thread(new ParameterizedThreadStart(ClientThreadProc));                    clientThread.IsBackground = true;                    clientThread.Start(client);                }                catch (Exception)                {                    break;                }            }        }        private void ClientThreadProc(object parameter)        {            TcpClient client = (TcpClient)parameter;            try            {                using (client)                {                    using (NetworkStream stream = client.GetStream())                    {                        // 讀取文件名和文件長度                        byte[] fileNameLengthBytes = new byte[4];                        stream.Read(fileNameLengthBytes, 0, 4);                        int fileNameLength = BitConverter.ToInt32(fileNameLengthBytes, 0);                        byte[] fileNameBytes = new byte[fileNameLength];                        stream.Read(fileNameBytes, 0, fileNameLength);                        string fileName = Encoding.UTF8.GetString(fileNameBytes);                        byte[] fileLengthBytes = new byte[4];                        stream.Read(fileLengthBytes, 0, 4);                        int fileLength = BitConverter.ToInt32(fileLengthBytes, 0);                        // 接收文件內容                        int bufferSize = 1024;                        byte[] buffer = new byte[bufferSize];                        int bytesRead = 0;                        int totalBytesRead = 0;                        byte[] fileData = new byte[fileLength];                        while (totalBytesRead < fileLength && (bytesRead = stream.Read(buffer, 0, Math.Min(bufferSize, fileLength - totalBytesRead))) > 0)                        {                            Buffer.BlockCopy(buffer, 0, fileData, totalBytesRead, bytesRead);                            totalBytesRead += bytesRead;                        }                        // 保存文件到本地                        string savePath = Path.Combine(Environment.CurrentDirectory, "Uploads", fileName);                        if (File.Exists(savePath))                        {                            savePath = Path.Combine(Environment.CurrentDirectory, "Uploads", Path.GetFileNameWithoutExtension(fileName) + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + Path.GetExtension(fileName));                        }                        using (FileStream fileStream = new FileStream(savePath, FileMode.CreateNew))                        {                            fileStream.Write(fileData, 0, fileLength);                        }                        ResultMessage = "文件保存成功:" + savePath;                    }                }            }            catch (Exception ex)            {                ResultMessage = "文件保存失敗:" + ex.Message;            }        }    }}

使用該服務端程序,用戶可以輸入要監(jiān)聽的端口號,并啟動服務端監(jiān)聽。當有客戶端連接時,服務端會接收文件數(shù)據(jù),并保存到指定位置。ynt28資訊網(wǎng)——每日最新資訊28at.com

這個示例實現(xiàn)了基于TCP協(xié)議的文件接收和保存功能,使用TcpListener和TcpClient進行監(jiān)聽和連接,使用NetworkStream進行數(shù)據(jù)傳輸。文件被分成較小的數(shù)據(jù)包進行傳輸,發(fā)送前會計算文件名和文件長度,并通過4字節(jié)的長度前綴指示接收方應該接收多少數(shù)據(jù)。ynt28資訊網(wǎng)——每日最新資訊28at.com

運行結果

啟動服務端,開啟端口12345。ynt28資訊網(wǎng)——每日最新資訊28at.com

ynt28資訊網(wǎng)——每日最新資訊28at.com

啟動客戶端程序,配置服務端地址。ynt28資訊網(wǎng)——每日最新資訊28at.com

ynt28資訊網(wǎng)——每日最新資訊28at.com

ynt28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-71447-0.html基于TCP協(xié)議Socket編程,使用WPF實現(xiàn)文件上傳和保存文件完整示例

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: HaLow Wi-Fi 標準被證明大有可為:實現(xiàn) 3 公里穩(wěn)定無線連接

下一篇: Vue的緩存組件知道多少?實例代碼詳解KeepAlive

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产女人18毛片水18精品| 欧美在线资源| 91久久精品国产91性色tv| 在线观看视频免费一区二区三区| 有码中文亚洲精品| 亚洲精品1区| 一区二区三区四区国产精品| 亚洲综合激情| 久久久久se| 欧美激情第10页| 国产精品久久久久久久电影| 国产精品一区二区在线观看不卡| 韩国福利一区| 一区二区三区日韩精品| 亚洲夜间福利| 久久九九热re6这里有精品| 免费欧美日韩国产三级电影| 欧美日韩亚洲国产精品| 国产午夜精品视频| 国产精品久线观看视频| 国产午夜亚洲精品理论片色戒| 精品成人免费| 一区二区精品国产| 亚洲一区欧美二区| 久久精品国产亚洲高清剧情介绍| 欧美高清在线观看| 国产精品一区二区欧美| 亚洲韩国日本中文字幕| 亚洲男同1069视频| 免费不卡欧美自拍视频| 国产精品扒开腿做爽爽爽软件| 国产在线播精品第三| 日韩一级成人av| 欧美专区在线观看一区| 欧美日韩成人在线观看| 国产亚洲aⅴaaaaaa毛片| 日韩视频一区二区三区在线播放| 欧美一区二区三区电影在线观看| 欧美高清在线一区| 国产午夜精品全部视频播放 | 欧美一区二区在线播放| 欧美成人一二三| 国产欧美一区二区精品性 | 一本色道久久综合亚洲精品小说| 久久精品一二三| 欧美午夜欧美| 在线日韩av永久免费观看| 亚洲欧美影音先锋| 欧美日韩视频第一区| 1769国内精品视频在线播放| 小辣椒精品导航| 欧美日韩视频一区二区| 亚洲国产成人高清精品| 欧美亚洲网站| 欧美少妇一区| 亚洲人成网站999久久久综合| 久久精彩视频| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲欧洲日产国产综合网| 久久激情五月激情| 国产伦精品一区二区三区视频孕妇 | 欧美午夜精品| 亚洲免费观看高清完整版在线观看熊| 久久久综合免费视频| 国产精品一二一区| 中文欧美字幕免费| 欧美激情综合亚洲一二区| 在线观看欧美激情| 久久麻豆一区二区| 国产丝袜美腿一区二区三区| 亚洲免费在线观看视频| 欧美新色视频| 国产情侣一区| 亚洲少妇最新在线视频| 欧美日韩八区| 亚洲人成人99网站| 欧美华人在线视频| 亚洲经典在线看| 欧美刺激性大交免费视频| 在线观看成人一级片| 久久视频在线视频| 激情另类综合| 久久综合激情| **性色生活片久久毛片| 久久综合色综合88| 在线观看一区视频| 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲日本久久| 欧美精品久久一区二区| 亚洲三级国产| 欧美日韩成人一区| 夜夜嗨av一区二区三区网页| 欧美日韩精品一区| 在线综合视频| 国产精品外国| 久久成人18免费观看| 国产又爽又黄的激情精品视频| 久久激情五月丁香伊人| 影音先锋亚洲精品| 麻豆av一区二区三区| 亚洲国产影院| 欧美日韩成人在线| 一区二区三区视频在线播放| 国产精品福利在线观看网址| 亚洲欧美日韩另类| 国产亚洲成精品久久| 久久欧美中文字幕| 亚洲激情社区| 欧美色另类天堂2015| 亚洲欧美日韩国产成人| 国产亚洲女人久久久久毛片| 久久综合久久久| 亚洲三级性片| 国产精品a久久久久久| 欧美一区二区三区免费视| 伊人春色精品| 欧美日本免费| 亚洲一区激情| 国产日韩亚洲欧美综合| 久久这里有精品视频| 亚洲精品看片| 国产精品欧美日韩一区| 久久久成人精品| 亚洲精品视频免费| 国产精品久久一区二区三区| 久久高清免费观看| 亚洲精品国产日韩| 国产精品女人网站| 久热精品视频在线| 在线中文字幕不卡| 国内精品伊人久久久久av影院| 欧美大学生性色视频| 亚洲一区三区电影在线观看| 韩日精品在线| 欧美日韩亚洲一区二区三区四区| 午夜影视日本亚洲欧洲精品| 亚洲国产mv| 国产精品无码永久免费888| 久久男人av资源网站| 夜夜狂射影院欧美极品| 国产一区二区三区自拍| 欧美人成在线视频| 久久成人18免费网站| 一区二区动漫| 伊人久久av导航| 国产精品户外野外| 美女精品国产| 午夜精品福利在线观看| 亚洲人成网站在线观看播放| 国产欧美一二三区| 欧美日韩黄视频| 久久人人97超碰精品888| 亚洲一品av免费观看| 一区在线观看| 国产精品午夜av在线| 欧美精品久久天天躁| 久久久久成人精品| 亚洲在线免费观看| 亚洲激情偷拍| 国产欧美在线播放| 国产精品a级| 欧美高清在线视频| 久久久久综合网| 亚洲淫性视频| 亚洲精品裸体| 一区在线影院| 国产欧美精品国产国产专区| 欧美精品在线网站| 另类av一区二区| 欧美亚洲免费高清在线观看| 一区二区欧美视频| 136国产福利精品导航网址| 国产精品久久久久国产a级| 欧美www在线| 久久黄金**| 午夜精品亚洲| 亚洲图片你懂的| 日韩午夜av在线| 亚洲福利在线视频| 韩国免费一区| 国产午夜精品久久久久久免费视| 欧美午夜在线观看| 欧美精彩视频一区二区三区| 久久频这里精品99香蕉| 欧美主播一区二区三区| 亚洲影音先锋| 在线一区二区三区四区| 亚洲日本va午夜在线影院| 亚洲激情在线观看| 在线成人免费观看| 国内精品国产成人| 国产精品自拍一区| 国产精品入口日韩视频大尺度| 欧美日韩久久不卡| 欧美精品日韩www.p站| 你懂的一区二区| 欧美xart系列高清| 奶水喷射视频一区| 毛片一区二区三区| 久久亚洲精品视频| 久久婷婷国产综合精品青草| 久久高清国产| 久久久久国产精品厨房| 久久狠狠久久综合桃花|