pooya1072
سه شنبه 03 اردیبهشت 1398, 01: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 میزارم) و برنامه رو خط به خط اجرا کنم همه چیز درست کار میکنه و اعداد به طور کامل ارسال میشن ولی در اجرای نرمال مشکل بوجود میاد.
من یک برنامه ساده کلاینت و سرور دارم. توی این برنامه بعد از اینکه سرور استارت شد به صورت ناهمزمان (اسینکرون) شروع میکنه به گوش کردن به پورت معین شده. به محض اینکه کلاینت به سرور متصل بشه از سمت سرور قراره که اعداد 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 میزارم) و برنامه رو خط به خط اجرا کنم همه چیز درست کار میکنه و اعداد به طور کامل ارسال میشن ولی در اجرای نرمال مشکل بوجود میاد.