使用tcp/ip傳送文件。簡單設計思路是在服務器端啟動TcpListener監聽客戶端的Socket連接。
當Client發送連接請求,TcpListener捕獲當前請求的Socket,並獲取收到的數據(字符串,稱為命令)。
然後由命令處理程序分析字符串,如果字符串頭部包含GET_FILE則為下載文件請求。
例:如客戶機向服務器程序發送請求:"GET_FILE|D:PUBLISHTEST.DLL"。首先TcpListener捕獲
當前請求的Socket,收到字符串,如果是下載文件請求就通過socket.SendFile(file="D:PUBLISH
TEST.DLL")將文件傳送給當前Socket。在客戶端由NetworkStream.Read()方法接收來自服務器發送的文件。
同理,如果實現網上象棋對戰游戲,通過Socket.Send(命令)->分析->執行->移動棋子,不就實現了嗎?
Socket應用往往不止這些,學會Socket組件是網絡編程基礎。
服務器界面運行圖。
客戶機界面截圖:
輸入要下載的文件名及保存目錄。
思考:
1.如果提供一個下載文件清單,是不是可以批量下載文件?
2.如果服務器上的文件與本機的文件最後修改日期相比較,是不是可以改裝為版本升級程序?
3.如果客戶端向服務器上傳文件,是不是可以改裝成mini版的ftp程序?
4.如果收到的byte[]是某對象的序列化數據,而後將byte[]還原成對象,是不是實現tcp/ip傳送對象?
5.如果對象是一個電腦向另一個電腦傳送的某個命令,是不是可以實現網上對戰游戲?
6.你思想有多遠socket就能走多遠。
部分原代碼:
UpgraderClient.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace VJSDN.Tech.TcpIpDownloader
{
/// <summary>
/// Tcp/ip下載器客戶端
/// </summary>
public class UpgraderClient
{
private OutputInvoke _writeOutput = null;
public UpgraderClient(OutputInvoke writeOutput)
{
_writeOutput = writeOutput;
}
/// <summary>
/// 下載文件
/// </summary>
public bool DownloadFile(string file, string savePath)
{
string hostIp = "8.8.8.2"; //主機ip
int hostPort = 12346; //主機端口
try
{
TcpClient client = new TcpClient();
client.ReceiveTimeout = 1000 * 60;
if (client == null || file.Trim() == "") return false;
TryConnect(client, hostIp, hostPort); //連接服務器
if (!client.Connected) return false;//連線線失敗,退出
byte[] bs = Encoding.Unicode.GetBytes("GET_FILE|" + file);
client.Client.Send(bs); //發送請求
//開始接受數據....
NetworkStream ns = client.GetStream();
MemoryStream ms = new System.IO.MemoryStream();
byte[] resBytes = new byte[256];
int resSize;
do
{
resSize = ns.Read(resBytes, 0, resBytes.Length);
string msg = Byte2Str(resBytes);
if (msg.Trim().ToUpper() == "FILE_NOT_FOUND")
{
if (_writeOutput != null) _writeOutput("找不到文件:" + file);
&n