السلام عليكم إخواني ..
قمت بتصميم برنامج بسيطة يستخدم Socket , بحيث يقوم الخادم بتقديم خدمة ارسال ملف إلى Client , وجاء التصميم على النحو التالي :
FileServiceServer : السيرفر الذي يقدم خدمة إرسال الملفات إلى الزبائن .
MasterServer : وهو السيرفر الوسيط بين الزبائن و بين خدمة الملفات FileServiceServer .
Client : الذي يطلب الخدمة .
كما تشاهدون في الصورة .. الية النقل و الإستقبال و الإرسال.

في البرنامج الذي صممته قمت باختباره على النحو التالي :
يقوم الزبون بطلب الخدمة من MasterServer و ذلك بإرسال الإشارة f- , ويليها إرسال الزبون أيضا مسار الملف المطلوب من السيرفر ..
يقوم الوسيط السابق بإرسال مسار الملف إلى File Service Server حتى ينفذ الخدمة المطلوبة و يرسل الملف المطلوب إلى الزبون ( مارا بــ الوسيط Master Server ) ,و يقوم البرنامج بحفظه على جهاز الزبون تحت المسار و اسم الملف التالي :
C:\\myImg.jpg
هنا على افتراض ان الملف المطلوب من السيرفر هو عبارة عن صورة .
هنا ظهر مشكلتين :
الأولى : أن السيرفر يرسل الصورة إلى الزبون ,, لكن للأسف تكون مشوهة ...
الثانية : أنه لو حاول الزبون طلب الخدمة ثانية من خلال إرسال الإشارة f- و مسار الصورة , فإنه يحدث Exception .
اسف على الإطالة , وأرجو منكم الفائدة و جزاكم ربي خيرا .
الكود : كما يلي :
FileService.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
namespace FileServiceServer
{
class FileService
{
private TcpListener tcp;
private BinaryReader reader;
private BinaryWriter writer;
private NetworkStream netStream;
private Socket socket;
public void connect()
{
tcp = new TcpListener(6500);
tcp.Start();
Console.WriteLine("FileService start..");
socket = tcp.AcceptSocket();
Console.WriteLine("FileService accept Master Server..");
netStream = new NetworkStream(socket);
reader = new BinaryReader(netStream);
writer = new BinaryWriter(netStream);
serveClient();
}
public void serveClient()
{
while (true){
String filePath = reader.ReadString();
byte[] buf = File.ReadAllBytes(filePath);
int size = buf.Length;
writer.Write(size);
writer.Write(buf);}
}
public void close()
{
writer.Close();
reader.Close();
socket.Close();
tcp.Stop();
}}}MainServer.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
using System.Threading;
namespace MasterServer
{
class MainServer
{
private TcpListener tcp;
private TcpClient fileServiceClient;
private TcpClient calcServiceClient;
private NetworkStream fileServiceStream;
private NetworkStream calcServiceStream;
private BinaryWriter fileServiceWriter;
private BinaryWriter calcServiceWriter;
private BinaryReader fileServiceReader;
private BinaryReader calcServiceReader;
public void connect()
{
connectToMainServers();
beMainServerForClient();
}
public void connectToMainServers()
{
fileServiceClient = new TcpClient("localhost", 6500);
fileServiceStream = fileServiceClient.GetStream();
fileServiceWriter = new BinaryWriter(fileServiceStream);
fileServiceReader = new BinaryReader(fileServiceStream);
}
public void beMainServerForClient()
{
tcp = new TcpListener(12500);
tcp.Start();
Console.WriteLine("Master Server start..");
ThreadStart t = new ThreadStart(recive);
Thread thread = new Thread(t);
thread.Start();
}
public void recive()
{
Socket socket = tcp.AcceptSocket();
Console.WriteLine("Master Server accept new Client..");
NetworkStream stream = new NetworkStream(socket);
BinaryReader reader = new BinaryReader(stream);
BinaryWriter writer = new BinaryWriter(stream);
while (true)
{
String mark = reader.ReadString();
Console.WriteLine("Master Server Check for Choice: "+mark);
if (mark.Equals("-f", StringComparison.CurrentCultureIgnoreCase))
{
String path = reader.ReadString();
Console.WriteLine("Master Server recive Path := "+path);
fileServiceWriter.Write(path);
int size = fileServiceReader.ReadInt32();
byte[] buf = new byte[size];
fileServiceReader.Read(buf, 0, buf.Length);
writer.Write(buf.Length);
writer.Write(buf, 0, buf.Length);
Console.WriteLine("Master Server send the File..");
}
else
{
writer.Write("Server >> Thanks for sending anything..");
}
}
}
}
}Client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.IO;
namespace ClientsDomain
{
class Program
{
static void Main(string[] args)
{
TcpClient client = new TcpClient("localhost", 12500);
NetworkStream net = client.GetStream();
BinaryReader reader = new BinaryReader(net);
BinaryWriter writer = new BinaryWriter(net);
Console.Write("Client >> ");
String mark = Console.ReadLine();
while (!mark.Equals("exit", StringComparison.CurrentCultureIgnoreCase))
{
if (mark.Equals("-f", StringComparison.CurrentCultureIgnoreCase))
{
writer.Write(mark);
writer.Flush();
Console.Write("Client >> Enter Path : >> ");
String path = Console.ReadLine();
writer.Write(path);
int size = /*int.Parse(*/reader.ReadInt32()/*)*/;
byte[] buf = new byte[size];
reader.Read(buf, 0, buf.Length);
File.WriteAllBytes("C:\\myImg.jpg", buf);
}
Console.Write("Client >> ");
mark = Console.ReadLine();
}
}
}
}
