2014-02-19 2 views
1

TCP Socekts 및 C#을 사용하여 클라이언트 - 서버 응용 프로그램을 개발 중입니다. 콘솔 응용 프로그램에서 ASP 페이지로 메시지를 보내야합니다. OnLoad 이벤트를 사용하여 ASP 페이지에서 연결할 수 있고 때로는 PageLoad 이벤트에서 여러 메시지 만받을 수 있습니다. 나는 2 개의 질문이있다 : 1. 지속적으로 서버 소켓을 듣고 메시지를받는 방법?
2. ASP.NET 페이지가 (사용자가) 서버와의 연결을 끊을 때를 아는 방법은 무엇입니까?단일 ASP.NET 페이지에서 소켓을 청취하는 방법

서버 콘솔 응용 프로그램 :

 static void StartServer() 
    { 
     serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
     IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 1000); 

     serverSocket.Bind(ipEndPoint); 
     serverSocket.Listen(4); 

     ConsoleKeyInfo cki; 
     XmlDocument doc = new XmlDocument(); 

     doc.Load("test.xml"); 
     serverSocket.BeginAccept(new AsyncCallback(OnAccept), null); 

     Console.WriteLine("Server started " + DateTime.Now + Environment.NewLine); 
     Console.WriteLine("Press S to start Data Sharing or ESC key to quit" + Environment.NewLine);    

     do 
     { 
      cki = Console.ReadKey(); 

      if (cki.Key == ConsoleKey.S) 
      {      
       foreach (XmlNode node in doc.DocumentElement.ChildNodes) 
       { 
        try 
        { 
         _client = (ClientInfo)clientList[0]; 
         if (((ClientInfo)clientList[0]).strName == node.Attributes["type"].InnerText) 
         { 
          SendRecord(node.Attributes["type"].InnerText + node.Attributes["value"].InnerText, (ClientInfo)clientList[0]); 
          clientList.Insert(clientList.Count, (ClientInfo)clientList[0]); 
          clientList.RemoveAt(0); 
         } 
        } 

        catch (Exception ex) 
        { 
         Console.WriteLine(ex.message); 
        } 
       } 
       Console.WriteLine("Data sharing finished " + DateTime.Now); 
      } 

     } while (cki.Key != ConsoleKey.Escape); 
    }   

    static void SendRecord(string _msg, ClientInfo client) 
    { 
     Data msgToSend = new Data(); 
     msgToSend.cmdCommand = Command.Message; 
     msgToSend.strMessage = _msg; 
     byte[] byteData = msgToSend.ToByte(); 

     try 
     { 
      client.socket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend), _client); 
      Thread.Sleep(3); 
     } 

     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

ASP.NET 클라이언트 측 :

protected void Page_Load(object sender, EventArgs e) 
{   
    if (!IsPostBack) 
     Connect(); 
} 

protected void Page_OnClose(object sender, EventArgs e) 
{ 
    Disconnect(); 
} 

protected void updateEvent(object sender, EventArgs e) 
{ 
    if (msglist.Count > 0) lstRecords.Items.Add(msg); 
    lstRecords.Height = Unit.Percentage(100);  
} 


private void Connect() 
{ 
    Data msgToSend = new Data(); 

    IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); 
    IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, 1000); 
    clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

    msgToSend.strType = strType; 
    msgToSend.strMessage = null; 
    msgToSend.cmdCommand = Command.List; 

    byteData = msgToSend.ToByte(); 

    try 
    { 
     clientSocket.BeginConnect(ipEndPoint, new AsyncCallback(OnConnect), null); 
     clientSocket.BeginSend(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnSend), null); 

     byteData = new byte[1024]; 
     clientSocket.BeginReceive(byteData, 0, byteData.Length, SocketFlags.None, new AsyncCallback(OnReceive), null); 
    } 

    catch (Exception ex) 
    { 
     lstRecords.Items.Add(ex.Message); 
    } 
} 

서버 응용 프로그램은 아무 문제없이 WinApp 및 ConsoleApp에 전송된다. 하지만 ASP 페이지에서는 올바르게 연결 메시지 만받을 수 있으며 때로는 1-2-3 메시지 만받을 수 있습니다. 나는 setInterval("__doPostBack('upDynamicClock', '');", 1000); 자바 스크립트를 사용하여 페이지를 새로 고침

+0

지금까지 각면에서 개발 한 코드의 몇 가지 주요 점, 작동하는 것과 적용되지 않는 것의 몇 가지 예를 제공하십시오. – J0e3gan

+1

사실, 서버 응용 프로그램은 문제없이 WinApp 및 ConsoleApp로 전송 중입니다. 하지만 ASP 페이지에서는 올바르게 연결 메시지 만받을 수 있으며 때로는 1-2-3 메시지 만받을 수 있습니다. setInterval ("__ doPostBack ('upDynamicClock', '');", 1000);을 사용하고 있습니다. 또한 새로 고침. 또한 OnClose 이벤트를 사용하여 닫기 페이지에서 연결 끊기 문제가 있습니다. –

+0

ASP .NET 페이지 수명주기에는 여러 단계가 있습니다. 나는 데이터를 논쟁 적으로 수신하고 동시에 컨트롤을 업데이트하기 위해 어느 것을 사용해야하는지 혼란 스럽다. 아니면 불가능한가요? –

답변

1

HTTP는 상태 비 저장이며, ASP.NET WebForms는 viewstate 등으로이를 숨기려고합니다. 브라우저에서 해당 페이지가 표시되면 해당 페이지는 더 이상 작동하지 않으며 OnSend 콜백은 더 이상 호출되지 않습니다. 이 내용은 Create web page with live socket based data에서도 설명합니다.

목표가 서버 공급 데이터로 HTML 요소를 업데이트하는 것이라면 SignalR을 살펴보십시오.

+0

답변 해 주셔서 감사합니다. 프레임 워크 만 사용하는 경우 웹 소켓을 사용할 수 있습니까? –

+0

@user 당신은 이것을 볼 수 있습니다 [codeproject] (http://www.codeproject.com/Articles/618032/Using-WebSocket-in-NET-4-5-Part-2), 문제는 브라우저 지원에 있습니다 [SignalR의 시작 페이지] (http://www.asp.net/signalr/overview/signalr-20/getting-started-with-signalr-20/supported-platforms)에서 설명했습니다. SignalR 클라이언트 라이브러리 (JS)는 폴백 메커니즘을 사용하여 예상대로 작동하는지 확인합니다. 브라우저가 순수한 웹 소켓을 사용하면 브라우저가이를 지원해야합니다. 그렇지 않으면 작동하지 않습니다. – CodeCaster

+0

오케이, Server-Sent Events는 어떻습니까? 구현이 간단하다는 것을 알았습니다. 이 경우에 사용할 수 있습니까? –

관련 문제