private void PictureBox1_Click(object sender, EventArgs e) { if (!mainSock.IsBound) { MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!"); return; } send_x = p.X.ToString(); send_y = p.Y.ToString(); byte[] x = Encoding.UTF8.GetBytes("Server" + ':' + tts + ':' + send_x + ':' + send_y + ':'); sendAll(null, x); AppendText(txtHistory, string.Format("[보냄]server: {0} x좌표{1}, y좌표{2}", tts, send_x, send_y)); }
void BeginStartServer(object sender, EventArgs e) { int port; if (!int.TryParse(txtPort.Text, out port)) { MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다."); txtPort.Focus(); txtPort.SelectAll(); return; } IPHostEntry he = Dns.GetHostEntry(Dns.GetHostName()); // 처음으로 발견되는 ipv4 주소를 사용한다. foreach (IPAddress addr in he.AddressList) { if (addr.AddressFamily == AddressFamily.InterNetwork) { //AppendText(txtHistory, addr.ToString()); string[] ip = addr.ToString().Split('.'); // ! A, B, C 클래스 제외 if (ip[0].Equals("172") || ip[0].Equals("192") || ip[0].Equals("10") || ip[0].Equals("169") || ip[0].Equals("127") || ip[0].Equals("0") || ip[0].Equals("224") || ip[0].Equals("240") || ip[0].Equals("239") || (ip[0].Equals("192") && ip[1].Equals("168")) || (ip[0].Equals("172") && Convert.ToInt32(ip[1]) >= 16 && Convert.ToInt32(ip[1]) <= 31)) { //AppendText(txtHistory, "포함"); } else { thisAddress = IPAddress.Parse(addr.ToString()); } } } // 서버에서 클라이언트의 연결 요청을 대기하기 위해 // 소켓을 열어둔다. IPEndPoint serverEP = new IPEndPoint(thisAddress, serverPort); udpSock.Bind(serverEP); mainSock.Bind(serverEP); mainSock.Listen(10); AppendText(txtHistory, string.Format("서버 시작: @{0}", serverEP)); AppendText(txtAddress, thisAddress.ToString()); // 비동기적으로 클라이언트의 연결 요청을 받는다. //udpSock.BeginAccept(AcceptCallback, null); mainSock.BeginAccept(AcceptCallback, null); }
// 시작 버튼 private void BeginStartServer(object sender, EventArgs e) { int port = 15000; if (mainSock.IsBound) { MsgBoxHelper.Warn("서버가 실행중입니다."); return; } IPEndPoint serverEP = new IPEndPoint(thisAddress, port); mainSock.Bind(serverEP); mainSock.Listen(10); mainSock.BeginAccept(AcceptCallback, null); AppendText(txtHistory, string.Format("서버가 실행되었습니다.")); }
void OnSendData(object sender, EventArgs e) { // 서버가 대기중인지 확인한다. if (!mainSock.IsBound) { MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!"); return; } // 보낼 텍스트 tts = txtTTS.Text.Trim(); send_x = p.X.ToString(); send_y = p.Y.ToString(); if (string.IsNullOrEmpty(tts)) { MsgBoxHelper.Warn("텍스트가 입력되지 않았습니다!"); txtTTS.Focus(); return; } /* * // 문자열을 utf8 형식의 바이트로 변환한다. * byte[] bDts = Encoding.UTF8.GetBytes("Server" + ':' + tts); * * // 연결된 모든 클라이언트에게 전송한다. * sendAll(null, bDts); * * // 전송 완료 후 텍스트박스에 추가하고, 원래의 내용은 지운다. * AppendText(txtHistory, string.Format("[보냄]server: {0}", tts)); * txtTTS.Clear(); */ // 문자열을 utf8 형식의 바이트로 변환한다. byte[] x = Encoding.UTF8.GetBytes("Server" + ':' + tts + ':' + send_x + ':' + send_y + ':'); txtTTS.Clear(); // 연결된 모든 클라이언트에게 전송한다. sendAll(null, x); // 전송 완료 후 텍스트박스에 추가하고, 원래의 내용은 지운다. AppendText(txtHistory, string.Format("[보냄]server: {0}, x좌표{1}, y좌표{2}", tts, send_x, send_y)); Console.WriteLine(send_x); Console.WriteLine(send_y); txtTTS.Clear(); }
private void OnSendData(object sender, EventArgs e) { return; // 서버가 대기중인지 확인한다. if (!_mainSock.IsBound) { MsgBoxHelper.Warn("서버가 실행되고 있지 않습니다!"); return; } // 보낼 텍스트 string tts = txtTTS.Text.Trim(); if (string.IsNullOrEmpty(tts)) { MsgBoxHelper.Warn("텍스트가 입력되지 않았습니다!"); txtTTS.Focus(); return; } // 문자열을 utf8 형식의 바이트로 변환한다. byte[] bDts = Encoding.UTF8.GetBytes(_thisAddress.ToString() + '\x01' + tts); // 연결된 모든 클라이언트에게 전송한다. for (int i = _connectedClients.Count - 1; i >= 0; i--) { Socket socket = _connectedClients[i]; try { socket.Send(bDts); } catch { // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. try { socket.Dispose(); } catch { } _connectedClients.RemoveAt(i); } } // 전송 완료 후 텍스트박스에 추가하고, 원래의 내용은 지운다. AppendText(txtHistory, string.Format("[보냄]{0}: {1}", _thisAddress.ToString(), tts)); txtTTS.Clear(); }
void BeginStartServer(object sender, EventArgs e) { int port; if (!int.TryParse(txtPort.Text, out port)) { MsgBoxHelper.Error("포트 번호가 잘못 입력되었거나 입력되지 않았습니다."); txtPort.Focus(); txtPort.SelectAll(); return; } // 서버에서 클라이언트의 연결 요청을 대기하기 위해 // 소켓을 열어둔다. IPEndPoint serverEP = new IPEndPoint(thisAddress, port); mainSock.Bind(serverEP); mainSock.Listen(10); // 비동기적으로 클라이언트의 연결 요청을 받는다. mainSock.BeginAccept(AcceptCallback, null); }
void DataReceived(IAsyncResult ar) { // BeginReceive에서 추가적으로 넘어온 데이터를 AsyncObject 형식으로 변환한다. AsyncObject obj = (AsyncObject)ar.AsyncState; try { // 데이터 수신을 끝낸다. int received = obj.WorkingSocket.EndReceive(ar); // 받은 데이터가 없으면(연결끊어짐) 끝낸다. if (received <= 0) { obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); return; } Console.WriteLine(obj.Buffer); // 텍스트로 변환한다. string text = Encoding.UTF8.GetString(obj.Buffer); Console.WriteLine("데이터 브로드 캐스트" + text); string[] arrayText; arrayText = text.ToString().Split('?'); DataForm data = new DataForm(); data = JsonConvert.DeserializeObject <DataForm>(arrayText[0]); if (data.req == null) { MsgBoxHelper.Error("null"); data.req = ""; } if (data.req.Equals("close")) { MsgBoxHelper.Error("close 들어옴"); Console.WriteLine("close 들어옴"); obj.WorkingSocket.Disconnect(false); obj.WorkingSocket.Close(); } // 텍스트박스에 추가해준다. // 비동기식으로 작업하기 때문에 폼의 UI 스레드에서 작업을 해줘야 한다. // 따라서 대리자를 통해 처리한다. AppendText(txtHistory, string.Format("[받음]{0}: {1}", data.id, data.text)); // for을 통해 "역순"으로 클라이언트에게 데이터를 보낸다. for (int i = connectedClients.Count - 1; i >= 0; i--) { Socket socket = connectedClients[i]; if (socket != obj.WorkingSocket) { try { string request = JsonConvert.SerializeObject(data); AESEncrypt256(request, key); Encoding.UTF8.GetBytes(AESEncrypt256(request, key)); Console.WriteLine("이 암호화된 내용으로 브로드 캐스팅 : " + AESEncrypt256(request, key)); socket.Send(Encoding.UTF8.GetBytes(AESEncrypt256(request, key))); } catch { // 오류 발생하면 전송 취소하고 리스트에서 삭제한다. try { socket.Dispose(); } catch { } // connectedClients.RemoveAt(i); } } } // 데이터를 받은 후엔 다시 버퍼를 비워주고 같은 방법으로 수신을 대기한다. obj.ClearBuffer(); // 수신 대기 obj.WorkingSocket.BeginReceive(obj.Buffer, 0, 4096, 0, DataReceived, obj); } catch { } }