PDA

View Full Version : یه سوال درمورد soket programming



roshanak_g
پنج شنبه 15 مرداد 1388, 14:05 عصر
من یه برنامه می نویسم که اطلاعات باید به صورت دو طرفه ارسال و دریافت بشه ،منتهی برنامه ای که الان نوشتم به صورت یکطرف است یعنی فقط سرور به اطلاعات پورت گوش میکنه و کلاینت اطلاعات رو ارسال می کنه ،مشکلی که دارم این که این کد برای ارسال اطلاعات از طرف سرور به کلاینت و دریافت اطلاعات از طرف کلاینت عمل نمیکنه،اگه بخوام این ارسال و دریافت رو دو طرفه کنم چی کار باید بکنم؟
البته کدی که نوشتم رو می فرستم
با نهایت تشکر
کد سمت سرور

static class TcpServer
{
static private int Port = 13000;


();
1";
static TcpListener L = new TcpListener(IPAddress.Any, Port);

public static void Run()
{



L.Start();
while (true)
{
Application.DoEvents();
try
{
TcpClient C = L.AcceptTcpClient();
NetworkStream S = C.GetStream();
byte[] GetByte = new byte[1000];
int i = S.Read(GetByte, 0, GetByte.Length);
string GMsg = Encoding.ASCII.GetString(GetByte, 0, i);
string SMsg = "Ok";
byte[] SendByte = Encoding.ASCII.GetBytes(SMsg);
S.Write(SendByte, 0, SendByte.Length);
S.Close();
C.Close();
}
catch { }
}
}


}
کد کلاینت

public class ClientTcp
{
private int Port = 13000;
private string IP = "127.0.0.1"; //"172.23.22.107";
public void Send(string Msg)
{
if (Msg.Trim() == "") return;
Application.DoEvents();
TcpClient C = new TcpClient();
C.Connect(IP, Port);
NetworkStream S = C.GetStream();
byte[] SendByte = Encoding.ASCII.GetBytes(Msg);
S.Write(SendByte, 0, SendByte.Length);
// this.listBox1.Items.Add("Send : " + Msg);
byte[] GetByte = new byte[1000];
int i = S.Read(GetByte, 0, GetByte.Length);
string GMsg = Encoding.ASCII.GetString(GetByte, 0, i);
// this.listBox1.Items.Add("Get : " + GMsg);
S.Close();
C.Close();
}


}

mostafa_shaeri_tj
پنج شنبه 15 مرداد 1388, 14:39 عصر
به نظرم اولین کاری که بایستی در سمت سرور بکنی اینکه این خط ها رو از حلقه ی while بیرون بیاری


TcpClient C = L.AcceptTcpClient();
NetworkStream S = C.GetStream();


چون برای هر دفعه دریافت اطلاعات نیاز به برقراری مجدد ارتباط نیست. در ضمن کد بستن ارتباط هم باید پاک شه.

همین کار رو نیز باید برای کلاینت انجام بدی . یعنی هر دفعه که میخواد اطلاعات بفرسته لازم نیست ارتباط از نو برقرار بشه . یک بار برقرای ارتباط کافیه.
وقتی ارتباط همیشه برقرار باشه دو طرف میتونن به راحتی پیام ارسال کنن.
اما در این برنامه ارتباط موقعی که کلاینت میخواد اطلاعات بفرسته برقرار میشه و بعد از اون بلا فاصله ارتباط قطع میشه.

roshanak_g
پنج شنبه 15 مرداد 1388, 18:32 عصر
این کارها رو کردم ولی بازم error می ده ضمنا کد سرور رو من تو تایمر فراخوانی می کنم

mostafa_shaeri_tj
جمعه 16 مرداد 1388, 12:06 عصر
پس صبر کن تا خودم کد سرور و کلاینت و بنویسم بزارم اینجا. :چشمک:

mostafa_shaeri_tj
جمعه 16 مرداد 1388, 13:54 عصر
دوتا برنامه رو برات نوشتم . از multi threading استفاده کردم. چون راه دیگه ای نبود.
اگه مشکلی داشتی تو ی کدای نوشته شده . در خدمتم