2017-11-10 13 views
-1

이것은 네트워크 프로그래밍 친구들에게는 매우 간단하지만이 점에 대해서는 약간 혼란 스럽습니다. 사용 예를 들어 질문 해 봅시다.초기 소켓 연결이 이루어진 후 TcpListener와 TcpClient 간의 통신을 구성하는 방법

나는 클라이언트가 사용자 이름으로 가입 할 수있는 채팅 서버를 만들려고했다. 계정이나 암호가 없습니다. 그냥 사용자 이름.

모든 것이 좋기 때문에 비동기 호출을 사용하는 작동중인 Echo Server 예제가 실행 중입니다. 이제 클라이언트와 서버 간의 메시지 처리를 정의해야합니다.

클라이언트가 이제 연결하고 연결된 사용자 목록을 가져 오려고합니다. 그 일을 어떻게 하죠?

제 생각에는 BeginGetConnectedUsers라는 함수를 만들고 서버에 메시지를 보냅니다. 서버는 사용자 목록으로 회신하지만 비동기 호출을 사용하기 때문에 Accept 코드를 통해 메시지를보고 BeginGetConnectedUsers의 회신임을 알게되어 데이터를 EndGetConnectedUsers로 보낼 것입니다 .

그러나 이것이 이런 식으로하는 좋은 방법인지는 잘 모르겠습니까? 그러나이 디자인으로 모든 BeginGet 함수를 EndGet 함수와 쌍을 이루어야합니다. 이것은 async await 스타일로 좀 더 읽기 쉽게 만들 수 있지만, 그렇다고해도 좋지 않을 수도 있습니다.

나는 더 그들은 모두 흥미로운 데이터 물건을 교환하기 시작해야 할 때 클라이언트와 서버 사이에 다음 통신을 구성하는 방법에 대한 경험 ...

그리고 조언을하지? 볼 곳? TCPLISTENER 작업을 포함하는 내 모든 Google 검색에서 에코 서버의 예를 보여 주며 이미 수행 방법을 알고 있습니다.

+0

서버가 주를 가지고 (당신은 그냥 무효 있도록 응답을 해달라고 할 수 있음) 청취 소켓. 새 연결이 만들어 질 때마다 비동기 수락 메서드에 새 소켓이 전달됩니다. 그래서 보통 각 소켓에 소켓에 새 소켓을 추가하여 각 클라이언트로 보낼 수있는 방법을 가지고 있습니다. Event는 Socket이 포함 된 StateObject 클래스를 만드는 것이 더 좋기 때문에 각 연결에 대해 이름이나 ID와 같은 다른 속성을 추가 할 수 있습니다. – jdweng

+0

도움이 될만한 응용 프로그램 계층이있는 복잡한 서버를 만들었습니다. 게시 참조 : https://stackoverflow.com/questions/44471975/gps-socket-communication-concox – jdweng

+0

아직 귀하의 링크를 방문한 적이 없지만 수신 서버가 연결을 수락하고 연결이 완료된 후 어떻게되는지 관심이 있습니다. 설립. 이미 여러 클라이언트에서 문자열을 앞뒤로 보냅니다. 다음 메시지 관리를 구성하는 방법에 대한 방법을 찾고 있습니다. 서버와 클라이언트간에 개체와 데이터를 잘 전달하는 방법. 그리고 모든 비동기를 수행하는 방법. – Holm76

답변

0

여기에는 많은 구현 방법이 있습니다. 전략 패턴이나 컨트롤러 패턴을 구현합니다. 다른 옵션은 상태 기계 (결정 성 자동 시스템) 또는 간단하고 큰 스위치 케이스입니다.

기본적으로 전선에서 메시지를 수신하는 기능은 하나뿐입니다. 모든 메시지는 같은 인터페이스를 사용하면 메시지를받을 때

IMessage<T> 
{ 
    string Type {get;set;} 
    T Data {get;set;} 
} 

그래서 당신은 당신이 원하는 실제 방법에 경로에 T 데이터 유형 속성을 사용할 수 있습니다 구현합니다.

class Controller 
{ 
    [Messagetype("GetConnectedUsersResponse")] 
    Response GetConnectedUsers(IEnumerable<User> users) 
    { 
     //... 
    } 

    [Messagetype("AnothermessageType")] 
    Response OtherStuffToDo(....) 
    { 
     //... 
    } 
} 

을 당신이 동적으로 메서드 호출 간단한 반사를 사용하여 메시지를 수신 할 때 : 컨트롤러를 사용하여 간단한 구현에서 , 당신은 메시지 유형을 나타내는 속성을 가진 컨트롤러 방법을 관리 할 anotate 일치하는 메시지 유형 속성이있는 속성이 있습니다.

리플렉션이 마음에 들지 않으면 다른 의사 (다른 의사들과 많이 닮음)가 전략 패턴을 사용하는 것입니다. 예를 들어 IoC 컨테이너의 키를 사용하여 일부 메시지 처리기를 등록 할 수 있습니다. 모든 hadlers 구현 함수는 사용자가 메시지를받을 때 당신이 당신이 좋아하는 IoC 컨테이너를 사용하여 핸들러를 해결 (최근 atipattern로 간주됩니다 이름으로 해결하기를, 그래서 소금 한 스푼으로 그것을 가지고)

interface MessageHandler<T> 
{ 
    Response Handle(T Data); 
} 

말할 수 당신은 당신이 (당신이 경우에) 응답과 "응답"반환 유형을 조정하는 방법을 정의해야 모두 구현에서

var handler = container.resolve(message.Type); 
var response = handler.handle(message.Data); 

+0

당신은 나보다 앞서 있고 너무 추상적 일 수 있습니다 ... 나는 프로그래밍에 새로운 사람입니다. 나는 당신이 말하는 것에 대해 생각합니다. – Holm76