Code:
[Serializable]
public class AccountInfo
{
private string user_name;
private int user_id;
private bool active;
public string Username{ get{ return user_name; } }
public int ID{ get{ return user_id; } }
public bool Active{ get{ return active; } }
public AccountInfo(string un, int id, bool isactive)
{
user_name = un;
user_id = id;
active = isactive;
}
}
This class pretty much explains itself but keep in mind to mark the class as "Serializable" in case that you want to serialize it, and also if you add a custom class inside it (ie a Stream class) then you cannot serialize it because each class member have to be serializable.
Code:
using System;
using System.Net;
using System.Net.Sockets;
using System****;
using System.Runtime.Serialization.Formatters.Binary;
using test_lib; //Add our test_lib as a reference.
public class Program
{
public static byte[] SerializeClass(object c)
{
MemoryStream memsr = new MemoryStream(); // A graph which will soon represent our object.
BinaryFormatter bfmt = new BinaryFormatter(); // A binary formatter which will handle the serialization part.
bfmt.Serialize(memsr, c); //Serialize the class.
return memsr.ToArray();
}
public static void SendData(AccountInfo info)
{
byte[] data = SerializeClass(info);
Socket s = new Socket( ... ); // '...' just to skip the parameters
s.Connect(IPAddress.Parse("127.0.0.1"), 5588); // 127.0.0.1 is the localhost address and 5588 is our custom server's port.
s.Send(data);
s.Disconnect(false); //Disconnect the socket.
}
static void Main(string[] args)
{
Console.WriteLine("Please enter your account name:");
string name = Console.ReadLine();
int id = new Random().Next(0, 100);
Console.Clear();
Console.WriteLine("Sending your data...");
SendData(new AccountInfo(name, id, true));
Console.Write("DONE!");
Console.Read();
}
}
Now time to work with the server..
Code:
using System;
using System.Net;
using System.Net.Sockets;
using System****;
using System.Runtime.Serialization.Formatters.Binary;
using test_lib; //Add our test_lib as a reference.
using System.Threading;
class Program{
static object Deserialize(byte[] o)
{
MemoryStream memsr = new MemoryStream(o); // A graph which represents our object.
BinaryFormatter bfmt = new BinaryFormatter(); // A binary formatter which will handle the deserialization part.
return bfmt.Deserialize(memsr); //Deerialize the class.
}
static void CreateRunThread()
{
Socket s = new Socket( ... );
s.Bind((EndPoint)(new IPEndPoint(IPAddress.Any, 5588))); //IPAddress.Any is recommended for this kind of operations.
s.Listen(100); //Listens for incoming connections...
while(true)
{
Socket client = s.Accept();
byte[] bytes = new byte[1024]; //1KB should be enough to handle the info's size.
client.Receive(bytes);
AccountInfo acc = (AccountInfo)Deserialize(bytes);
Console.WriteLine("Account received!\r\nName: " + acc.Username + "\r\nID: " + acc.ID.ToString() + "\r\nIs Active: " + acc.Active.ToString());
Console.Read();
}
}
static void Main(string[] args)
{
new Thread(new ThreadStart(CreateRunThread)).Start(); //Starts the server stuffs.
while(true) { Console.Title = "Server"; }
}
}
Once ran the server then the client the server's output should be: