2014-02-14 2 views
0

가 나는 Asynchronous Communication in C#비동기 통신

을 만드는 방법에 대한 자습서를 참조하지만 하나에 하나의 대화를 나눌 수 있습니다,
는 내가 서버를 사용하지 않고 보관할 수 ? 나는 C#에서 새로운 사람이기 때문에 무엇을해야할지 모른다.

미리 감사드립니다.

+0

, 당신은 할 수있다. 그러나 서버를 사용하여 * 채팅을 시도하십시오. 또는 XMPP 클라이언트를 구현하십시오. –

+0

WinForm 응용 프로그램을 사용 중입니다. – MarckxMan

+1

사람들이 내 대답을 왜 downvoted했는지 모르겠으므로 방금 삭제했습니다. @ liran63에 나는 모든 PC가 서버가 될 수 있음을 잘 알고 있습니다. 그래서 내가 의미하는 바는 ... 공통 서버없이 2 대 이상의 PC 채팅을 할 수는 없다는 것입니다. 이것에 대해 조금이라도 궁금하신 점이 있으시면 공유하십시오. 그러나 저는 이미 인터넷 연결을 통해 Winforms, WPF 및 Web을 수행했으며, 제 경험으로 볼 때 공통 서버가 없으면 이런 일은 결코하지 않았습니다. 내가 틀렸을 수도있다. 그러나 OP는 구체적으로 '여러 대의 PC와 채팅'한다고 말했다. 그리고 '하나 하나'로, 나는 그가 단지 2 대의 컴퓨터 채팅을 의미했다는 것을 확신한다. 내가 그 말을 제대로 했니? –

답변

0

나는 "서버"라는 단어로 거의 오해하지 않는다고 생각합니다. 그것은 웹 서버가 아니며 요청을 처리하는 서적 컴퓨터 (또는 응용 프로그램)입니다. 다중 사용자 채팅의 경우 서버와 클라이언트의 두 종류의 응용 프로그램을 만들어야합니다. 서버는 클라이언트를 청취하고 회신합니다. 일반적으로 하나의 서버와 많은 클라이언트가 있습니다. 간단한 서버/클라이언트 프로그램을 작성하고 개선하기를 제안합니다. 한 번에 한 명의 사용자 만 서비스 할 서버를 만듭니다. 로컬 IP의 특정 포트를 청취합니다. 나는 작업을 사용하여 프로그램을 단순화합니다.

 byte[] ba = new byte[1024]; 
     new Task(() => { 
      Output("Going to listen to messages..."); 
      Socket listeningS = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
      // Listening to local address. You should listen to external IP for real server 
      IPEndPoint ep = new IPEndPoint(IPAddress.Any, port); 
      listeningS.Bind((EndPoint)ep); 
      // One and only client at a time :) 
      listeningS.Listen(1); 
      while (isRunning) 
      { 
       // Accept client, receive data and send it back 
       Socket clientS = listeningS.Accept(); 
       int total = clientS.Receive(ba, 0, ba.Length, SocketFlags.None); 
       total = clientS.Send(ba, 0, total, SocketFlags.None); 
       // Client will open new connection (but later it is possible to use same) 
       clientS.Shutdown(SocketShutdown.Both); 
       clientS.Close(); 

      } 
     }).Start(); 

그런 다음 가장 쉬운 부분 인 클라이언트 응용 프로그램에서 시작하여 데이터를 연결하고 보내고받습니다. 당신이 할 일은해야

byte[] ba = Encoding.UTF8.GetBytes(message); 
    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    s.Connect(IPAddress.Loopback, port); 
    total = s.Send(ba, SocketFlags.None); 
    total = s.Receive(ba, 0, ba.Length, SocketFlags.None); 
    if (total > 0) 
    { 
     Output(Encoding.UTF8.GetString(ba, 0, total)); 
    } 

다음 것은 당신의 서버 스레드/비동기를 구현하는 것입니다 :) 물론

+0

정보 주셔서 감사합니다. – MarckxMan

+0

나는 당신이 요점을 얻고 앞으로 나아갈 것이기를 바랍니다 :) –

관련 문제