// 데이터 받는 함수 private void DataReceived(IAsyncResult ar) { // BeginRecvied에서 추가로 넘어온 데이터를 AysncObject클래스 형식으로 변환 // AsyncCallback 메소드는 IAsyncResult 객체의 AsyncState 속성을 사용하여 원래의 소캣 객체 재생성 // EndAccpet() 호출되면, IAsyncResult 객체를 통해 호출한 BeginAccept()과 대응한다 // EndAccpet() 은 원격 클라이언트와 통신하는데 사용할 새로운 소켓 객체를 반환 AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신 끝내기 if (_client.Connected) { try { int received = obj._workingSocket.EndReceive(ar); // 받은 데이터 없으면 비동기 연결끝 if (received <= 0) { obj._workingSocket.Close(); return; } // 텍스트로 변환 // "192.168.2.157 : port % t % mms" string text = Encoding.Default.GetString(obj._buffer); string[] token = text.Split('%'); string port = token[0]; string[] _port = token[0].Split(':'); string _portip = _port[1]; string check = token[1]; string message = token[2]; MessageConverter(message, check); if (check.Equals("t@")) { if (lbox_ChatLog.InvokeRequired) { lbox_ChatLog.Invoke(new Action(delegate() { lbox_ChatLog.Items.Add("[클라이언트" + _portip + "] : " + message); })); } else { lbox_ChatLog.Items.Add("[클라이언트" + _portip + "] : " + message); } } else if (check.Equals("p@")) { if (lbox_Content.InvokeRequired) { lbox_Content.Invoke(new Action(delegate() { lbox_Content.Items.Add("[클라이언트" + _portip + "] : " + message); })); } else //_client.RemoteEndPoint { lbox_Content.Items.Add("[클라이언트" + _portip + "] : " + message); } } Console.WriteLine(_connectedClients.Count); // 모든 클라이언트들에게 데이터전송 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 = AcceptCallback 함수의 client obj._workingSocket.BeginReceive(obj._buffer, 0, 4096, 0, DataReceived, obj); //같은방법으로 수신대기 } catch (SocketException se) { se.Message.ToString(); } } }
// 콜백함수 private void AcceptCallback(IAsyncResult ar) { // 클라이언트 연결 요청 수락 try { _client = _mainSock.EndAccept(ar); // 또 다른 클라이언트 연결 대기 _mainSock.BeginAccept(AcceptCallback, null); AsyncObject obj = new AsyncObject(4096); obj._workingSocket = _client; // 연결된 클라이언트를 리스트에 추가 _connectedClients.Add(_client); // 처음 통신 시작 할 때, 모든 데이터를 clinet에게 넘겨준다. // 문자열이 아닌 객체로 보내는 방법으로 생각해보자. // 초기 연결!!!! if (_connectedClients.Contains(_client)) { string message = ""; if (_moveShapeSetting.Count >= 1) { foreach (KeyValuePair <string, Setting> kv in _moveShapeSetting) { List <Point> pts = kv.Value.Points; String _shape = kv.Value.Shape; Color _color = kv.Value.Color; int _width = kv.Value.Width; String _pointKey = kv.Key; Console.WriteLine(_shape); string strPoint = string.Format("POINTS:{0},{1},{2},{3}@", pts[0].X, pts[0].Y, pts[1].X, pts[1].Y); string strShpae = string.Format("SHAPE:{0}@", _shape); string strColor = string.Format("COLOR:{0},{1},{2},{3}@", _color.A, _color.R, _color.G, _color.B); string strWidth = string.Format("WIDTH:{0}@", _width); string strKey = string.Format("STR KEY:{0}", _pointKey); message += strShpae; message += strColor; message += strWidth; message += strPoint; message += strKey; message += '+'; } // SHAPE:RECT@COLOR:255,255,0,0@WIDTH:2@POINTS:10,10,100,100@STR KEY:_pointKey SendMessage(message, 12); } } if (lbox_Content.InvokeRequired) { lbox_Content.Invoke(new Action(delegate() { lbox_Content.Items.Add("[클라이언트" + _client.RemoteEndPoint + "] : 연결"); })); } else { lbox_Content.Items.Add("[클라이언트" + _client.RemoteEndPoint + "] : 연결"); } // 클라이언트 데이터 받기 _client.BeginReceive(obj._buffer, 0, 4096, 0, DataReceived, obj); } catch (Exception ex) { ex.Message.ToString(); } }