Sending detailed information using Sockets
C&P from my developers forum...
Hello fellow community,
Today I'll show you how to send a detailed amount of information using sockets in a simple and really efficient way.
We'll be using classes to carry those infos, a formatter to de/serialize the classes and two socket-based applications.
So first of all open up Visual Studio and go to File->New Project. Then create a 'Blank Solution', afterwards right click on the solution's name in the Solution Explorer, and choose 'Add->New Project' and create a Class Library named "test_lib".
Now before starting over there're some notes that you must take under consideration before continuing.
Now in this tutorial we will create a software which sends a Account information to the server, and the server then proceeds to store the information regarding the account.
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.
Next step is making the communication software. Let's start with the client:
Now time to work with the server..
Once ran the server then the client the server's output should be:
Hope it helps, Elio.
Hello fellow community,
Today I'll show you how to send a detailed amount of information using sockets in a simple and really efficient way.
We'll be using classes to carry those infos, a formatter to de/serialize the classes and two socket-based applications.
So first of all open up Visual Studio and go to File->New Project. Then create a 'Blank Solution', afterwards right click on the solution's name in the Solution Explorer, and choose 'Add->New Project' and create a Class Library named "test_lib".
Now before starting over there're some notes that you must take under consideration before continuing.
- BinaryFormatters can deserialize a class only if it's assembly is loaded.
- Maximum length of a socket is 30KB (so watch out for this, or you can split the packet if you want)
Now in this tutorial we will create a software which sends a Account information to the server, and the server then proceeds to store the information regarding the account.
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;
}
}
Next step is making the communication software. Let's start with the client:
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();
}
}
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"; }
}
}
Name: Elio
ID: 52
Active: True
ID: 52
Active: True
Hope it helps, Elio.
