void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); //전송받은 메시지를 '&' 기준으로 나눔 string[] tokens = text.Split('&'); //전송 받은 메시지 코드 string St_code = tokens[0]; if (St_code.Equals("101")) { MessageBox.Show("로그인에 성공했습니다."); // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); //Arduino 폼 띄우기 new Arduino(eunSock).ShowDialog(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); } else if (St_code.Equals("102")) { MessageBox.Show("ID가 맞지 않습니다."); //로그인에 실패하면 Socket이 닫히기 때문에 다시 생성 시켜주어야 한다. eunSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); } else if (St_code.Equals("103")) { MessageBox.Show("PW가 맞지 않습니다."); //로그인에 실패하면 Socket이 닫히기 때문에 다시 생성 시켜주어야 한다. eunSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); } }
private void User_Login_Click(object sender, EventArgs e) { if (eunSock.Connected) { MessageBox.Show("이미 연결되어 있습니다..", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } ID = UserID.Text.Trim(); //ID, Trim은 공백제거 PW = UserPw.Text.Trim(); int port = 15000; //포트 고정 if (string.IsNullOrEmpty(ID)) { MessageBox.Show("입력(ID)이 안된 부분이 있습니다.", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); UserID.Focus(); return; } else if (string.IsNullOrEmpty(PW)) { MessageBox.Show("입력(PW)이 안된 부분이 있습니다.", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } //서버에 연결 try { eunSock.Connect(eunAddress, port); } catch (Exception) { eunSock.Close(); MessageBox.Show("연결에 실패했습니다.", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } SendID(); //서버로 ID, password 묶어서 전송 // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다. AsyncObject obj = new AsyncObject(4096); obj.WorkingSocket = eunSock; eunSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 0, DataReceived, obj); }
private void Arduno_write_Click(object sender, EventArgs e) { LCD_txt.Text.Trim(); if (string.IsNullOrEmpty(LCD_txt.Text.Trim())) { MessageBox.Show("작성을 하지 않았습니다.", "확인", MessageBoxButtons.OK, MessageBoxIcon.Information); LCD_txt.Focus(); return; } //서버에 연결 SendID(); // 연결 완료, 서버에서 데이터가 올 수 있으므로 수신 대기한다. AsyncObject obj = new AsyncObject(4096); obj.WorkingSocket = eunSock; eunSock.BeginReceive(obj.Buffer, 0, obj.BufferSize, 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.Disconnect(false); obj.WorkingSocket.Close(); return; } // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); string[] tokens = text.Split('&'); string St_code = tokens[0]; if (St_code.Equals("201")) { MessageBox.Show("메세지 전송이 되었습니다."); // 클라이언트에선 데이터를 전달해줄 필요가 없으므로 바로 수신 대기한다. // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); } else if (St_code.Equals("400")) { MessageBox.Show("메세지 전송이 실패하였습니다."); eunSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); } }