服务如果关闭监听,效果如下图:
客服端运行,如下图:
输入服务器端的IP和端口号进行连接,效果如图:
5
下面设置文件保存位置,如图:
下面演示上传一个视频文件,然后再下载下来,其中上传过程的进度信息:
上传完成后的效果图:
6
下载文件的进度提示信息:
下载完成后,指定目录下就有了该文件了:
2.5 核心程序
2.5.1 服务器(server)程序如下
using System;
using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Net;
using System.Net.Sockets; using System.IO;
using System.Windows.Forms;
namespace TCP文件传输_服务器 {
class WorkThread {
byte[] buffer;
int bufferSize= 4096; Thread mythread; Socket handler;
public WorkThread(Socket workSocket) {
handler = workSocket;
buffer = new byte[bufferSize];
mythread = new Thread(BeginCommunication); }
public void Start() {
mythread.Start(); }
public void Abort() {
mythread.Abort(); }
private void BeginCommunication() {
while (true)//从客户端接收数据,直到连接断开
7
{ try {
int reCount = handler.Receive(buffer); string insStr =Encoding.BigEndianUnicode.
GetString(buffer, 0, reCount);
if (insStr.Substring(0, 4) == \)//收到下文件请求 {
string fileName = insStr.
Substring(5, insStr.Length - 5);
SendFile(fileName, handler); }
else if (insStr.Substring(0, 4) == \)//收到获取根目录请求
{
string listStr = GetFileNames(\, false); SendString(handler, listStr); }
else if (insStr.Substring(0, 4) == \)//收到获取指定目录内容请求
{
string path = insStr.Substring(5, insStr.Length - 5);
string listStr = GetFileNames(path, false); SendString(handler, listStr); }
else if (insStr.Substring(0, 4) == \)//获取下载文件夹请求,回复完整文件名列表 {
string path = insStr.Substring(5, insStr.Length - 5);
string listStr = GetFileNames(path, true); SendString(handler, listStr); }
else if (insStr.Substring(0, 4) == \)//收到上传文件请求
{
string reFileName = insStr.Substring(5, insStr.Length - 5);
LoadFile(reFileName, handler); }
else if (insStr.Substring(0, 4) == \)//收到断开连接命令
{
8
HostQuit(); break; } }
catch { HostQuit();break; } } }
private void LoadFile(string reFileName, Socket handler) { try {
FileStream fs = new FileStream(reFileName, FileMode.Create, FileAccess.Write);
handler.Receive(buffer, 8, SocketFlags.None);//接收文件大小
long filesize = BitConverter.ToInt64(buffer, 0); long receiveCount = 0;
while (receiveCount < filesize)//接收文件 {
int readcount = handler.Receive(buffer, bufferSize, SocketFlags.None);
fs.Write(buffer, 0, readcount); receiveCount += readcount; }
fs.Close(); } catch {
HostQuit(); }
}
private void SendFile(string fileNmae, Socket handler) { try {
FileStream fs = new FileStream(fileNmae, FileMode.Open, FileAccess.Read);
long size = fs.Length;
byte[] bysize = BitConverter.GetBytes(size);
handler.Send(bysize, 8, SocketFlags.None);//发送文件大小 BinaryReader br = new BinaryReader(fs); int sendcount = 0;
9