PDA

View Full Version : ویندوز اپلیکیشن با قابلیت (Multi Client - Single Server)



ardymary
یک شنبه 10 آذر 1392, 19:19 عصر
من یک پروژه آماده رو که یک چت تحت شبکه ساده هست رو یکم دست کاری کردم که به صورت اتوماتیک ip و port مورد نظر رو می گیره و کلاینت می تونه با اون چت کنه .

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

namespace server_sample
{
public partial class Form1 : Form
{
public delegate void add_to_textbox(string text);

IPAddress ip;
IPEndPoint IpPort;
Socket main_socket, client;
Thread thread_recieve;


public Form1()
{
InitializeComponent();
thread_recieve = new Thread(method_recieving);
thread_recieve.IsBackground = true;

}



private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
ip = IPAddress.Any;
IpPort = new IPEndPoint(ip,Convert.ToInt32("1818"));
main_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, colType.Tcp);
main_socket.Bind(IpPort);
main_socket.Listen(int.MaxValue);
client = main_socket.Accept();
thread_recieve.Start()
label2.Text = "اتصال برقرار شد";

button2.Enabled = true;
label3.Text = Convert.ToString(IpPort);
}

private void button2_Click(object sender, EventArgs e)
{
byte[] buffer = new byte[60000];
buffer = Encoding.UTF8.GetBytes(send_msg.Text);
client.Send(buffer);
buffer = null;
send_msg.Text = "";
}

public void method_recieving()
{
while (true)
{
byte[] buffer = new byte[600];
int i=0;
try
{
i = client.Receive(buffer);
}
catch
{
MessageBox.Show("ertebat ghat shod !!! ");
thread_recieve.Abort();
}
if (i != 0)
{
string msg = System.Text.ASCIIEncoding.ASCII.GetString(buffer);
Invoke(new add_to_textbox(method_add_textbox), new object[] { msg });


}
}
}

public void method_add_textbox(string msg)
{

inbox.AppendText("client : " + msg);
inbox.AppendText("\r\n");
}


private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
thread_recieve.Abort();

private void button3_Click(object sender, EventArgs e)
{
string HostName = Dns.GetHostName();
IPHostEntry MyEntry = Dns.GetHostByName(Dns.GetHostName());
IPAddress MyAddress = new IPAddress(MyEntry.AddressList[0].Address);
MessageBox.Show(MyAddress.ToString());
}
}
}



سرچ کردم مدلهایی دیدم که با یک حلقه while منتظر کلاینت می مونه اما ساختارش با این فرق داشت.