PDA

View Full Version : مشکل در TcpClient



nadia_1987
یک شنبه 27 تیر 1389, 14:34 عصر
یه مشکل دارم که هر جا گشتم و از هر کی پرسیدم جواب درستی ندادن .

مشکل اینه که یک برنامه client server با C# دارم می نویسم که سرور console هست و کلاینت هم windows form application.

توی کلاینت چندین فرم دارم که هر کدوم باید یه سری اطلاعات به سرور بفرستند و بگیرن ، توی هر کدوم مجبورم جداگانه tcpclient رو معرفی کنم .
TcpClient c = new TcpClient("localhost", 1000);

چون اگه معرفی نکنم این عبارت رو نمی شناسه
NetworkStream ns = c.GetStream();

از طرفی هر وقع معرفی می کنم دوباره توی سرور باید Accept کنم . که فکر نکنم این راهش باشه.

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

راهی نیست که بشه tcpclient رو یک بار فقط معرفی کرد و در تمام فرم ها از اون استفاده کرد ؟

ممنون می سم کمک کنید چون همه راه ها رو امتحان کردم . threading هم کار نمی کنه چون برای process های هم زمانه ، اما فرم های من هم زمان نیستند .

مرسی ، اگه لازم بود بگید یه sample کد ساده از سرور و کلاینت بذارم.

karim_medusa
یک شنبه 27 تیر 1389, 14:58 عصر
چرا از wcf استفاده نمی کنی .
سورس بزار ببینیم.

nadia_1987
یک شنبه 27 تیر 1389, 15:53 عصر
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
TcpListener l = new TcpListener(IPAddress.Any, 1000);
l.Start();
Console.WriteLine("Server has started.Waiting for clients...");

while (true)
{

TcpClient c = l.AcceptTcpClient();

Console.WriteLine(" >> Accept Connection From Clinet ");
NetworkStream ns = c.GetStream();
byte[] buf = new byte[200];
ns.Read(buf, 0, 100);
string st = System.Text.Encoding.ASCII.GetString(buf);
byte[] buf2;
if (string.Compare(name, "Administrator")==0)
{
string one = Convert.ToString(1);
buf2 = System.Text.Encoding.ASCII.GetBytes(Convert.ToStri ng(one));

ns.Write(buf2, 0, one.Length);
Console.WriteLine("this is admin");
}


// for form 2



TcpClient c2 = l.AcceptTcpClient();

Console.WriteLine(" >> Accept Connection From Clinet ");
NetworkStream ns2 = c2.GetStream();
byte[] stin = new byte[200];
ns2.Read(stin, 0, 100);
string stinfo = System.Text.Encoding.ASCII.GetString(stin);

Console.WriteLine(stinfo);


این برای سرور بود . حالا کد کلاینت . فرم اول :



namespace WindowsFormsApplication3
{

public partial class Form1 : Form
{


TcpClient c = new TcpClient("127.0.0.1", 1000);



public Form1()
{

InitializeComponent();

}

private void button1_Click(object sender, EventArgs e)
{

NetworkStream ns = c.GetStream();
string st;

st = textBox1.Text;


byte[] buf = System.Text.Encoding.ASCII.GetBytes(st);

ns.Write(buf, 0, st.Length);


Form2 tempDialog = new Form2();

tempDialog.ShowDialog();
}

}


}
و اینم برای فرم دوم :



namespace WindowsFormsApplication3
{
public partial class Form2 : Form
{

TcpClient c2= new TcpClient("127.0.0.1", 1000);
public Form2()
{

InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{


NetworkStream ns2 = c2.GetStream();
string st;
string st2;
st = textBox1.Text;
st2 = comboBox1.Text;
string name = string.Concat(st, st2);
byte[] buf2 = System.Text.Encoding.ASCII.GetBytes(name);
ns2.Write(buf2, 0, name.Length);



}


}
}


حقیقتش اینه که این برنامه رو برای پروژه نهایی می خوام و WCF تا حالا باهاش کار نکردم ، وقت ندارم برم دنبالش . می خوام با همین روش بنویسم .
ممنون می شم کمک کنید .

karim_medusa
یک شنبه 27 تیر 1389, 17:19 عصر
کد شما رو اصلاح کردم . ضمیمه رو دانلود کنید .

nadia_1987
یک شنبه 27 تیر 1389, 17:33 عصر
کد شما رو اصلاح کردم . ضمیمه رو دانلود کنید .

مرسی ، واقعا عالی بود . فقط یه سوال . من چون می خوام اینو برای یه پروژه دیگه بنویسم . می خواستم بدونم اون Common.cs چه نوع برنامه ای هست . من با class library نوشتم اما نتونستم توی add reference پیداش کنم ؟
ممنون می شم راهنمایی کنید .

karim_medusa
یک شنبه 27 تیر 1389, 18:12 عصر
یک کلاس خیلی ساده که یک عضو استاتیک داره همین.
همین فایل Common.cs رو کپی کنید. اسمش مهم نیست چی باشه فقط یک کلاس که عمومیه و عضوش استاتیک باشه همین.

nadia_1987
یک شنبه 27 تیر 1389, 18:21 عصر
یک کلاس خیلی ساده که یک عضو استاتیک داره همین.
همین فایل Common.cs رو کپی کنید. اسمش مهم نیست چی باشه فقط یک کلاس که عمومیه و عضوش استاتیک باشه همین.


خیلی ببخشید . اما متوجه نشدم . شما تو قسمت reference گذاشته بودید . اونجا که نمی تونم چیزی رو کپی و paste کنم .
چطوری از این فایل در یک برنامه دیگه استفاده کنم .
بازم ببخشید اگه سوالم خیلی ابتداییه.