private void InitSocket() { if (mainSock.Connected) { MessageBox.Show("이미 연결되어 있습니다!"); return; } try { mainSock.Connect(ip, port); } catch (Exception ex) { MessageBox.Show("연결에 실패했습니다!\n오류 내용: {0}", ex.Message); return; } // 연결 완료되었다는 메세지를 띄워준다. AppendText(txt_chat, "서버와 연결되었습니다."); // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다. Element_Async obj = new Element_Async(4096); obj.WorkingSocket = mainSock; mainSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 Element_Async 형식으로 변환한다. Element_Async obj = (Element_Async)ar.AsyncState; if (obj.WorkingSocket.Connected) { // 데이터 수신을 끝낸다. 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); byte[] byteMessage = new byte[obj.BufferSize - 4]; Buffer.BlockCopy(obj.Buffer, 4, byteMessage, 0, obj.BufferSize - 4); if (text.Equals("text")) { 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")) { return; } else { using (MemoryStream stream = new MemoryStream(obj.Buffer)) { BinaryFormatter bf = new BinaryFormatter(); stream.Position = 0; all_shapes[nobject] = (All_Shapes)bf.Deserialize(stream); nobject++; //all_object = (Object[])bf.Deserialize(stream); if (panel.InvokeRequired) { panel.Invoke(new MethodInvoker(delegate() { panel.Invalidate(true); panel.Update(); })); } } } } obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }