2012-12-18 3 views
0

학교 프로젝트를위한 서버/클라이언트 응용 프로그램을 만들려고합니다.사용자가있는 경우 소켓 닫기

나는 주어진 포트에 서버가 있고, 여러 사용자가 연결되어 있으며 각 사용자마다 고유 한 사용자 이름이 있습니다.

이제 연결하려는 사용자가 유효한 사용자 이름을 사용하고 있는지 확인하고 싶습니다. 예를 들어 사용자 이름이 A 인 사용자가 이미 연결되어있는 경우 연결하려는 새 사용자는 사용자 이름 A를 사용할 수 없습니다.

이 경우 서버는 새 클라이언트에 오류 코드로 응답합니다. 나는이 프로그램 crashs을하려고 비주얼 스튜디오 richTextBox1에 잘못된 크로스 스레드 작업이 있다고 말할 때

private void Receive() 
    { 
     while (true) 
     { 
      byte[] buffer = new byte[64]; 
      socket.Receive(buffer); 
      string received = Encoding.Default.GetString(buffer); 
      if (received.IndexOf("!error") != -1) 
      { 
       string[] mySplit = received.Split(':'); 
       string errorCode = mySplit[1].Trim((char)0); 
       if (errorCode == "user exists") 
       { 
        richTextBox1.AppendText("Your connection was refused by server, because there's already another user connected with the username you choose"); 
        socket.Disconnect(true); 

        connectBtn.Enabled = true; 
       } 
      } 
     } 
    } 

:

이 부분에 대한 코드입니다.

+0

그리고 귀하의 질문은 ...? –

+0

"은 새 클라이언트에 오류 코드": 적절한 문제 설명이 아닙니다. "로 응답합니다. * 실제로 * 오류 코드는 잘라 내기 및 붙여 넣기를 사용하여 줄을 표시하는 것이 바람직합니다. – EJP

답변

4

UI 스레드에서만 UI 요소에 액세스 할 수 있습니다. 백그라운드 스레드에서 액세스하려고하면이 예외가 발생합니다. 이 코드는 UI 스레드를 영원히 차단하지 않고 응용 프로그램을 고정시키지 않도록 백그라운드 스레드에서 실행해야합니다.

UI 스레드로 마샬링하는 방법은 여러 가지가 있습니다. 그 중 일부는 배경 스레드를 처음 시작하는 방법에 따라 결정됩니다. (당신이 BackgroundWorker, Tasks, await`를 사용하는 경우,이 일을 가지 방법이 내장되어 등.)

한 범용 옵션 옵션은 단지 Invoke을 사용하는 것입니다

if (errorCode == "user exists") 
{ 
    this.Invoke(new Action(()=> { DisplayError(); })); 
} 

DisplayError 다음 모두 포함 할 수 있습니다 이 상황에 대한 귀하의 UI 코드. 일반적으로 비즈니스 로직에서 UI 코드를 분리하는 것이 가장 좋습니다. 애플리케이션 전반에 UI 코드를 포함시키는 것은 바람직하지 않습니다.

+0

여러분의 도움에 감사드립니다. – corvallo

+0

소켓을 "닫고"재사용 할 수있는 방법을 알고 있습니까? – corvallo

+0

@corvallo이 코드로 해결해야 할 별도의 문제가있는 경우 새로운 질문을해야합니다. – Servy

관련 문제