PDA

View Full Version : سوال: مشکل با سوکت در روش TCP



ferferi
پنج شنبه 11 شهریور 1389, 16:18 عصر
سلام دوستان
من برای طراحی پروژه ام یک مینی پروژه ساختم که بتوانم با استفاده از روش TCP کلاینت و سرور به هم پیام رسانی کنند، در این روش کانکت به درستی انجام میگیره و ارسال از کلاینت به درستی به سرور میرسه... مشکل اینجاست که بلد نیستم از سرور به کلاینت چیزی بفرستم
نمونه برنامه رو هم اینجا میذارم که بگید کجاش تغییرات میخواد...
قبلا متشکرم

اینم لینک دانلود:
http://barnamenevis.org/forum/attachment.php?attachmentid=55248&d=1283429236

ricky22
پنج شنبه 11 شهریور 1389, 17:02 عصر
سلام من پروژه شما را نگاه نکردم اما شاید این 2 لینک مفید باشه.
http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server
http://www.codeproject.com/KB/IP/high-performance-server.aspx

ferferi
پنج شنبه 11 شهریور 1389, 17:09 عصر
سلام من پروژه شما را نگاه نکردم اما شاید این 2 لینک مفید باشه.
http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server
http://www.codeproject.com/KB/IP/high-performance-server.aspx

لطفا اگه میتونی همین برنامه من رو کامل کنید...
من گیر کردم بد رقم

ricky22
پنج شنبه 11 شهریور 1389, 17:15 عصر
لطفا اگه میتونی همین برنامه من رو کامل کنید...
من گیر کردم بد رقم
شما عجالتا 2 لینکی که گزاشتم مشاهده بفرمایید.
سورس آماده
تمیز
بدون باگ
با توضیحات
بعد اگر مشکلت حل نشد دوباره مطرح بفرمایید

ferferi
پنج شنبه 11 شهریور 1389, 17:58 عصر
شما عجالتا 2 لینکی که گزاشتم مشاهده بفرمایید.
سورس آماده
تمیز
بدون باگ
با توضیحات
بعد اگر مشکلت حل نشد دوباره مطرح بفرمایید

آقا شرمنده، نه تنها این کد، کدهای زیادی دیدم
ولی مشکلم حل نشد
من کد TCP میخوام که با سنکرن کارکنه
شما که تو برنامه نویسی استاد هستید اگه میشه یه کد کامل برام بذاری که ساده باشه و به آسونی کلاینت و سرور به هم اطلاعات بفرستند ممنونت میشم

ferferi
پنج شنبه 11 شهریور 1389, 19:51 عصر
الان برنامه رو ساده تر کردم
کسی میتونه این سیستم رو درست کنه؟
اگه کسی تونست فوری بگه، تا جایی که بتونم جبران میکنم

توضیح:
یک سیستم هستش که هم به عنوان سرور و هم به عنوان کلاینت کار میکنه (یعنی باید کار کنه)
کار نمیکنه!

http://barnamenevis.org/forum/images/attach/zip.gif sc3.zip‏ (http://barnamenevis.org/forum/attachment.php?attachmentid=55255&d=1283441296) (41.1 کیلوبایت, 0 دیدار)

Sajjad.Aghapour
پنج شنبه 11 شهریور 1389, 23:15 عصر
مشکلتون چیه دوست عزیز؟ لطفا به جای قرار دادن پروژه مشکلتون رو بیان کنید

شما میتونید از Server به Client پیام بفرستید ولی برعکس نمیتونید.مگه پروسه ارسال باهم فرقی هم میکنه؟

ferferi
پنج شنبه 11 شهریور 1389, 23:23 عصر
خوب مشکل من هم همینه، ضمن اینکه من پروژه ام را نگذاشتم، یک سمپل گذاشتم


public partial class Form1 : Form
{
public Socket clientSocket;
public Socket serverSocket;
public byte[] byteData = new byte[1024];

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = checkBox1.Enabled = false;
if (checkBox1.Checked)
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 1600);

serverSocket.Bind(ipEndPoint);
serverSocket.Listen(4);

serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);
}
else
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1600);
clientSocket.BeginConnect(ipEndPoint, new AsyncCallback(OnConnect), null);

}
}
private void OnAccept(IAsyncResult ar)
{

Socket clientSocket = serverSocket.EndAccept(ar);

serverSocket.BeginAccept(new AsyncCallback(OnAccept), null);

clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None,new AsyncCallback(OnReceive_s), clientSocket);
}
private void OnReceive_s(IAsyncResult ar)
{

Socket clientSocket = (Socket)ar.AsyncState;
clientSocket.EndReceive(ar);

Data msgReceived = new Data(byteData);
textBox2.Text += msgReceived.TextMessage;

Data msgToSend = new Data();
msgToSend.TextMessage = textBox1.Text;
byteData = msgToSend.ToByte();
clientSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend_s), null);


}
public void OnSend_s(IAsyncResult ar)
{

//Socket client = (Socket)ar.AsyncState;
//client.EndSend(ar);
serverSocket.EndSend(ar);
}
private void OnReceive(IAsyncResult ar)
{

clientSocket.EndReceive(ar);

Data msgReceived = new Data(byteData);

if (msgReceived.TextMessage != null)
//textBox2.Text += msgReceived.TextMessage + "\r\n";
MessageBox.Show(msgReceived.TextMessage);
byteData = new byte[1024];

clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);


}
private void OnConnect(IAsyncResult ar)
{

clientSocket.EndConnect(ar);

Data msgToSend = new Data();
msgToSend.TextMessage = null;
byte[] b = msgToSend.ToByte();

clientSocket.BeginSend(b, 0, b.Length, SocketFlags.None, new AsyncCallback(OnSend), null);
}
private void OnSend(IAsyncResult ar)
{

clientSocket.EndSend(ar);
//DialogResult = DialogResult.OK;
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (checkBox1.Checked)
{
}
else
{
clientSocket.Close();
}
}

private void button2_Click(object sender, EventArgs e)
{

Data msgToSend = new Data();
msgToSend.TextMessage = textBox1.Text;

byteData = msgToSend.ToByte();

clientSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend), null);

byteData = new byte[1024];
clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);

}
}

Sajjad.Aghapour
پنج شنبه 11 شهریور 1389, 23:47 عصر
منظور من هم این بود این دو پروسه در Server و Client تفاوتی با همدیگر ندارند....

اگه پروتکل مورد نظر برای ارسال TCP هستش(که در اینجا باید TCP باشه) بهتر هست از TcpClient استفاده کنید.

برای رسیدن به جوابتون به Chat Application هایی که در نت همراه با آموزش گذاشته شده نگاهی بندازید....

ferferi
جمعه 12 شهریور 1389, 12:00 عصر
از اینکه جواب دادید ممنونم
اما من خودم الان بیش از 20تا برنامه دانلود کردم، ولی مشکلم حل نشده
شما یک توضیح کلی دادید
اگه میتونید کمکم کنید خواهشا کدها رو یک نگاه بندازید و از روی کد کمکم کنید، با دیدن برنامه های مختلف مشکلم حل نشده، یا اگه میتونید یک تک برنامه بهم معرفی کنید که هم کلاینت بشه و هم سرور و با TCP بتونه پیام ارسال کنه.
اگرم واسم درست کنی و بذاری اینجا ممنونت میشم، مشکلم اینجاست که همچین برنامه ای ندیدم!

ricky22
جمعه 12 شهریور 1389, 12:14 عصر
هم سرور به کلاینت پیام میده هم بر عکس
http://www.codeproject.com/KB/IP/TCPIPChat.aspx
http://www.codeproject.com/KB/IP/ipchat.aspx

Sajjad.Aghapour
جمعه 12 شهریور 1389, 12:38 عصر
1. با توجه به حرفی که قبلا زدم بهتر هست در اینجا از TcpClient استفاده کنید
2. چون برنامه های مختلفی رو دیدید به مشکل برخوردید.درحالیکه اگر یک مطلب کلی برای اونها میخوندید و اصول ارسال و دریافت رو درک میکردید به این مشکل برنمیخوردید
3. مثالی اولی که جناب ricky22 لینکش رو گذاشتن تا قبل از قسمت Creating the Server بخونید
4. یک نمونه از ارسال میتواند این باشد

//_client = tcpListener.AcceptTcpClient();
private void SendMessage(string msg)
{
try
{
NetworkStream ns;
lock (_client.GetStream())
{
ns = _client.GetStream();
}

byte[] bytesToSend = Encoding.ASCII.GetBytes(msg);
ns.Write(bytesToSend, 0, bytesToSend.Length);
ns.Flush();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}


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

پیشنهاد میکنم به یک منبع معتبر در زمینه برنامه نویسی Socket و راهکارهای آن مراجعه کنید/

موفق باشید/

ferferi
جمعه 12 شهریور 1389, 14:02 عصر
sajjadlove (http://barnamenevis.org/forum/member.php?u=47172) جان ممنونم، آقای ricky22 شما هم ممنون که توجه میکنید
نمونه برنامه ها را قبلا دیده بودم، و ضمن اینکه من فرصت ندارم مطلب کلی بخونم، پروژه ام همینجوری طول داده شده، حرف شما درسته
حالا من یک مثال میزنم و شما این مثال من را کامل کنید:
دستورات کلید کانکت:

private void button1_Click(object sender, EventArgs e) //connect
{

ip = IPAddress.Parse("127.0.0.1");
port = new IPEndPoint(ip, Int32.Parse("1600"));
socket = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

if (checkBox1.Checked)
{
socket.Bind(port);
socket.Listen(-1);

socket.Accept();
MessageBox.Show("Connect to Client is OK", "Server");

}
else
{
socket.Connect(port);
MessageBox.Show("Connect to Server is OK", "Client");

}
}و این هم دستور بسته شدن سوکت در خروج از فرم

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
socket.Close();
}و این هم دستور ارسال متن textbox به application دیگر

private void button2_Click(object sender, EventArgs e)
{
byte [] buffer = new byte [1024];

if (checkBox1.Checked)
{
buffer = Encoding.UTF8.GetBytes(textBox1.Text);
socket.Send(buffer);
}
else
{
buffer = Encoding.UTF8.GetBytes(textBox1.Text);
socket.Send(buffer);
}
}
خوب 2 تا مساله هست، یکی اینکه میخوام سند رو رسیو درست بشه و دوم اینکه بصورت آسنکرون باشه
فعلا اولی رو حل کنیم، برای دومی راه دارم، یعنی یک سند و رسیو برای این برنامه درست کنید که بدون مشکل باشه

C Sharp
شنبه 13 شهریور 1389, 13:25 عصر
اینو خیلی ساده سعی کردم واستون بنویسم ، یه چکی کنید اگه سوالی داشتین بپرسید

ferferi
شنبه 13 شهریور 1389, 21:32 عصر
کاش میتونستم هزارتا تشکر بزنم
دیگه داشتم نا امید میشدم!
الان نگاهش میکنم، میدونی چکار کردم؟ داشتم توی نرم افزار از دوتا پورت استفاده میکردم!!!
به هر حال مرسی