PDA

View Full Version : سوال: برقراری ارتباط بین کلاینت A با کلاینت B / سرور



No_Name
چهارشنبه 16 آذر 1390, 02:51 صبح
سلام

من یه برنامه ساختم که مثل یه چت عمل میکنه ولی این چت یک طرفس

یعنی کلاینت ها به سرور پیغام میفرستن و سرور دریافت میکنه ولی سرور نمیتونه پیغامی که مثلآ از کلاینت A فرستاده شده رو واسه کلاینت B بفرسته ( مثلآ بشه یک چت روم )

مثل این شکل:


http://csharp.net-informations.com/communications/img/csharp-chat-server-1.JPG


یه توضیح کلی میخوام که سرور باید چیکار کنه که واسه دیگر کلاینت ها پیغام رو ارسال کنه ؟

زیاد سورس باز کردم ولی متوجه نشدم که کجاش باعث شده که سرور پیغام ها رو به تمامی کلاینت ها ارسال میکنه

سورس نمیخوام، فقط یه توضیح که بتونم خودم کدش رو بسازم

از Socket استفاده میکنم + Threading

تشکر

hadis shaeidi
چهارشنبه 16 آذر 1390, 10:45 صبح
سلام
شمابایددرسمت سرورالگوریتمی روپیاده کنیدکه سرورخودش بتونه ارتباط کلاینت ها روبرقرارکنه یعنی وقتی کلاینتی متصل میشه لیست اون یعنی نام وipاون سمت سروربیادوازاونجا این لیست سمت کلاینت گرفته بشه وازاین طریق اگرهرکلاینت درخواستی به کلاینت دیگه داشته باشه بایدابتدابه سروربگه وسروردرخواست اون روبه کلاینت موردنظرارسال کنه این روش درستی هستش اگه بتونی پیاده سازیش کنی.
الگوریتمی که میگم یعنی شمایک زیربرنامه ایجادمیکنیدکه شامل یه سریcaseهستش که کارایجادکلاینت وحذف کلاینت و ارسال پیام و...هستن روایجادمیکنیدوسپس این زیربرنامه رودرقسمت بعدازacceptشدن فراخوانی میکنید.درهمون قسمتی که میخواین ارسالها ودریافتهاانجام بشه.هم درسمت سروروهم درسمت کلاینت این caseهابایدباشه.

No_Name
چهارشنبه 16 آذر 1390, 12:19 عصر
سلام
شمابایددرسمت سرورالگوریتمی روپیاده کنیدکه سرورخودش بتونه ارتباط کلاینت ها روبرقرارکنه یعنی وقتی کلاینتی متصل میشه لیست اون یعنی نام وipاون سمت سروربیادوازاونجا این لیست سمت کلاینت گرفته بشه وازاین طریق اگرهرکلاینت درخواستی به کلاینت دیگه داشته باشه بایدابتدابه سروربگه وسروردرخواست اون روبه کلاینت موردنظرارسال کنه این روش درستی هستش اگه بتونی پیاده سازیش کنی.
الگوریتمی که میگم یعنی شمایک زیربرنامه ایجادمیکنیدکه شامل یه سریcaseهستش که کارایجادکلاینت وحذف کلاینت و ارسال پیام و...هستن روایجادمیکنیدوسپس این زیربرنامه رودرقسمت بعدازacceptشدن فراخوانی میکنید.درهمون قسمتی که میخواین ارسالها ودریافتهاانجام بشه.هم درسمت سروروهم درسمت کلاینت این caseهابایدباشه.

تشکر دوست عزیز

میتونین با یه قطعه کد یه توضیحی مختصری بدین ؟

hadis shaeidi
چهارشنبه 16 آذر 1390, 16:28 عصر
مثلا درسمت سرور:
private bool ProcessClientRequests(string command, string parameter, int index, NetworkStream stream)
{
BinaryReader reader = new BinaryReader(stream);
BinaryWriter writer = new BinaryWriter(stream);
NetworkStream tempStream = null;
BinaryWriter tempWriter = null;
string[] temp = null;

switch (command)
{
case "EXIT":
return true;
break;
case "MSG":
DisplayReport(parameter);
break;
case "MSGTOALL":
for (int i = 0; i < clients.Count; i++)
{
tempStream = new NetworkStream(((connection)clients[i]).clientSocket);
tempWriter = new BinaryWriter(tempStream);
tempWriter.Write("MSG" + ":" + parameter);
}
break;
case "MSGTOONE":
temp = parameter.Split(',');
for (int i = 0; i < clients.Count; i++)
if (((connection)clients[i]).clientIndex == Convert.ToInt32(temp[1]))
{
tempStream = new NetworkStream(((connection)clients[i]).clientSocket);
tempWriter = new BinaryWriter(tempStream);
tempWriter.Write("MSG" + ":" + temp[0]);
}
break;
}
return false;
} // end of ProcessClie
درسمت کلاینت
private bool ProcessClientRequests(string command, string parameter, NetworkStream stream)
{
BinaryReader reader = new BinaryReader(stream);
BinaryWriter writer = new BinaryWriter(stream);
string[] nameAndIndex = null;
string[] temp = null;
switch (command)
{
case "EXIT":
this.serverIsOn = false;
return true;
break;
case "NEWCLIENT":
nameAndIndex = parameter.Split(',');
client newClient = new client();
newClient.name = nameAndIndex[0];
newClient.index = Convert.ToInt32(nameAndIndex[1]);
listOfClients.Add((object)newClient);
UpdateListViewItems(newClient.index.ToString() + "- " + newClient.name);

break;
case "REMCLIENT":
nameAndIndex = parameter.Split(',');
for (int i = 0; i < listOfClients.Count; i++)
if (Convert.ToInt32(nameAndIndex[1]) == ((client)listOfClients[i]).index)
{
RemoveClientFromListView(((client)listOfClients[i]).index + "- " + ((client)listOfClients[i]).name);
listOfClients.RemoveAt(i);
break;
}
حالا بایدبتونی بامتدهای writeکه براارسال هستش به اینcaseهااشاره کنی.