Answer the question
In order to leave comments, you need to log in
Sockets, passing serialized objects, sharing in a stream. How?
There is a server, there is a client. They communicate with each other by messages. Let it be the Message class, rendered into a separate dll and connected to the server and client project.
[Serializable]
public class Message {
public int id;
public string title;
public string message;
}
TcpClient client = new TcpClient("127.0.0.1",2255);//Коннект к серверу
for (int i = 0; i < 100; i++){//Шлём 100 сообщений
using (var stream = new NetworkStream(client.Client)){//Берем поток сокета
BinaryFormatter bf = new BinaryFormatter();
var msg = new Message(){//Создаем сообщение которое хотим послать на сервер
id = i,
message = "Hello world",
title = "My Title"
};
bf.Serialize(stream, msg);//сериализуем и пишем в поток
}
//Thread.Sleep(100); //Если добавить задержку то всё ок
}
Console.WriteLine("end");
Console.ReadKey();
static void Main(string[] args)
{
TcpListener listener = new TcpListener(IPAddress.Any, 2255);
listener.Start(100);//Запускаем сервер, слушаем порт 2255
Console.WriteLine("Listen 2255");
while (true){
new ClientSocket(listener.AcceptSocket());//Ждем подключения клиента, при подключении создаем новый класс ClientSocket
Console.WriteLine("Socket connect");//Сокет подключен, ждем других клиентов
}
}
public class ClientSocket{
private Socket socket;
private MemoryStream recieveData = new MemoryStream();
public const int BufferSize = 256;
byte[] buffer = new byte[BufferSize];
public ClientSocket(Socket s){
this.socket = s;
socket.BeginReceive(this.buffer, 0, ClientSocket.BufferSize, 0, new AsyncCallback(ReceiveCallback), this);
}
private static void ReceiveCallback(IAsyncResult ar){
ClientSocket state = (ClientSocket)ar.AsyncState;
Socket client = state.socket;
int bytesRead = 0;
try{
bytesRead = client.EndReceive(ar);//количество байт записанных в буффер
}
catch (SocketException se){
if (se.ErrorCode == 10054){
Console.WriteLine("Клиент отключился");
return;
}
else
throw se;
}
if (bytesRead > 0){
state.recieveData.Write(state.buffer, 0, bytesRead);//пишет в поток принятых байт
Console.WriteLine("read {0} byte, available {1}", bytesRead, client.Available);
}
if (client.Available == 0 && state.recieveData.Length > 0){//если больше нет данных на прием и что-то есть в общем потоке
IFormatter formatter = new BinaryFormatter();
state.recieveData.Seek(0, SeekOrigin.Begin);//указать потока на 0
var m = (Message)formatter.Deserialize(state.recieveData);//десереализуем данные потока как Message
state.recieveData.SetLength(0);//сбрасываем поток...
Console.WriteLine("Recieve: {0} {1} {2}", m.id, m.title, m.message);
}
client.BeginReceive(state.buffer, 0, ClientSocket.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);//ждем еще данные
}
~ClientSocket()
{
if (recieveData != null)
{
recieveData.Close();
recieveData.Dispose();
}
}
}
if (client.Available == 0 && state.recieveData.Length > 0){//если больше нет данных на прием и что-то есть в общем потоке
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question