سلام دوست عزیز
یکی از روش های برنامه نویسی شبکه بصورت آسنکرون میباشد که البته این روشم مشکلات خاص خودش رو داره اما یکی از خوبیهاش اینه که میتونید هر چندتا کلاینت رو به سرور وصل کنید و سرور آخ هم نمیگه من تست کردم 50 تا کلاینت از یه سیستم به برنامه سرورم وصل شد اطلاعات رو در sql ذخیره کرد و تا 1 ساعت که روشن بود هم هنگی وجود نداشت.
این کلاس برای گرفتن اطلاعات کلاینت
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Data;
namespace Server
{
public class seClient
{
public string ID
{
get;
private set;
}
public IPEndPoint EndPoint
{
get;
private set;
}
public Socket socket;
public Thread clientThread;
public seClient() //recieve data from each client indivisually
{
ID = Guid.NewGuid().ToString();
}
public seClient(Socket Accept)
{
this.socket = Accept;
ID = Guid.NewGuid().ToString();
EndPoint = (IPEndPoint)socket.RemoteEndPoint;
SendRegistrationPacket();
socket.BeginReceive(new byte[] { 0 }, 0, 0, 0, CallBack, null);
}
byte[] buffer;
void CallBack(IAsyncResult ar)
{
try
{
//Packet p = new Packet(PacketType.SendData,ID);
socket.EndReceive(ar);
buffer = new byte[socket.SendBufferSize];
int rec = socket.Receive(buffer);
if (rec < buffer.Length)
{
Array.Resize<byte>(ref buffer, rec);
}
if (Received != null)
{
Packet packet = new Packet(buffer);
Received(packet, this, buffer);
}
socket.BeginReceive(new byte[] { 0 }, 0, 0, 0, CallBack, null);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
Close();
if (Disconnected != null)
{
Disconnected(this);
}
}
}
public void Close()
{
socket.Close();
socket.Dispose();
}
public void SendRegistrationPacket()
{
Packet p = new Packet(PacketType.Registration, "server");
p.GData.Add(ID);
socket.Send(p.ToBytes());
}
public delegate void ClientReceivedHandler(Packet p,seClient sender, byte[] data);
public delegate void ClientDisconnectedHandler(seClient sender);
public event ClientReceivedHandler Received;
public event ClientDisconnectedHandler Disconnected;
}
}
و این کلاس برای معرفی کلاینت به سرور و سرور به کلاینت که بصورت DLL ساخته شده...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
namespace Data
{
[Serializable]
public class Packet
{
public List<string> GData;
public int packetInt;
public bool packetBool;
public string senderID;
public PacketType packetType;
public Packet(PacketType type, string senderID)
{
GData = new List<string>();
this.senderID = senderID;
this.packetType = type;
}
public Packet(byte[] packetbytes)
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream(packetbytes);
if (ms.Length > 0)
{
Packet p = (Packet)bf.Deserialize(ms);
ms.Close();
this.GData = p.GData;
this.packetInt = p.packetInt;
this.packetBool = p.packetBool;
this.senderID = p.senderID;
this.packetType = p.packetType;
}
}
public byte[] ToBytes()
{
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bf.Serialize(ms, this);
byte[] bytes = ms.ToArray();
ms.Close();
return bytes;
}
}
public enum PacketType
{
Registration, Chat, SendData, Lock, Unlock, ShutDown, Restart, UsbAccept, Dissconnect
}
}