void getHeader() { mainSock.Receive(ao.Buffer, 0, HEADER_SIZE, SocketFlags.None); string jsonData = Encoding.UTF8.GetString(ao.Buffer); // Debug.Log("[받음]" + jsonData); // UID:000,LEN:016 if (jsonData.StartsWith("UID")) { // Debug.Log("Header"); if (UID == -1) { UID = Convert.ToInt32(jsonData.Split(',')[0].Split(':')[1]); // Debug.Log("UID : " + UID); } int BODY_SIZE = Convert.ToInt32(jsonData.Split(',')[1].Split(':')[1]); ao.ClearBuffer(); if (BODY_SIZE != 0) { getBody(BODY_SIZE); } return; } }
public void ReceivedFromServer(IAsyncResult ar) { try { AsyncObject obj = (AsyncObject)ar.AsyncState; int numReceived = obj.WorkingSocket.EndReceive(ar); if (numReceived <= 0) { obj.WorkingSocket.Close(); return; } string txt = Encoding.UTF8.GetString(obj.Buffer).Trim('\0'); System.Console.WriteLine("Messege From Server : " + txt); obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, obj.BufferSize, SocketFlags.None, ReceivedFromServer, obj); } catch (Exception e) { Debug.WriteLine(e.ToString()); } }
/*public void DataReceived(IAsyncResult ar) * { * AsyncObject obj = (AsyncObject)ar.AsyncState; * try * { * string text = Encoding.UTF8.GetString(obj.Buffer); * string[] tokens = text.Split('~'); * if (tokens.Length == 1) return; * MessageBox.Show(tokens[0]); * MessageBox.Show(tokens[1]); * MessageBox.Show(tokens[2]); * // 수신 받은거 처리 후 * obj.ClearBuffer(); * //obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, SocketFlags.None, DataReceived, obj); * obj.WorkingSocket.Receive(obj.Buffer); * } * catch (Exception e) * { * MessageBox.Show(e.ToString()); * * } * }*/ public void SendData(string[] attribute) { try { AsyncObject ao = new AsyncObject(4096); ao.WorkingSocket = client; int size = attribute.Length; string Data = ""; for (int i = 0; i < size; i++) { Data += attribute[i]; Data += "/"; } byte[] bD = Encoding.UTF8.GetBytes(Data + "\r\n"); ao.WorkingSocket.Send(bD); ao.WorkingSocket.Receive(ao.Buffer); string text = Encoding.UTF8.GetString(ao.Buffer); string[] tokens = text.Split('~'); if (tokens.Length == 1) { return; } MessageBox.Show(tokens[0]); MessageBox.Show(tokens[1]); MessageBox.Show(tokens[2]); // 수신 받은거 처리 후 ao.ClearBuffer(); } catch (Exception e) { MessageBox.Show(e.ToString()); } }
public void DataReceived(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; //IAsyncResult int received = obj.WorkingSocket.EndReceive(ar); //받은 데이터가 없을때 if (received <= 0) { obj.WorkingSocket.Close(); return; } //받은걸 UTF8로 인코딩 string text = Encoding.UTF8.GetString(obj.Buffer); // 0x01 기준으로 짜른다. 보낼떄 "0x01"을 데이터 사이에 집어 넣어서 // tokens[0] - 보낸 사람 IP // tokens[1] - 보낸 메세지 string[] tokens = text.Split('#'); string ip = tokens[0]; string msg = tokens[1]; Appendtext(serverF.serverForm.txtLog, string.Format("[server에게 받음]{0} : {1}", ip, msg)); //데이터 수신 후 버퍼 비워주기 obj.ClearBuffer(); //다시 수신대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // : 기준으로 짜른다. // tokens[0] - 보낸 사람 ID, tokens[1] - 보낸 메세지 string[] tokens = text.Split(':'); string id = tokens[0]; string msg = tokens[1]; // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. AppendText(txtHistory, string.Format("[받음]{0}: {1}", id, msg)); // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
/*public void DataReceived(IAsyncResult ar) * { * AsyncObject obj = (AsyncObject)ar.AsyncState; * try * { * string text = Encoding.UTF8.GetString(obj.Buffer); * string[] tokens = text.Split('~'); * if (tokens.Length == 1) return; * MessageBox.Show(tokens[0]); * MessageBox.Show(tokens[1]); * MessageBox.Show(tokens[2]); * // 수신 받은거 처리 후 * obj.ClearBuffer(); * //obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, SocketFlags.None, DataReceived, obj); * obj.WorkingSocket.Receive(obj.Buffer); * } * catch (Exception e) * { * MessageBox.Show(e.ToString()); * } * }*/ public void SendData(string[] attribute) { try { AsyncObject ao = new AsyncObject(4096); ao.WorkingSocket = client; int size = attribute.Length; string Data = ""; for (int i = 0; i < size; i++) { Data += attribute[i]; Data += "/"; } byte[] bD = Encoding.UTF8.GetBytes(Data + "\r\n"); ao.WorkingSocket.Send(bD); ao.WorkingSocket.Receive(ao.Buffer); string text = Encoding.UTF8.GetString(ao.Buffer); string[] tokens = text.Split('~'); if (tokens.Length == 1) { return; } if (tokens[0] == "A") { PredictUserControlViewModel.instance.Arank = "yes"; } else if (tokens[0] == "B") { PredictUserControlViewModel.instance.Brank = "yes"; } else if (tokens[0] == "C") { PredictUserControlViewModel.instance.Crank = "yes"; } else { PredictUserControlViewModel.instance.Drank = "yes"; } PredictUserControlViewModel.instance.ASR = tokens[1].ToString(); PredictUserControlViewModel.instance.ASSR = tokens[2].ToString(); PredictUserControlViewModel.instance.ASSNR = tokens[3].ToString(); PredictUserControlViewModel.instance.AFR = tokens[4].ToString(); PredictUserControlViewModel.instance.SMR = tokens[5].ToString(); //0번 predict 1번 asr 2번 assr 3번 assnr 4번 videoChk // 수신 받은거 처리 후 ao.ClearBuffer(); } catch (Exception e) { MessageBox.Show(e.ToString()); } }
public void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // 0x01 기준으로 짜른다. // tokens[0] - 보낸 사람 IP // tokens[1] - 보낸 메세지 string[] tokens = text.Split('#'); string ip = tokens[0]; string msg = tokens[1]; string nick = tokens[2]; // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. AppendText(serverF.serverForm.txtLog, string.Format("[Client]{0}: {1}", ip, msg)); // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다. for (int i = connectedClient.Count - 1; i >= 0; i--) { Socket socket = connectedClient[i]; if (socket != obj.WorkingSocket) { try { socket.Send(obj.Buffer); } catch { // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. try { socket.Dispose(); } catch { } connectedClient.RemoveAt(i); } } } // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); }
void ReceiveHandler(IAsyncResult ar) { AsyncObject asyncObject = (AsyncObject)ar.AsyncState; int recvBytes = 0; try { recvBytes = asyncObject.WorkingSocket.EndReceive(ar); if (recvBytes > 0) { Byte[] msgByte = new Byte[recvBytes]; Array.Copy(asyncObject.Buffer, msgByte, recvBytes); AppendText(outputMsg, string.Format("{0} : {1}", asyncObject.WorkingSocket.RemoteEndPoint, Encoding.Unicode.GetString(msgByte))); foreach (Socket client in clients) { if (client != asyncObject.WorkingSocket) { client.Send(msgByte); } } } asyncObject.ClearBuffer(); asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, asyncObject.Buffer.Length, SocketFlags.None, ReceiveHandler, asyncObject); } catch (SocketException exception) { if (exception.ErrorCode == 10054) { AppendText(outputMsg, string.Format("{0}와의 연결이 끊겼습니다.", asyncObject.WorkingSocket.RemoteEndPoint)); foreach (Socket client in clients) { if (client == asyncObject.WorkingSocket) { clients.Remove(client); break; } } serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); AppendText(outputMsg, "다른 클라이언트를 기다립니다."); } else { AppendText(outputMsg, string.Format("수신에 실패하였습니다.\n{0}", exception.Message)); return; } } }
private void DataReceive(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; int received = obj.WorkingSocket.EndReceive(ar); string txt = Encoding.UTF8.GetString(obj.Buffer).Trim('\0'); //txt = txt.Trim("\0"); string msg = "From {" + obj.id + "} Client:" + txt; System.Console.WriteLine(msg); byte[] sendMsg = Encoding.UTF8.GetBytes(obj.id + " ACK\n"); obj.WorkingSocket.Send(sendMsg); obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 1024, 0, DataReceive, obj); }
void DataReceived(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; try { int received = obj.WorkingSocket.EndReceive(ar);//오류 해결 if (received <= 0) { obj.WorkingSocket.Close(); return; } string text = Encoding.UTF8.GetString(obj.Buffer); string[] tokens = text.Split(':'); //기준 string id = Decrypt256(tokens[0], key); //보낸사람 ID string[] message; message = tokens[1].Split('='); message[0] += "=="; string msg = Decrypt256(message[0], key);//메세지 // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. //전송 시간 표시 추가. AppendText(txtHistory, string.Format(DateTime.Now.ToString("HH:mm:ss") + "[받음]{0}: {1}", id, msg)); // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); } catch//오류시 폼 종료 { //Application.Exit(); } }
/// <summary> /// 데이터 수신 Callback /// </summary> /// <param name="ar"></param> private void ReceivedCallback(IAsyncResult ar) { // BeginReceive에서 수신한 데이터를 AsyncObject로 변환 AsyncObject obj = (AsyncObject)ar.AsyncState; try { int received = obj.WorkingSocket.EndReceive(ar); // 수신한 데이터가 없으면 종료 if (received <= 0) { obj.WorkingSocket.Close(); return; } // 수신한 데이터를 텍스트로 변환 string txt = Encoding.UTF8.GetString(obj.Buffer); // 0x01 기준으로 분할 string[] tokens = txt.Split('\x01'); string ip = tokens[0]; string msg = tokens[1]; // 로그 delegate로 전달 AppendText(string.Format("[RECV] {0}: {1}", ip, msg)); // 버퍼를 비운 뒤, 다시 서버 수신 대기 obj.ClearBuffer(); this.Receive(ar); } catch (SocketException se) { if (se.SocketErrorCode == SocketError.ConnectionReset) { this.StartClient(clientIp, clientPort); } } }
void ReceiveHandler(IAsyncResult ar) { AsyncObject asyncObject = (AsyncObject)ar.AsyncState; int recvBytes = 0; try { recvBytes = asyncObject.WorkingSocket.EndReceive(ar); if (recvBytes > 0) { Byte[] msgByte = new Byte[recvBytes]; Array.Copy(asyncObject.Buffer, msgByte, recvBytes); AppendText(outputMsg, string.Format("받음: {0}", Encoding.Unicode.GetString(msgByte))); } asyncObject.ClearBuffer(); asyncObject.WorkingSocket.BeginReceive(asyncObject.Buffer, 0, asyncObject.Buffer.Length, SocketFlags.None, ReceiveHandler, asyncObject); } catch (Exception exception) { MessageBox.Show("Receive 중 문제가 발생하였습니다.\n" + exception.Message); return; } }
private void StreamReceive(IAsyncResult ar) { lock (_lock) { AsyncObject obj = (AsyncObject)ar.AsyncState; try { int len = obj.WorkingSocket.EndReceive(ar); for (int i = 0; i < len; i++) { _byteList.Add(obj.Buffer[i]); } obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, StreamReceive, obj); } catch (Exception ex) { } ProcessStreamByte(); } }
public void DataReceived(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; try { string text = Encoding.UTF8.GetString(obj.Buffer); string[] tokens = text.Split('~'); if (tokens.Length == 1) { return; } MessageBox.Show(tokens[0]); MessageBox.Show(tokens[1]); MessageBox.Show(tokens[2]); // 수신 받은거 처리 후 obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, SocketFlags.None, DataReceived, obj); } catch (Exception e) { MessageBox.Show(e.ToString()); } }
// MARK - 서버로부터 메세지 수신 void DataReceived(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; obj.WorkingSocket.EndReceive(ar); string text = Encoding.UTF8.GetString(obj.Buffer).Trim('\0'); string[] tokens = text.Split(':'); /// MARK - 일반 메세지 수신 if (tokens[0] == "send") { string id = tokens[2]; string msg = tokens[3]; if (involvedServerCode == tokens[1]) { AppendText(txtBox, string.Format("[수신] {0} : {1} ", id, msg)); } } else if (tokens[0] == "newUser") { if (tokens[2] == involvedServerCode) { AppendText(txtBox, string.Format("{0} 님이 참여하셨습니다.", tokens[1])); } } else if (tokens[0] == "exitInvolvedServer") { if (involvedServerCode == tokens[1]) { AppendText(txtBox, string.Format("{0}님이 퇴장하셨습니다.", tokens[3])); } else if (involvedServerCode == tokens[2]) { AppendText(txtBox, string.Format("{0}님이 참여하셨습니다.", tokens[3])); } } /// MARK - 다른 클라이언트의 종료 else if (tokens[0] == "close") { if (involvedServerCode == tokens[1]) { AppendText(txtBox, string.Format("{0}", tokens[2])); } } /// MARK - 접속하고자 하는 채팅 서버의 코드를 수신 else if (tokens[0] == "responseCode") { involvedServerCode = tokens[1]; sendMsgButton.Enabled = true; } /// MARK - 생성된 채팅 서버 목록 수신 else if (tokens[0] == "responseServerList") { string[] serverList = tokens[1].Split(','); for (int i = 0; i < serverList.Length; i++) { createdServerNameList.Add(serverList[i]); } } obj.ClearBuffer(); obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, SocketFlags.None, DataReceived, obj); }
void DataReceived(IAsyncResult ar) { AsyncObject obj = (AsyncObject)ar.AsyncState; if (!mSock.Connected) { MessageBox.Show("Server is now ShutDown!"); return; } try { //int received = obj.WorkingSocket.EndReceive(ar); //if (received <= 0) //{ // obj.WorkingSocket.Close(); // return; //} // UTF8 인코더를 사용하여 바이트 배열을 문자열로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); // 0x01 기준으로 짜른다. // tokens[0] - 보낸 사람 IP // tokens[1] - 보낸 메세지 string[] tokens = text.Split('/'); string tag = tokens[0]; if (tag.Equals("<LOG>")) // 로그인 { string flag = tokens[1]; if (flag.Equals("true")) { DispatchService.Invoke(() => { ((App)Application.Current).StartMainWindow(); }); } else { MessageBox.Show("Login Failed.....TT"); ((App)Application.Current).CloseSocket(); } } else if (tag.Equals("<REG>")) // 회원가입 { string flag = tokens[1]; if (flag.Equals("true")) { Window s = new SuccessMsgBox("회원가입 성공"); DispatchService.Invoke(() => { ((App)Application.Current).StartMainWindow(); }); s.Show(); } else { MessageBox.Show("Register Failed.....TT"); Window x = new FalseMsgBox("Fail!"); DispatchService.Invoke(() => //너무 많은 UI 어쩌구저쩌구 SPA? STA 나와서 invoke 처리 2019-09-19 다민 { x.Show(); }); } ((App)Application.Current).CloseSocket(); } else if (tag.Equals("<ICF>")) // ID 체크 { string flag = tokens[1]; if (flag.Equals("true")) { MessageBox.Show("ID Check Sucess! in view"); DispatchService.Invoke(() => { ((App)Application.Current).StartMainWindow(); }); } else { MessageBox.Show("ID Check Failed.....TT"); } } else if (tag.Equals("<FRR>")) { if (tokens[1] == "true") { MessageBox.Show("hi"); } else { MessageBox.Show("false"); } } /*else if (tag.Equals("<FRR>")) // 친구추가 * { * if (MessageBoxResult.Yes == //친구 요청 받으면 * MessageBox.Show(tokens[1] + tokens[3], "친구 요청", MessageBoxButton.YesNo)) * { * OnSendData("<FRA>", tokens[1] + "/" + tokens[2]+ "/Yes/"); * } * else * { * OnSendData("<FRA>", tokens[1] + "/" + tokens[2] + "/No/"); * } * DispatchService.Invoke(() => * { * ((App)Application.Current).StartMainWindow(); * }); * } * else if (tag.Equals("<FRA>")) // 친구 feedback * { * MessageBox.Show(tokens[2] + tokens[3]); * DispatchService.Invoke(() => * { * ((App)Application.Current).StartMainWindow(); * }); * } */ else if (tag.Equals("<MSG>")) // 메세지 { database sqlite = new database(); sqlite.ChattingCreate(tokens[1], tokens[2], tokens[3], tokens[4]); DispatchService.Invoke(() => { ((App)Application.Current).AddChat(false, tokens[4]); }); } else if (tag.Equals("<FIN>")) { closeSock(); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. //^^^^^^^^ // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); } catch (Exception e) { MessageBox.Show(e.ToString()); obj.WorkingSocket.Close(); return; } }
public void DataReceived(IAsyncResult ar) { try { Decodings deco = new Decodings(); AsyncObject obj = (AsyncObject)ar.AsyncState; int received = obj.WorkingSocket.EndReceive(ar); //string replacetext = encodedtext.Replace(); ////string jointext = string.Join(encodedtext, ); //Decoder decode = Encoding.ASCII.GetDecoder(); //decode.Convert(obj.Buffer, 0, 20, deco.chars, 0, 20, false, out deco.byteused, out deco.charsused, out deco.completed); //if (obj.Buffer[0] == 0x50) //{ // AppendText(Answer, encodedtext); // AppendText(richtextboxlog, settext); //} for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { socket.Dispose(); } catch { } connectedClients.RemoveAt(i); } } if (received <= 0) { obj.WorkingSocket.Close(); return; } obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 64, 0, DataReceived, obj); obj.WorkingSocket.ReceiveTimeout = 4096; obj.WorkingSocket.ReceiveBufferSize = 4096; obj.WorkingSocket.SendBufferSize = 4096; string encodetext = BitConverter.ToString(obj.Buffer); encodetext.Trim(); encodetext.Split('-'); char[] 아스키코드로변환 = Encoding.ASCII.GetChars(obj.Buffer); AppendText(Answer, encodetext); obj.ClearBuffer(); } catch (NullReferenceException ex) { MessageBox.Show(ex.Message); } catch (SocketException ex) { MessageBox.Show(ex.Message); } catch (InvalidOperationException ex) { MessageBox.Show(ex.Message); } }