void AcceptCallback(IAsyncResult ar) { Socket client = mainSocket.EndAccept(ar); mainSocket.BeginAccept(AcceptCallback, null); Element_Async obj = new Element_Async(4096); obj.WorkingSocket = client; connectedClients.Add(client); AppendText(txt_chat, string.Format("client connect" + connectedClients.Count)); client.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { Element_Async obj = (Element_Async)ar.AsyncState; int received = obj.WorkingSocket.EndReceive(ar); if (received <= 0) { obj.WorkingSocket.Close(); return; } byte[] byteType = new byte[4]; Buffer.BlockCopy(obj.Buffer, 0, byteType, 0, 4); string text = Encoding.UTF8.GetString(byteType); if (text.Equals("text")) { byte[] byteMessage = new byte[obj.BufferSize - 4]; Buffer.BlockCopy(obj.Buffer, 4, byteMessage, 0, obj.BufferSize - 4); string message = Encoding.UTF8.GetString(byteMessage); string[] tokens = message.Split('\x01'); string _id = tokens[0]; string _msg = tokens[1]; AppendText(txt_chat, string.Format("{0}: {1}", _id, _msg)); } else if (text.Equals("exit")) { for (int i = connectedClients.Count - 1; i >= 0; i--) { if (connectedClients[i] == obj.WorkingSocket) { connectedClients.RemoveAt(i); break; } } } else { using (MemoryStream stream = new MemoryStream(obj.Buffer)) { BinaryFormatter bf = new BinaryFormatter(); stream.Position = 0; all_shapes[nobject] = (winform_client.All_Shapes)bf.Deserialize(stream); nobject++; if (panel.InvokeRequired) { panel.Invoke(new MethodInvoker(delegate() { panel.Invalidate(true); panel.Update(); })); } } } for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } } obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }