private void handleDataReceive(IAsyncResult ar) { // 넘겨진 추가 정보를 가져옵니다. // AsyncState 속성의 자료형은 Object 형식이기 때문에 형 변환이 필요합니다~! AsyncObject ao = (AsyncObject)ar.AsyncState; // 자료를 수신하고, 수신받은 바이트를 가져옵니다. Int32 recvBytes = ao.WorkingSocket.EndReceive(ar); // 수신받은 자료의 크기가 1 이상일 때에만 자료 처리 if (recvBytes > 0) { string message = new UTF8Encoding().GetString(ao.Buffer, 0, recvBytes); Console.WriteLine("메세지 받음: {0}", message); this.Invoke(new MethodInvoker(delegate { txtLog.AppendLine(string.Format("메세지 받음: {0}", message)); })); } // 자료 처리가 끝났으면~ // 이제 다시 데이터를 수신받기 위해서 수신 대기를 해야 합니다. // Begin~~ 메서드를 이용해 비동기적으로 작업을 대기했다면 // 반드시 대리자 함수에서 End~~ 메서드를 이용해 비동기 작업이 끝났다고 알려줘야 합니다! ao.WorkingSocket.BeginReceive(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnReceiveHandler, ao); }
private void handleDataSend(IAsyncResult ar) { // 넘겨진 추가 정보를 가져옵니다. AsyncObject ao = (AsyncObject)ar.AsyncState; // 자료를 전송하고, 전송한 바이트를 가져옵니다. Int32 sentBytes = ao.WorkingSocket.EndSend(ar); if (sentBytes > 0) { Console.WriteLine("메세지 보냄: {0}", Encoding.Unicode.GetString(ao.Buffer)); txtLog.AppendLine(string.Format("메세지 보냄: {0}", Encoding.Unicode.GetString(ao.Buffer))); } }
//Client fires when a connection signal comes in callback private void AcceptCallback(IAsyncResult asyncResult) { try { Socket client = serverSocket.EndAccept(asyncResult); serverSocket.BeginAccept(AcceptCallback, null); AsyncObject asyncObject = new AsyncObject(4096); asyncObject.WorkingSocket = client; connectClientList.Add(client); AppendText("IP: " + client.RemoteEndPoint); client.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceiveData, asyncObject); } catch { } }
private void handleClientConnectionRequest(IAsyncResult ar) { // 클라이언트의 연결 요청을 수락합니다. Socket sockClient = m_ServerSocket.EndAccept(ar); // 4096 바이트의 크기를 갖는 바이트 배열을 가진 AsyncObject 클래스 생성 AsyncObject ao = new AsyncObject(4096); // 작업 중인 소켓을 저장하기 위해 sockClient 할당 ao.WorkingSocket = sockClient; SendMessage("접속을 확인합니다."); // 비동기적으로 들어오는 자료를 수신하기 위해 BeginReceive 메서드 사용! sockClient.BeginReceive(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnReceiveHandler, ao); }
public void SendMessage(String message) { // 추가 정보를 넘기기 위한 변수 선언 // 크기를 설정하는게 의미가 없습니다. // 왜냐하면 바로 밑의 코드에서 문자열을 유니코드 형으로 변환한 바이트 배열을 반환하기 때문에 // 최소한의 크기르 배열을 초기화합니다. AsyncObject ao = new AsyncObject(1); //byte[] buffer = new UTF8Encoding().GetBytes(message); // 문자열을 바이트 배열으로 변환 ao.Buffer = new UTF8Encoding().GetBytes(message); // 사용된 소켓을 저장 ao.WorkingSocket = m_ServerSocket; // 전송 시작! m_ServerSocket.BeginSend(ao.Buffer, 0, ao.Buffer.Length, SocketFlags.None, m_fnSendHandler, ao); }
// Data를 받았을 때 시작되는 Callback private void ReceiveData(IAsyncResult asyncResult) { AsyncObject asyncObject = asyncResult.AsyncState as AsyncObject; try { asyncObject.WorkingSocket.EndReceive(asyncResult); } catch { asyncObject.WorkingSocket.Close(); return; } string text = Encoding.UTF8.GetString(asyncObject.Buffer); string[] tokens = text.Split('\x01'); try { if (tokens[1][0] == '\x02') { AppendText(tokens[0] + "님이 입장하셨습니다. ( 현재 인원 : " + connectClientList.Count + "명"); try { dataGridView.Rows.Add(new string[] { tokens[0] }); } catch { } } else if (tokens[1][0] == '\x03') { AppendText(tokens[0] + "님이 퇴장하셨습니다. (현재 인원 : " + (connectClientList.Count - 1) + "명"); try { for (int i = 0; i < dataGridView.Rows.Count; i++) { if (tokens[0] == dataGridView.Rows[i].Cells[0].Value as string) { dataGridView.Rows.RemoveAt(i); break; } } } catch { } } else { AppendText("[받음] " + tokens[0] + " : " + tokens[1]); } } catch { } for (int i = connectClientList.Count - 1; i >= 0; i--) { Socket tempSocket = connectClientList[i]; if (tempSocket != asyncObject.WorkingSocket) { try { tempSocket.Send(asyncObject.Buffer); } catch { tempSocket.Close(); connectClientList.RemoveAt(i); } } } asyncObject.ClearBuffer(); try { asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceiveData, asyncObject); } catch { asyncObject.WorkingSocket.Close(); connectClientList.Remove(asyncObject.WorkingSocket); } }
//Data start when you recieve callback private void ReceiveData(IAsyncResult asyncResult) { AsyncObject asyncObject = asyncResult.AsyncState as AsyncObject; try { asyncObject.WorkingSocket.EndReceive(asyncResult); } catch { asyncObject.WorkingSocket.Close(); return; } string text = Encoding.UTF8.GetString(asyncObject.Buffer); string[] tokens = text.Split('\x01'); try { if (tokens[1][0] == '\x02') { //shows user joining and displays number of users in server AppendText(tokens[0] + " has joined (current people: " + connectClientList.Count + " people)"); try { dgvUsernames.Rows.Add(new string[] { tokens[0] }); } catch { } } else if (tokens[1][0] == '\x03') { //shows user leaving and displays number of users in server AppendText(tokens[0] + " has left (current people: " + (connectClientList.Count - 1) + " people)"); try { for (int i = 0; i < dgvUsernames.Rows.Count; i++) { if (tokens[0] == dgvUsernames.Rows[i].Cells[0].Value as string) { dgvUsernames.Rows.RemoveAt(i); break; } } } catch { } } //message recieved from client else { AppendText("[Recieved] " + tokens[0] + ": " + tokens[1]); } } catch { } for (int i = connectClientList.Count - 1; i >= 0; i--) { Socket tempSocket = connectClientList[i]; if (tempSocket != asyncObject.WorkingSocket) { try { tempSocket.Send(asyncObject.Buffer); } catch { tempSocket.Close(); connectClientList.RemoveAt(i); } } } asyncObject.ClearBuffer(); try { asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, 4096, 0, ReceiveData, asyncObject); } catch { asyncObject.WorkingSocket.Close(); connectClientList.Remove(asyncObject.WorkingSocket); } }