سلام
قبلا در 3 پست اینجـــــــا و اینجــــــــــا و همچنین این لینـــــــــــــــک در مورد سوکت و ای پی ها مفصلا توضیح دادم خب یه مورد دیگه هم در خصوص اعداد باینری هم تو این لینـــــــــــک و این لینـــــــــــک توضیح دادم ای قسمت یه پروژه سوکت چت میسازیم که بهینه شده هست
خب برای شروع کلاس انتقال اطلاعات رو ایجاد میکنیم
ایجاد مغییر برای سوکت و ساخت بافر اطلاعات
برای ایجاد کانستراکتور کافیه دو حرف ct
رو درج و دوبار تب رو بزنید
برای ورودی و مقادیر بافر اطلاعات از اعداد باینری استفاده میکنیم
این مورد هم قبلا اموزش داده شده توسایت هست
class PacketTransferClass { public Socket ClientCl; public byte[] BufferCl; public PacketTransferClass(Socket ClientS) { this.ClientCl = ClientS; this.BufferCl = new byte[] {0x00,0x00,0x06,0x10,0x12,0x00,0x00 }; } } }
خب توی فرم سرور
اینجاد یه نمونه از سوکت و همچنین لیست کلاینتها
ابتدا میبایست ای پی رو بگیریم
با استفاده از کلاس خود سوکت همون ipaddress
string Ipp = Dns.GetHostName(); IPAddress[] GetIP = Dns.GetHostAddresses(Ipp); foreach (IPAddress item in GetIP) { if (item.AddressFamily==AddressFamily.InterNetwork) { txtserverIP.Text = item.ToString(); txtserverPort.Text = "8000"; } }
یه متد مینوسم که کانکشن ها رو برسی کنه و به محض اتصال اقدامی بکنه
خب در این متد از شرط برای بررسی نحوه اتصال و تو خط اول باتن ارسال پام قبل از اتصال غیر فعاله
خط دوم باتن اتصال پس از اتصال غیر فعال میشه
همچنین هط اخر نحوه تغییر رنگ باتن ارسال پیام که با بررسی شرط کانکشن انجام میشه
خط اول ساخت یه ابجکت از سوکت و مشخص کردن نوع ارسال و پروتکل هست
خط دوم دریافت ای پی سرور وتبدیل ان به عدد برای پردازش dns
هست
حال لازمه متدی ایجاد کنیم تا اطلاعات یا داده ها توسط سرور دریافت و پردازش بشه با همین دریافت سرور
این متد وقتی پردازش اطلاعات سمت سرور به پایان رسید داده ها به سمت کلاینت ارسال میشن
private void btnStartconn_Click(object sender, EventArgs e) { ServerS = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPAddress Ipadress = IPAddress.Parse(txtserverIP.Text); int portnm = int.Parse(txtserverPort.Text); IPEndPoint EndIP = new IPEndPoint(Ipadress,portnm); ServerS.Bind(EndIP); CheckConnection(true); ServerS.Listen(int.MaxValue); ServerS.BeginAccept(new AsyncCallback(OnServerEndAccept),null); } private void OnServerEndAccept(IAsyncResult ar) { Socket _Soket = ServerS.EndAccept(ar); Clients.Add(_Soket); ReadyForGetData(_Soket); }
اینجا متد ارسال اطلاعات از بررسی داده ها و نقطه شروع اطلاعات و محاسبه طول داده های ارسالی
یعنی از نقطه صفر تا حرف اخر
private void ReadyForGetData(Socket socket) { PacketTransferClass packetClass = new PacketTransferClass(socket); packetClass.ClientCl.BeginReceive(packetClass.BufferCl,0,packetClass.BufferCl.Length,SocketFlags.None,new AsyncCallback(OnClientEndRecieve),packetClass); }
برای امنیت اطلاعات لازمه اطلاعات رمزنگاری بشن رمزنگاری اطلاعات رو قبلا توضیح دادم البته اینجا حروف و متون تبدیل به کدها اسکی میشه
که استخراج کدها اسکی امنیت محسوب نمیشه
متد دریافت و ارسال اطلاعات توسط ریچ تکست باکس
اگر این اطلاعات بدون پردازش ارسال بشن باعث هنگ کردن و کندی برنامه خواهند شد
با استفاده از دلیگیت ارسال و دریافت و کنترل میکنیم
private void OnClientEndRecieve(IAsyncResult ar) { PacketTransferClass Pocket = (PacketTransferClass)ar.AsyncState; string msg = ASCIIEncoding.UTF8.GetString(Pocket.BufferCl); WriteToLogg(msg); ReadyForGetData(Pocket.ClientCl); } private void WriteToLogg(string msg) { MethodInvoker MyMethod = new MethodInvoker(delegate { richTextBox1.AppendText(Environment.NewLine + "Server :" + msg + Environment.NewLine); } ); this.BeginInvoke(MyMethod); }
این متد برای رفتن به سطر بعدی هست