PDA

View Full Version : سوال: برقراری ارتباط چند کلاینت با یک سرور و ارسال پیام از سرور به همه کلاینتها



Me3ter
جمعه 13 اردیبهشت 1392, 09:20 صبح
سلام دوستان این موضوعی که من واسش تاپیک زدم تکراریه و مثلش زیاد هست داخل سایت که هیچ کدوم به تنیجه نریسده یا فقط سوال بوده یا لینک، من از دیروز ساعت 12 ظهر تا 1 شب سرچ کردم ولی به نتیجه نریسیدم
لطفا 1 پاسخ کامل بدید مرسی

من 1 برنامه تحت شبکه درست کردم که چند کاربر هم زمان باهاش کار میکنن که برای اینکه لیست نمایش داده ها همون گرید ویو ،با توجه به هر تغییر در دیتابیس توسط کابران دیگر به روز بشه و تغییراتو نمایش بده از سوکت استفاده کردم به طوری که بعد از هر تراکنش کلاینتی که تراکنش را انجام میده 1 را به سرور می فرسته و سرور هم 1 رو به همه ی کلاینتها می فرسته ، هر کلاینت که 1 را دریافت کرد گرید ویو رو مجدد از بانک بایند میکنه
حالا من تا کانکت کردن چند کلاینت به سرور پیش رفتم و همه کلاینها هم به سرور پیام میدن ولی نمیدونم سرور چه طور به همهی کلاینتهایی که وصل شدند پیام بده
من این برنامرو اول به شکل چت نوشتم تا از کارکردش مطمئن شم بعد به برنامه که بالا گفتم اظافه میکنم
کد سرور و کلاینت رو میزارم تا دوستان راحت تر رهنمایی کنن
نوع برنامه ویدوز فرمه

کد سرور
public partial class Form2 : Form
{
TcpClient clientSocket;
string clNo;
public Form2()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}



private void Form2_Load(object sender, EventArgs e)
{

Thread ctThread = new Thread(connect);
ctThread.Start();
}
private void connect()
{
TcpListener serverSocket = new TcpListener(9050);
TcpClient clientSocket = default(TcpClient);
int counter = 0;

serverSocket.Start();
MessageBox.Show(" >> " + "Server Started");

counter = 0;
while (true)
{
counter += 1;
clientSocket = serverSocket.AcceptTcpClient();
string con = clientSocket.Client.AddressFamily.ToString();
listBox1.Items.Add(" >> " + "Client No:" + Convert.ToString(counter) + " started!");

startClient(clientSocket, Convert.ToString(counter));
}

clientSocket.Close();
serverSocket.Stop();
listBox1.Items.Add(" >> " + "exit");
}




public void startClient(TcpClient inClientSocket, string clineNo)
{
this.clientSocket = inClientSocket;
this.clNo = clineNo;
Thread ctThread = new Thread(doChat);
ctThread.Start();
}
public void doChat()
{
int requestCount = 0;
byte[] bytesFrom = new byte[10025];
string dataFromClient = null;
Byte[] sendBytes = null;
string serverResponse = null;
string rCount = null;
requestCount = 0;

while ((true))
{
try
{
dataFromClient = null;
serverResponse = null;
requestCount = requestCount + 1;
NetworkStream networkStream = clientSocket.GetStream();
networkStream.Read(bytesFrom, 0, (int)clientSocket.ReceiveBufferSize);

dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
// dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));
Form2 frm = new Form2();

listBox1.Items.Add(" >> " + "From client-" + clNo +" : "+ dataFromClient);
if (dataFromClient.Substring(0,1) == "1")
{
rCount = Convert.ToString(requestCount);
serverResponse = "1";
//"Server to clinet(" + clNo + ") " + rCount;

sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
}
// listBox1.Items.Add(" >> " + serverResponse);
}
catch (Exception ex)
{
MessageBox.Show(" >> " + ex.ToString());
}
}
}

private void button1_Click(object sender, EventArgs e)
{

}

}


کد سمت کلاینت

public partial class Form1 : Form
{
private delegate void AddListBoxItemDelegate(object item);
static byte[] data = new byte[2048];
static string input, stringData;
static IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9050);
static Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
static int recv;
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}

private void Form1_Load(object sender, EventArgs e)
{
Thread nakh1 = new Thread(new ThreadStart(server_cncnt));
nakh1.Start();
}

private void button1_Click(object sender, EventArgs e)
{
input = textBox1.Text;
server.Send(Encoding.ASCII.GetBytes(input));
listBox1.Items.Add("Client :" + input);
textBox1.Text = "";

}
public void server_cncnt()
{
try
{
server.Connect(ipep);
//server.Send(Encoding.ASCII.GetBytes("H! Server"));
}
catch (SocketException)
{
MessageBox.Show("unable connect to server", "wairning");
}
while (true)
{

recv = server.Receive(data);
if (Encoding.ASCII.GetString(data) == ".|.")
{
server.Shutdown(SocketShutdown.Receive);
server.Close();

}
listBox1.Items.Add("Server :"+Encoding.ASCII.GetString(data, 0, recv));
//AddListBoxItem(Encoding.ASCII.GetString(data, 0, recv));
}
}
private void AddListBoxItem(object item)
{
if (this.listBox1.InvokeRequired)
{ // This is a worker thread so delegate the task.
this.listBox1.Invoke(new AddListBoxItemDelegate(this.AddListBoxItem), item);
}
else
{ // This is the UI thread so perform the task.
this.listBox1.Items.Add(item);
}
}
}

Me3ter
جمعه 13 اردیبهشت 1392, 10:40 صبح
دوستان عزیز رهنمایی کنید لطفا

Me3ter
جمعه 13 اردیبهشت 1392, 11:18 صبح
کسی نیست یاری بده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

_behnam_
جمعه 13 اردیبهشت 1392, 12:05 عصر
سلام دوست عزیز.
شما باید موقعی که توی سرور سوکت رو Accept میکنی سوکت هارو توی یک List آرایه ذخیره کنی و بعد با یه foreach راحت به تک تک کلاینت ها دیتا بفرستی

موفق باشی /

karimi5555
جمعه 13 اردیبهشت 1392, 12:12 عصر
ممکنه یه مثال کوچیک بزنید؟
ممنون

_behnam_
جمعه 13 اردیبهشت 1392, 12:20 عصر
بنده با سوکت سی شارپ آشنایی ندارم. معمولا توی پروژه هام از کلاس های آماده استفاده میکنم.
اول باید بگم که شما باید یک کلاس سوکت جدا واسه برنامتون بسازید که رویداد ها و متدهای مخصوص خود رو داشته باشه که کار مالتی کلاینت رو واستون آسونتر کنه و بعد به ادامه کار بپردازید.

Me3ter
جمعه 13 اردیبهشت 1392, 12:46 عصر
بنده با سوکت سی شارپ آشنایی ندارم. معمولا توی پروژه هام از کلاس های آماده استفاده میکنم.
اول باید بگم که شما باید یک کلاس سوکت جدا واسه برنامتون بسازید که رویداد ها و متدهای مخصوص خود رو داشته باشه که کار مالتی کلاینت رو واستون آسونتر کنه و بعد به ادامه کار بپردازید.
دوست عزیز مشکل من هم همینجاست دیگه هر چه قدر تلاش کردن واسه این کار به نتیجه نرسیدم

Me3ter
جمعه 13 اردیبهشت 1392, 13:05 عصر
یعنی واقعا کسی نیست که بلد باشه؟؟؟؟؟؟؟

_behnam_
جمعه 13 اردیبهشت 1392, 13:25 عصر
یکم شیبا باشید دوست عزیز :لبخندساده:
با توجه به اینکه میگید نمیتونید یک کلاس جدا واسه سوکت بنویسید من بهتوت پیشنهاد میکنم که از کلاس های آماده استفاده کنید.
یک DLL متن باز واستون میزارم که یه سوکت خوب هست واسه اینکاری که شما میخواید با ویژوال بیسیک .برنامه رو توی پروژتون به عنوان یه لایه جدید باز کنید و استفاده کنید. پروژتون رو بنویسید هرجا کمک خواستید بگید اگه سوادم رسید کمک میکنم :لبخندساده:

Me3ter
جمعه 13 اردیبهشت 1392, 13:32 عصر
یکم شیبا باشید دوست عزیز :لبخندساده:
با توجه به اینکه میگید نمیتونید یک کلاس جدا واسه سوکت بنویسید من بهتوت پیشنهاد میکنم که از کلاس های آماده استفاده کنید.
یک DLL متن باز واستون میزارم که یه سوکت خوب هست واسه اینکاری که شما میخواید با ویژوال بیسیک .برنامه رو توی پروژتون به عنوان یه لایه جدید باز کنید و استفاده کنید. پروژتون رو بنویسید هرجا کمک خواستید بگید اگه سوادم رسید کمک میکنم :لبخندساده:

دوست عزیز من سی شارپ کار میکنم ن ویبی

کامبیز اسدزاده
جمعه 13 اردیبهشت 1392, 13:41 عصر
توضیحات داده شد (http://barnamenevis.org/showthread.php?396510-%D9%85%D8%B4%D9%88%D8%B1%D8%AA-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D8%B1%D9%88%DB%8C-10-%D8%AA%D8%A7-%DA%A9%D9%84%D8%A7%DB%8C%D9%86%D8%AA-%D9%88-%D8%B3%D8%B1%D9%88%D8%B1%D8%8C%D9%BE%DB%8C%D8%A7%D 8%AF%D9%87-%D8%B3%D8%A7%D8%B2%DB%8C%D8%9F)

Me3ter
جمعه 13 اردیبهشت 1392, 13:51 عصر
دوست عزیز این توضیحات میشه پاک کردن صورت مساله من که تا اینجاش اومدم خب تا اخرش یاد می گیرم

کامبیز اسدزاده
جمعه 13 اردیبهشت 1392, 13:55 عصر
دوست عزیز این توضیحات میشه پاک کردن صورت مساله من که تا اینجاش اومدم خب تا اخرش یاد می گیرم

به هر حال روش Socket نویسی در یک شبکه داخلی در موارد آموزشی و کنفرانس ها بیشتر به درد میخوره نه در سیستم های مدیریتی :)

موفق باشید

_behnam_
جمعه 13 اردیبهشت 1392, 14:07 عصر
دوست عزیز من سی شارپ کار میکنم ن ویبی
بنده نگفتم که شما بیاید ویبی کار کنید گفتم این کلاس با ویبی نوشته شده!!
شما پروژه سی شارپ باز کنید یک لایه جدید ایجاد کنید به زبان ویبی که این پروژه رو بتونید استفاده کنید یا میتونید کامپایل کنید و DLL رو توی رفرنس ها اضافه کنید
واسه این میگم لایه جدید ایجاد کنید و سورس رو باز کنید که اگه توی برنامه خواستید امکاناتی به سوکت اضافه کنید کارتون راحت باشه

موفق باشید.

Me3ter
جمعه 13 اردیبهشت 1392, 15:12 عصر
نشد اقا :(

_behnam_
جمعه 13 اردیبهشت 1392, 15:19 عصر
چی نشد؟:لبخندساده:
اینجا نشد میتونه چندین مفهوم داشته باشه!
1. فایلی که دادید خراب بود
2.من بلد نیستم باهاش کار کنم
و .....
لطفا واضح توضیح بدید تا جواب واضح بگیرید .

ممنون/

Me3ter
جمعه 13 اردیبهشت 1392, 15:50 عصر
چی نشد؟:لبخندساده:
اینجا نشد میتونه چندین مفهوم داشته باشه!
1. فایلی که دادید خراب بود
2.من بلد نیستم باهاش کار کنم
و .....
لطفا واضح توضیح بدید تا جواب واضح بگیرید .

ممنون/
نه من نتونستم باهاش کار کانم