خوب ببینید ، میتونید یه فیلد هم واسه طول آرایه توی پیامی که رد و بدل میشه بذارید، یا هر عنصر آرایه رو تو یک پیام جدا بفرستید و با یه فیلدی مثل ایندکس بهم ربطشون بدین .
کاری که خود پروتکل TCP/IP انجام میده شبیه به اینه :
بسته های بزرگ رو به بسته های کوچکتر تقسیم میکنه
هر بسته 2 تا فیلد identification و fragment offset داره
identification رو واسه مشخص کردن اینکه هر بسته متعلق به کدوم دیتاگرام هست استفاده میکنه که تو پروژه شما میتونی همچین فیلدی رو واسه مشخص کردن اینکه متعلق به کدوم پیامه ازش استفاده کنی
fragment offset واسه تعیین ترتیب بسته ها موقع سر هم کردنشون تو گیرنده هست که تو پروژتون معادل همون ایندکس آرایه میتونه باشه
ولی یه راه دیگه واسه انتقال اطلاعات ، استفاده از سریالایز کردن اشیاء هست
یعنی شما با استفاده از یک سریالایزر ، یک آبجکت رو تبدیل به استریم میکنید ، بعد همون استریم رو میتونید داخل شبکه انتقال بدین
مثلا این کلاس Message منه که تو پروژه ام استفاده کردم
[Serializable]
public class Message
{
private MessageType type;
private MessageState state;
private string[] _fields;
private object[] _values;
private int _index;
private string _field;
public MessageType Type
{
get
{
return this.type;
}
}
public MessageState State
{
get
{
return this.state;
}
}
public Message(MessageType type, MessageState state)
{
this.type = type;
this.state = state;
_fields = new string[10];
_values = new object[10];
_index = 0;
}
public void AddField(string field, object value)
{
if (_index == _fields.Length)
throw new IndexOutOfRangeException();
_field = field.Trim().ToUpper();
int index;
if ((index = Array.FindIndex(_fields, Matches)) == -1)
{
_fields[_index] = _field;
_values[_index] = value;
_index++;
}
else
{
_fields[index] = _field;
_values[index] = value;
}
}
private bool Matches(string field)
{
if (field == _field)
return true;
else
return false;
}
public object GetFieldData(string field)
{
_field = field.Trim().ToUpper();
int index;
if ((index = System.Array.FindIndex(_fields, Matches)) == -1)
return null;
else
return _values[index];
}
public void SetValues(object[] values)
{
this._values = values;
}
public object[] GetValues()
{
return this._values;
}
}
البته ظاهرا این سریالایزر بعضی وقتا موقع دیسریالاز کردن با آرایه مشکل داره ، من از این روش استفاده کردم بعضی وقتا باعث میشه ارتباطم با سرور قطع بشه ، چراشو دیگه فرصت نکردم برم دنبالش
واسه سریال کردن :
System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.Bin aryFormatter();
formatter.Serialize(socket.GetStream(),message);
socket.GetStream().Flush();
واسه دیسریالایز :
(Message) message = (Message)formatter.Deserialize(socket.GetStream()) ;