void OnConnectToServer(object sender, EventArgs e) { if (mainSock.Connected) { MsgBoxHelper.Error("이미 연결되어 있습니다!"); return; } int port = 15000; //고정 nameID = txtID.Text; //ID AppendText(txtHistory, string.Format("서버: @{0},port: 15000, ID: @{1}", txtAddress.Text, nameID)); try { mainSock.Connect(txtAddress.Text, port); } catch (Exception ex) { MsgBoxHelper.Error("연결에 실패했습니다!\n오류 내용: {0}", MessageBoxButtons.OK, ex.Message); return; } // 연결 완료되었다는 메세지를 띄워준다. AppendText(txtHistory, "서버와 연결되었습니다."); // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다. AsyncObject obj = new AsyncObject(4096); obj.WorkingSocket = mainSock; mainSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj); }
void AcceptCallback(IAsyncResult ar) { // 클라이언트의 연결 요청을 수락한다. clientSokect = mainSock.EndAccept(ar); AsyncObject obj = new AsyncObject(4096); obj.WorkingSocket = clientSokect; // 텍스트박스에 클라이언트가 연결되었다고 써준다. AppendText(txtHistory, string.Format ("클라이언트 (@ {0})가 연결되었습니다.", clientSokect.RemoteEndPoint)); //클라이언트에게 선공이라고 알림 byte[] bDts = Encoding.UTF8.GetBytes("3:선공"); clientSokect.Send(bDts); // 클라이언트의 데이터를 받는다. clientSokect.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 // AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // as AsyncObject로 해도 됨 // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } string id, msg; string x, y, stone, Return; // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID // tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); Console.WriteLine(text); if (tokens[0].Equals("0")) { id = tokens[1]; msg = tokens[2]; AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); } else if (tokens[0].Equals("1")) { Console.WriteLine(text); x = tokens[1]; y = tokens[2]; stone = tokens[3]; Return = tokens[4]; //자신의 턴확인 if (Return.Equals("myturn")) { myturn = true; } //그림판에 그림그리기 int x1 = Convert.ToInt32(x); int y1 = Convert.ToInt32(y); //델리게이트 Pannel1_Read(x1, y1, stone); } else if (tokens[0].Equals("3")) { Console.WriteLine(text); myturn = true; } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive (obj.Buffer, 0, 4096, 0, DataReceived, obj); }