PDA

View Full Version : سوال: عدم ارسال کامل داده ها از سرور به کلاینت



pooya1072
سه شنبه 03 اردیبهشت 1398, 00:28 صبح
سلام
من یک برنامه ساده کلاینت و سرور دارم. توی این برنامه بعد از اینکه سرور استارت شد به صورت ناهمزمان (اسینکرون) شروع میکنه به گوش کردن به پورت معین شده. به محض اینکه کلاینت به سرور متصل بشه از سمت سرور قراره که اعداد 1 تا 10 به صورت جداگانه ارسال بشه. ولی مشکل اینه که فقط یک یا دو عدد اول ارسال میشه. یعنی بعضی وقتها فقط عدد 1 و بعضی وقتها فقط عدد 1 و 2 ارسال میشه . من هم کد سرور و هم کد کلاینت رو میزارم . دوستان بررسی کنید ببینید مشکل کجای کاره. با تشکر

کد سمت سرور :
(توی خط 21 تا 24 ارسال اعداد 1 تا 10 قراره انجام بشه.)

using System.IO;using System.Net;
using System.Net.Sockets;
class Module1 {
private TcpClient pClient;
private TcpListener Listener;
private Threading.ManualResetEvent mre = new Threading.ManualResetEvent(false);

static void Main()
{
mre.Reset();
Listener = new TcpListener(IPAddress.Any, 6000);
Listener.Start();
Listener.BeginAcceptTcpClient(new AsyncCallback(new System.EventHandler(this.AcceptClient)), Listener);
mre.WaitOne();
}

static void AcceptClient(IAsyncResult ar)
{
pClient = Listener.EndAcceptTcpClient(ar);
Listener.BeginAcceptTcpClient(new AsyncCallback(new System.EventHandler(this.AcceptClient)), Listener);
for (i = 1; (i <= 10); i++)
{
Module1.Send(i);
}

}

public static void Send(string Messsage)
{
StreamWriter sendMessage = new StreamWriter(pClient.GetStream);
sendMessage.WriteLine(Messsage);
sendMessage.Flush();
}
}

و کد سمت کلاینت :

using System.Net;using System.IO;
using System.Net.Sockets;
class Module1
{
private TcpClient client;
private StreamWriter sWriter;
private Threading.ManualResetEvent mre = new Threading.ManualResetEvent(false);

static void Main()
{
mre.Reset();
try
{
client = new TcpClient("localhost", 6000);
client.GetStream.BeginRead(new byte[] {0}, 0, 0, new AsyncCallback(new System.EventHandler(this.read)), client.GetStream);
}
catch (Exception ex)
{
MsgBox(ex.Message);
}

mre.WaitOne();
}

static void read(IAsyncResult ar)
{
try
{
NetworkStream ns = ar.AsyncState;
Int16 l = ns.EndRead(ar);
string msg = (new StreamReader(ns) + ReadLine);
Console.WriteLine(msg);
ns.BeginRead(new byte[] {0}, 0, 0, new AsyncCallback(new System.EventHandler(this.read)), ns);
}
catch (Exception ex)
{
MsgBox(ex.Message);
return;
}

}
}



در انتها این رو هم بگم که وقتی کد سمت سرور رو دیباگ می کنم (breakpoint روی حلقه for میزارم) و برنامه رو خط به خط اجرا کنم همه چیز درست کار میکنه و اعداد به طور کامل ارسال میشن ولی در اجرای نرمال مشکل بوجود میاد.

Shadow_net
سه شنبه 03 اردیبهشت 1398, 20:53 عصر
فکر میکنم با یک وقفه در حلقه مشکلتون حل بشه

System.Threading.Thread.Sleep(100);

یا

Task.Delay(1);

pooya1072
چهارشنبه 04 اردیبهشت 1398, 07:16 صبح
فکر میکنم با یک وقفه در حلقه مشکلتون حل بشه

System.Threading.Thread.Sleep(100);

یا

Task.Delay(1);

ممنون از پاسخ شما
البته از این روش استفاده کردم ولی دنبال راهکاری بودم که پیامهای ورودی را در یک صف قرار بده و به نوبت پردازش کنه که هنوز چیزی پیدا نکردم

Shadow_net
چهارشنبه 04 اردیبهشت 1398, 14:47 عصر
ممنون از پاسخ شما
البته از این روش استفاده کردم ولی دنبال راهکاری بودم که پیامهای ورودی را در یک صف قرار بده و به نوبت پردازش کنه که هنوز چیزی پیدا نکردم
خب صف هم هست
می تونید از Queue استفاده کنید
https://www.guru99.com/c-sharp-queue.html
https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1?view=netframework-4.8

pooya1072
چهارشنبه 04 اردیبهشت 1398, 15:48 عصر
خب صف هم هست
می تونید از Queue استفاده کنید
https://www.guru99.com/c-sharp-queue.html
https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1?view=netframework-4.8
خب اساسا مشکل اصلی همینه که چطور درخواستهایی که قراره توسط تابع BeginRead دریافت بشه را در صف قرار داد یا حتی اصلا راهی هست که بشه به ورودی ها قبل از تابع BeginRead دسترسی داشت؟