//服务器端程序
using System.IO;
using System.Net.Sockets;
using System.Net;
namespace PictureServer
{
class Program
{
static void Main(string[] args)
{
//在本机创建一个TcpListener,端口是8888,
TcpListener listener = new TcpListener(IPAddress.Any, 8888);
//开始监听,
listener.Start();
//循环,等待客户端连接
while(true)
{
const int bufferSize =256;
//接受客户端的连接,利用client保存连接的客户端
TcpClient client =listener.AcceptTcpClient();
//获取客户端的流stream
NetworkStream clientStream =client.GetStream();
byte[] buffer = newbyte[bufferSize];
int readBytes = 0;
//将客户端流读入到buffer中
readBytes =clientStream.Read(buffer, 0, bufferSize);
//将从客户端流读取的数据保存到字符串request中
string request =Encoding.ASCII.GetString(buffer).Substring(0, readBytes);
//如果客户端的命令以LIST开头,
if(request.StartsWith("LIST"))
{
// LIST request - return list
//利用类PictureHelper的函数GetFileListBytes,获取图片文件列表
byte[] responseBuffer =PictureHelper.GetFileListBytes();
//将服务器获取的图片文件列表写入到clientStream中
clientStream.Write(responseBuffer, 0,responseBuffer.Length);
}
//如果客户端的请求命令以FILE开头,即获取单个图片文件
else if(request.StartsWith("FILE"))
{
// FILE request - returnfile
// get the filename
//获取请求的文件名字
string[] requestMessage =request.Split(':');
string filename = requestMessage[1];
//利用File.ReadAllBytes函数将文件里面的文件filename读入到字节数组data中,
byte[] data =File.ReadAllBytes(Path.Combine(@"C:Documents andSettingsAdministratorMy DocumentsMy Pictures", filename));
// Send the picture to the client.
//将data中的文件内容写入到客户端clientStream中,传回客户端
clientStream.Write(data, 0, data.Length);
}
//关闭客户端流
clientStream.Close();
}
}
//静态类PictureHelper,
public static class PictureHelper
{
//提供文件夹中的文件列表
publicstatic string[] GetFileList()
{
string[] files =Directory.GetFiles(@"C:Documents and SettingsAdministratorMyDocumentsMy Pictures");
//去掉文件夹路径,只保留文件名
// Remove the directory pathfrom the filename.
for (int i = 0; i <files.Length; i++)
{
files[i] = Path.GetFileName(files[i]);
}
return files;
}
//将文件filename的内容读到字节数组中
publicstatic byte[] GetPictureBytes(string filename)
{
FileInfo fileInfo = newFileInfo(filename);
byte[] buffer = newbyte[fileInfo.Length];
using (FileStream stream =fileInfo.OpenRead())
{
stream.Read(buffer, 0, buffer.Length);
}
return buffer;
}
publicstatic byte[] GetFileListBytes()
{
// LIST request - returnlist
string[] files =PictureHelper.GetFileList();
StringBuilder responseMessage= new StringBuilder();
foreach (string s infiles)
{
responseMessage.Append(s);
responseMessage.Append(":");
}
byte[] responseBuffer =Encoding.ASCII.GetBytes(
responseMessage.ToString());
return responseBuffer;
}
}
}
}
//////客户端程序
using System.Net;
using System.Net.Sockets;
using System.IO;
private void buttonListPictures_Click(objectsender, EventArgs e)
{
const intbufferSize = 4096;
// Connectto the server.
//生成一个TcpClinet
TcpClientclient = new TcpClient();
//生成服务器的IPHostEntry,因为我的服务器和客户端在同一台计算机上,所以此处用localhost,实际应用中,此处的localhost应用用服务器的ip地址代替,
IPHostEntry host = Dns.GetHostEntry("localhost");
// 连接到服务器的8888端口
client.Connect(host.AddressList[0],8888);
// Send arequest to the server.
//创建一个NetworkStream,
NetworkStream clientStream =client.GetStream();
//request是"LIST"
stringrequest = "LIST";
//将request放入到字节数组requestBuffer中
byte[]requestBuffer = Encoding.ASCII.GetBytes(request);
//将请求写入到NetworkStream中,发送到服务器端
clientStream.Write(requestBuffer, 0, requestBuffer.Length);
//获取服务器端的回应
// Readthe response from the server.
byte[]responseBuffer = new byte[bufferSize];
//生成一个内存流memstream
MemoryStream memStream = new MemoryStream();
intbytesRead = 0;
do
{
//将网络流中的数据按256字节一组的顺序写入到memStream中
bytesRead= clientStream.Read(responseBuffer, 0, bufferSize);
memStream.Write(responseBuffer, 0, bytesRead);
} while(bytesRead > 0);
clientStream.Close();
client.Close();
//从内存流读取数据
byte[]buffer = memStream.GetBuffer();
stringresponse = Encoding.ASCII.GetString(buffer);
//将服务器返回的文件列表分解开,文件名保存到字符串数组fileName中
string[]fileNames = response.Split(':');
//将字符串数组填到ListBox中
this.listFiles.DataSource = fileNames;
}
//获取单个图片文件,并显示之
private void buttonGetPicture_Click(objectsender, EventArgs e)
{
const intbufferSize = 4096;
TcpClientclient = new TcpClient();
IPHostEntry host = Dns.GetHostEntry("localhost");
client.Connect(host.AddressList[0],8888);
NetworkStream clientStream = client.GetStream();
try
{
//生成请求,以FIlE:开头,后接在listbox中选择的文件名
string request = "FILE:" +this.listFiles.SelectedItem.ToString();
byte[] requestBuffer =Encoding.ASCII.GetBytes(request);
//将请求写入到clientStream中,发送到服务器端
clientStream.Write(requestBuffer, 0, requestBuffer.Length);
byte[] responseBuffer = newbyte[bufferSize];
MemoryStream memStream = new MemoryStream();
intbytesRead = 0;
do
{
//获取服务器端的回应,
bytesRead =clientStream.Read(responseBuffer, 0, bufferSize);
//服务器的回应写入到memStream
memStream.Write(responseBuffer, 0, bytesRead);
} while(bytesRead > 0);
clientStream.Close();
client.Close();
//从内存流中读取图片文件数据,显示在picturebox控件上
pictureBox.Image = Image.FromStream(memStream);
}
catch (Exception exce)
{
MessageBox.Show(exce.Message);
}
}