文档库 最新最全的文档下载
当前位置:文档库 › c# ftp 客户端和服务器

c# ftp 客户端和服务器

配套的服务器和客户端,用c#实现ftp功能,使用socket实现。
网上查到的不是运行有错误,就是没有配套的另一端,恶心的很。干脆我发布个能用的简单版。
本版是可以交互字符串的命令行(控制台)版本。刚刚在vs2008下运行成功。
大家可以在此基础上实现更多的功能,也可以小修小改,弄成窗体版本。
各种功能实现的思想:
我的思路是
1 不同命令使得服务器和客户端交互不同的字符串
2 两者通过if语句比照字符串来识别不同的需求

下载(上传)功能的扩充:先比照字符串发现是下载,比如客户端发给服务器"down:3.txt"down标记着是下载,3.txt是文件名,获得了文件名之后先建立个空的文件流,然后把服务器接下来发来的文件的内容(byte数组类型)一批一批地写入文件流,写完后关闭文件流就ok了。

登陆功能的扩充:服务器端弄个bool类型的变量,用它来控制所谓的登陆

图形界面的扩充:c#可以直接从工具栏中把有用的控件拖入设计窗口,双击控件进入代码编辑界面,进去写代码就可以了,其实就是把控制台版本的相关代码沾过来,小修小改就好。




下面是服务器端完整代码


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using https://www.wendangku.net/doc/1a7914625.html,;
using https://www.wendangku.net/doc/1a7914625.html,.Sockets;

namespace FtpMyServer
{
class Server
{
static void Main(string[] args)
{
const int StreamSize = 256;
const int Port = 2010; //端口号
var ipAddr = new IPAddress(new byte[] { 127, 0, 0, 1 });
var talk = new List
{
"aaa","bbb","ccc"
};
var mSvr = new Server();
var AsciiEnc = new ASCIIEncoding();
var inStream=new byte[StreamSize];
var outStream=new byte[StreamSize];

Random rnd = null;
string reqString = string.Empty;
int index = 0;

var tcpl = new TcpListener(ipAddr, Port);//tcpl是“{127,0,0,1},2010”的sockets.Listen

tcpl.Start();// 开始侦听传入的连接请求。tcpl是“{127,0,0,1},2010”的sockets.Listen

Console.WriteLine("服务器开始监听");

do
{
try
{
//服务器到这里就等待数据,不走了
Socket sock = tcpl.AcceptSocket();//tcpl是“{127,0,0,1},2010”的sockets.Listen
// 摘要:
// 接受挂起的连接请求。
//
// 返回结果:
// 用于发送和接收数据的 https://www.wendangku.net/doc/1a7914625.html,.Sockets.Socket。
//
// 异常:
// Sy

stem.InvalidOperationException:
// 尚未通过调用 https://www.wendangku.net/doc/1a7914625.html,.Sockets.TcpListener.Start() 来启动该侦听器。

//客户端到了:var myClient = new TcpClient(LocalHost, Port);之后
//开始了下面的
//Socket sock 是“{127,0,0,1},2010”的sockets.Listen的.AcceptSocket,在等客户端发送request to 服务器
//客户端发送语句:myStream.Write(outStream, 0, outStream.Length);
//服务器这边receive。
int count = sock.Receive(inStream, inStream.Length, 0);
reqString = AsciiEnc.GetString(inStream, 0, count);

Console.WriteLine(reqString);

rnd = new Random();
index = rnd.Next(talk.Count);

outStream = AsciiEnc.GetBytes(talk[index] as string);

//服务器这边收了到客户端的请求
//服务器把应答发送给客户端。
sock.Send(outStream, outStream.Length, 0); //Socket sock 是“{127,0,0,1},2010”的sockets.Listen的.AcceptSocket
}
catch (SocketException sockEx)
{
Console.WriteLine("generic exception message:{0}", sockEx.ToString());
}

} while (reqString != "bye");

tcpl.Stop();
}
}
}





下面是客户端完整代码




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using https://www.wendangku.net/doc/1a7914625.html,;
using https://www.wendangku.net/doc/1a7914625.html,.Sockets;

namespace ftpClient_
{
class Client
{
static void Main(string[] args)
{
const int StreamSize = 256;
const int Port = 2010;
const string LocalHost = "localhost";
var ipEndpt = new IPAddress(new byte[] { 127, 0, 0, 1 }); //客户端居然没用到ip
var AsciiEnc = new ASCIIEncoding();
var inStream = new byte [StreamSize];
var outStream = new byte[StreamSize];

string freeAdvice;
string choice = "Q";

do
{
try
{
Console.WriteLine("\n money line\n");
Console.WriteLine("1 - get advice");
Console.WriteLine("Q - Quit");
Console.Write("\n please choose");
choice = Console.ReadLine();
Console.WriteLine(); //输入命令


// 功能:初始化 https://www.wendangku.net/doc/1a7914625.html,.Sockets.TcpClient 类的新实例
//并且把它连接到指定主机上的指定端口。
// 参数:
// hostname:
// 要连接到

的远程主机的 DNS 名。
// port:
// 要连接到的远程主机的端口号。
//连接到指定主机上的指定端口
var myClient = new TcpClient(LocalHost,Port);
//跳到服务器,服务器那边,下面的sock等着sock.receive呢。
//Socket sock = tcpl.AcceptSocket();//tcpl是“{127,0,0,1},2010”的sockets.Listen




Stream myStream = myClient.GetStream();//可能是服务器传东西过来时要用的
outStream = AsciiEnc.GetBytes("what is the secret of making money?");

if (choice == "1")
{
//发送request to 服务器
myStream.Write(outStream, 0, outStream.Length);

//清理数组中旧信息
for (int i = 0; i < inStream.Length; i++)
{
inStream[i] = 0;
}

//取回来自服务器的回答
myStream.Read(inStream, 0, inStream.Length); //instream固定是256
freeAdvice = AsciiEnc.GetString(inStream, 0, inStream.Length);
Console.WriteLine("服务器回复:{0}", freeAdvice);
}
else
{
//关闭与服务器的开会
outStream = AsciiEnc.GetBytes("bye");
myStream.Write(outStream, 0, outStream.Length);
}
}
catch(InvalidOperationException ioe)
{
Console.WriteLine("invalid operation message", ioe.Message);
}
catch(Exception e)
{
Console.WriteLine("generic exception message:{0}",e.Message);
}
}while(choice=="1");
}
}
}

相关文档