//서버 소켓을 열어서 준비한다. private void openServerSocket() { try { //Port 설정 후 Listen 대기 ipEndPointForServer = new IPEndPoint(IPAddress.Any, portNumber); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(ipEndPointForServer); serverSocket.Listen(20);//연결 수 지정 startMessengerTime = DateTime.Now.ToString("yyyy.MM.dd-HH:mm:ss"); //서버 준비가 완료되었다는 메세지 표시 MessageInfo messageInfo = new MessageInfo("message", "Server", LanguageResource.language_res.strMessageToNotifyServerIsOpened, getCurrentTime(), 0 + ""); string messageInXML = XMLHandlerForMessage.convertStringToXml(messageInfo); putMessageOnMessageBoard(messageInXML); } catch (SocketException ex) { throw new PortNumberAlreadyUsedException(); } catch (Exception ex) { MessageBox.Show("openServerSocket 에서 에러 발생\n" + ex.ToString()); } }
//서버에게 XML 메세지를 패킷으로 송신 private void sendMessageToServer(string messageInXML) { try { Byte[] messageData = Encoding.Default.GetBytes(messageInXML); clientSocket.Send(messageData); } catch (SocketException e) { MessageInfo messageInfo = new MessageInfo("message", "Server", LanguageResource.language_res.strMessageToNotifyClientIsDisconnectedFromServer, getCurrentTime(), "0"); messageInXML = XMLHandlerForMessage.convertStringToXml(messageInfo); putMessageOnMessageBoard(messageInXML); } }
private void acceptClientSocket() { try { int userNumber = 1; while (serverAlive) { //클라이언트가 들어오면, 접속을 받아들인다. Socket clientSocket = serverSocket.Accept(); //먼저 클라이언트로부터 userName을 받기 위해 메세지를 한번은 기다린다 Byte[] messageData = new Byte[1024]; clientSocket.Receive(messageData); string clientUserName = Encoding.Default.GetString(messageData); //그리고 클라이언트에게 배정한 userNumber를 전송한다 messageData = new Byte[1024]; messageData = Encoding.Default.GetBytes("" + userNumber); clientSocket.Send(messageData); //클라이언트의 정보를 서버에 저장 ClientInfo client = new ClientInfo(); client.ClientSocket = clientSocket; client.ClientSocketAlive = true; client.UserName = clientUserName; client.UserNumber = userNumber; listOfClient.AddLast(client); //리스트에 클라이언트 정보를 저장 userNumber++; //클라이언트 한명이 입장했다는 메세지를 존재하는 모든 클라이언트에게 전송 string message = (client.userName + " [" + client.userNumber + "] " + LanguageResource.language_res.strMessageToNotifyClientJoinedServer); MessageInfo messageInfo = new MessageInfo("message", "Server", message, getCurrentTime(), 0 + ""); string messageInXML = XMLHandlerForMessage.convertStringToXml(messageInfo); sendMessageToConnectedClients(messageInXML); //클라이언트로부터 메세지를 받기위한 스레드를 각각 생성 createThreadToReceiveMessageFromClient(client); } } catch (SocketException ex) { //클라이언트가 퇴장할 때마다 한번씩은 에러가 발생되기에 넘긴다. }catch (Exception ex) { MessageBox.Show("acceptClientSocket 에서 에러 발생\n" + ex.ToString()); } }
//클라이언트 서버에서 내보내기 private void removeClientFromServer(ClientInfo client) { try { client.ClientSocketAlive = false; //내보내려는 클라이언트의 활성상태 false로 변경 client.ClientSocket.Close(); //내보내려는 클라이언트의 소켓 닫기 string message = client.userName + " [" + client.userNumber + "] " + LanguageResource.language_res.strMessageToNotifyClientLeftServer; MessageInfo messageInfo = new MessageInfo("message", "Server", message, getCurrentTime(), 0 + ""); string messageInXML = XMLHandlerForMessage.convertStringToXml(messageInfo); listOfClient.Remove(client); //내보내려는 클라이언트의 정보 삭제 sendMessageToConnectedClients(messageInXML); } catch (Exception ex) { MessageBox.Show("removeClientFromServer 에서 에러 발생\n" + ex.ToString()); } }
//서버로부터 XML 메세지를 패킷으로 수신 private void receiveMessageFromServer() { try { while (clientAlive) { Byte[] messageData = new Byte[1024]; clientSocket.Receive(messageData); String messageInXML = Encoding.Default.GetString(messageData); putMessageOnMessageBoard(messageInXML); } } catch (Exception ex) { MessageInfo messageInfo = new MessageInfo("message", "Server", LanguageResource.language_res.strMessageToNotifyClientIsDisconnectedFromServer, getCurrentTime(), "0"); string messageInXML = XMLHandlerForMessage.convertStringToXml(messageInfo); putMessageOnMessageBoard(messageInXML); //MessageBox.Show(LanguageResource.language_res.strMessageToNotifyClientIsDisconnectedFromServer, userName); } }
//서버 운영자가 클라이언트에게 메세지를 쓸 때, 전송 버튼을 누를 때 private void buttonToSendMessage_Click(object sender, RoutedEventArgs e) { try { if (textBoxToInsertMessage.Text.Trim() == "") { return; } //서버가 입력한 메세지를 XML 값으로 변경 string message = textBoxToInsertMessage.Text.Trim(); MessageInfo messageInfo = new MessageInfo("message", "Server", message, getCurrentTime(), 0 + ""); string messageInXML = XMLHandlerForMessage.convertStringToXml(messageInfo); sendMessageToConnectedClients(messageInXML); textBoxToInsertMessage.Text = ""; textBoxToInsertMessage.Focus(); } catch (Exception ex) { MessageBox.Show("buttonToSendMessage_Click에서\n " + ex.ToString()); } }