//服務器端程序
using System.IO;
using System.Net.Sockets;
using System.Net;
namespace PictureServer
{
class Program
{
static void Main(string[] args)
{
//在本機創(chuàng)建一個TcpListener,端口是8888,
TcpListener listener = new TcpListener(IPAddress.Any, 8888);
//開始監(jiān)聽,
listener.Start();
//循環(huán),等待客戶端連接
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);
//將從客戶端流讀取的數(shù)據(jù)保存到字符串request中
string request =Encoding.ASCII.GetString(buffer).Substring(0, readBytes);
//如果客戶端的命令以LIST開頭,
if(request.StartsWith("LIST"))
{
// LIST request - return list
//利用類PictureHelper的函數(shù)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函數(shù)將文件里面的文件filename讀入到字節(jié)數(shù)組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();
}
}
//靜態(tài)類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的內容讀到字節(jié)數(shù)組中
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.
//創(chuàng)建一個NetworkStream,
NetworkStream clientStream =client.GetStream();
//request是"LIST"
stringrequest = "LIST";
//將request放入到字節(jié)數(shù)組requestBuffer中
byte[]requestBuffer = Encoding.ASCII.GetBytes(request);
//將請求寫入到NetworkStream中,發(fā)送到服務器端
clientStream.Write(requestBuffer, 0, requestBuffer.Length);
//獲取服務器端的回應
// Readthe response from the server.
byte[]responseBuffer = new byte[bufferSize];
//生成一個內存流memstream
MemoryStream memStream = new MemoryStream();
intbytesRead = 0;
do
{
//將網絡流中的數(shù)據(jù)按256字節(jié)一組的順序寫入到memStream中
bytesRead= clientStream.Read(responseBuffer, 0, bufferSize);
memStream.Write(responseBuffer, 0, bytesRead);
} while(bytesRead > 0);
clientStream.Close();
client.Close();
//從內存流讀取數(shù)據(jù)
byte[]buffer = memStream.GetBuffer();
stringresponse = Encoding.ASCII.GetString(buffer);
//將服務器返回的文件列表分解開,文件名保存到字符串數(shù)組fileName中
string[]fileNames = response.Split(':');
//將字符串數(shù)組填到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中,發(fā)送到服務器端
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();
//從內存流中讀取圖片文件數(shù)據(jù),顯示在picturebox控件上
pictureBox.Image = Image.FromStream(memStream);
}
catch (Exception exce)
{
MessageBox.Show(exce.Message);
}
}