C# Socket 文件发送传输
客户端向服务器发送文件:
服务器:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Server
{
class Program
{
static void Main(string[] args)
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(ip);
sock.Listen(1);
while(true)
{
Socket client = sock.Accept();
if (client.Connected)
{
Thread clientThread = new Thread(new ParameterizedThreadStart(MyClient));
clientThread.IsBackground = true;
clientThread.Start(client);
}
}
}
private const int BUFFERSIZE = 1024/* * 1024*/;
private static string _path = @"D:\";
private static void MyClient(object socket)
{
Socket clientSocket = socket as Socket;
string clientName = clientSocket.RemoteEndPoint.ToString();
Console.WriteLine("新客户端连接:" + clientName);
try
{
while(true)
{
byte[] buffer = new byte[BUFFERSIZE];
int countReceive = clientSocket.Receive(buffer);
string receiveStr = Encoding.Default.GetString(buffer, 0, countReceive);
Console.WriteLine("收到:" + clientName + ":" + receiveStr);
string[] command = receiveStr.Split(',');
string fileName = null;
long fileLength = -1L;
if (command[0] == "nameAndLength")
{
fileName = command[1];
fileLength = long.Parse(command[2]);
clientSocket.Send(Encoding.Default.GetBytes("ok"));
Console.WriteLine("接收文件:" + fileName + " 请等候……");
long recieved = 0L;
using (FileStream fsWriter = new FileStream(Path.Combine(_path,fileName), FileMode.Create, FileAccess.Write, FileShare.None))
{
int recive;
while(recieved < fileLength)
{
recive = clientSocket.Receive(buffer);
fsWriter.Write(buffer, 0, recive);
fsWriter.Flush();
recieved += recive;
Console.WriteLine("已接收数据:{0}/{1}", recieved.ToString(), fileLength.ToString());
}
Console.WriteLine("接收完成……\n");
}
}
}
}
catch (Exception)
{
Console.WriteLine("客户端:" + clientName + "退出");
}
}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Client
{
class Program
{
private static Socket _sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static void Main(string[] args)
{
_sock.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080));
Console.WriteLine("连接成功…");
while (true)
{
Console.WriteLine("请输入需要发送的文件路径:");
string path = Console.ReadLine();
try
{
using (FileStream fsReader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
{
long sended = 0L;
long fileLength = fsReader.Length;
string fileName = Path.GetFileName(path);
string sendStr = "nameAndLength," + fileName + "," + fileLength.ToString();
_sock.Send(Encoding.Default.GetBytes(sendStr));
const int BUFFERSIZE = 1024/* * 1024*/;
byte[] buffer = new byte[32];
int recvCount = _sock.Receive(buffer);
string mes = Encoding.Default.GetString(buffer, 0, recvCount);
if (mes == "ok")
{
Console.WriteLine("发送文件:" + fileName + " 请等待……");
byte[] fileBuffer = new byte[BUFFERSIZE];
int readCount;
int sending;
int readCountLeft;
while ((readCount = fsReader.Read(fileBuffer, 0, BUFFERSIZE)) != 0)
{
sending = 0;
readCountLeft = readCount;
while ((sending += _sock.Send(fileBuffer, sending, readCountLeft, SocketFlags.None)) < readCount) // 判断发送完
{
readCountLeft = readCount - sending;
}
sended += sending;
Console.WriteLine("发送数据:{0}/{1}", sended.ToString(), fileLength.ToString());
}
Console.WriteLine("发送完毕……\n");
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
命令行
客户端向服务器发文件。
服务器:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Server
{
class Program
{
/*exe 127.0.0.1 8080 D:\\*/
static void Main(string[] args)
{
int port = int.Parse(args[1]);
_path = args[2];
Console.WriteLine("开启服务器:{0}", args[0] + " " + args[1]);
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(args[0]), port);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(ip);
sock.Listen(100);
while (true)
{
Socket client = sock.Accept();
if (client.Connected)
{
Thread clientThread = new Thread(new ParameterizedThreadStart(MyClient));
clientThread.IsBackground = true;
clientThread.Start(client);
}
}
}
private const int BUFFERSIZE = 1024 * 1024;
private static string _path = @"D:\";
private static void MyClient(object socket)
{
Socket clientSocket = socket as Socket;
string clientName = clientSocket.RemoteEndPoint.ToString();
Console.WriteLine("新客户端连接:" + clientName);
try
{
while (true)
{
byte[] buffer = new byte[BUFFERSIZE];
int countReceive = clientSocket.Receive(buffer);
string receiveStr = Encoding.Default.GetString(buffer, 0, countReceive);
Console.WriteLine("收到:" + clientName + ":" + receiveStr);
string[] command = receiveStr.Split(',');
string fileName = null;
long fileLength = -1L;
if (command[0] == "nameAndLength")
{
fileName = command[1];
fileLength = long.Parse(command[2]);
clientSocket.Send(Encoding.Default.GetBytes("ok"));
Console.WriteLine("接收文件:" + fileName + " 请等候……");
long recieved = 0L;
using (FileStream fsWriter = new FileStream(Path.Combine(_path, fileName), FileMode.Create, FileAccess.Write, FileShare.None))
{
int recive;
while (recieved < fileLength)
{
recive = clientSocket.Receive(buffer);
fsWriter.Write(buffer, 0, recive);
fsWriter.Flush();
recieved += recive;
Console.WriteLine("已接收数据:{0}/{1}", recieved.ToString(), fileLength.ToString());
}
Console.WriteLine("接收完成……\n");
}
}
}
}
catch (Exception)
{
Console.WriteLine("客户端:" + clientName + "退出");
}
}
}
}
客户端:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Client
{
class Program
{
private static Socket _sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
/*exe 127.0.0.1 8080 D:\\*/
static void Main(string[] args)
{
int port = int.Parse(args[1]);
string path = args[2];
_sock.Connect(new IPEndPoint(IPAddress.Parse(args[0]), port));
Console.WriteLine("连接成功…");
bool firstFlag = true;
while (true)
{
if (!firstFlag)
{
Console.WriteLine("请输入需要发送的文件路径:");
path = Console.ReadLine();
}
try
{
using (FileStream fsReader = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.None))
{
long sended = 0L;
long fileLength = fsReader.Length;
string fileName = Path.GetFileName(path);
string sendStr = "nameAndLength," + fileName + "," + fileLength.ToString();
_sock.Send(Encoding.Default.GetBytes(sendStr));
const int BUFFERSIZE = 1024 * 1024;
byte[] buffer = new byte[32];
int recvCount = _sock.Receive(buffer);
string mes = Encoding.Default.GetString(buffer, 0, recvCount);
if (mes == "ok")
{
Console.WriteLine("发送文件:" + fileName + " 请等待……");
byte[] fileBuffer = new byte[BUFFERSIZE];
int readCount;
int sending;
int readCountLeft;
while ((readCount = fsReader.Read(fileBuffer, 0, BUFFERSIZE)) != 0)
{
sending = 0;
readCountLeft = readCount;
while ((sending += _sock.Send(fileBuffer, sending, readCountLeft, SocketFlags.None)) < readCount) // 判断发送完
{
readCountLeft = readCount - sending;
}
sended += sending;
Console.WriteLine("发送数据:{0}/{1}", sended.ToString(), fileLength.ToString());
}
Console.WriteLine("发送完毕……\n");
firstFlag = false;
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了