2012-05-29 80 views
1

我正在開發一個c#和php項目,PHP腳本向c#程序打開一個套接字,並且c#程序將讀取數據,然後發回響應。從套接字讀取數據,發送回覆並關閉

在PHP腳本中,我有以下幾點:

echo "Opening Client"; 

$fp = fsockopen("127.0.0.1", 12345, $errno, $errstr, 30); 

if (!$fp) 
{ 
    echo "Error: $errstr ($errno)<br />"; 
} 
else 
{ 
    $out = "GET/HTTP/1.1\r\n"; 
    $out .= "Host: 127.0.0.1\r\n"; 
    $out .= "Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    while (!feof($fp)) 
    { 
     echo fgets($fp, 128); 
    } 
    fclose($fp); 
} 

在C#項目中,我有以下幾點:

public void startListen() 
     { 
      int port = 12345; 
      IPAddress serverAddress = IPAddress.Parse("127.0.0.1"); 
      TcpListener listener = new TcpListener(serverAddress, 12345); 
      listener.Start(); 

      TcpClient client = listener.AcceptTcpClient(); 

      NetworkStream stream = client.GetStream(); 
      byte[] data = new byte[client.ReceiveBufferSize]; 
      int bytesRead = stream.Read(data, 0, Convert.ToInt32(client.ReceiveBufferSize)); 
      string request = Encoding.ASCII.GetString(data, 0, bytesRead); 
      Console.WriteLine(request); 

      Console.ReadLine(); 

PHP腳本似乎停留等待,沒有完成,我猜測它的存在是因爲c#應用程序上的套接字發送迴應,但我不知道如何做到這一點。另一個問題,在C#中我需要有Console.ReadLine()否則c#程序將退出,但PHP腳本然後按預期完成。

基本上,我想知道的是這是讀取在套接字上發送的數據的最佳方式,保持程序運行的最佳方式是什麼,以便它始終監聽套接字以及如何發回回覆,以便PHP腳本可以完成。

感謝您提供的任何幫助。

+0

在你的C#代碼...你居然不寫什麼流?我想有一些stream.Write()方法應該用於發回數據。另一個說明:你確定你在正確的抽象層次上工作嗎? Arent有.NET中的StreamReader/StreamWriter類,這使它更容易與(套接字)流進行交互? – Max

回答

3

在處理完我需要的數據之後,我設法弄清楚了這一點,然後發送一個stream.write,這就是發回應答的內容。

下面是代碼

  int port = 12345; 
      IPAddress serverAddress = IPAddress.Parse("127.0.0.1"); 
      TcpListener listener = new TcpListener(serverAddress, port); 
      listener.Start(); 

      while (true) 
      { 
       TcpClient client = listener.AcceptTcpClient(); 

       NetworkStream stream = client.GetStream(); 
       byte[] data = new byte[client.ReceiveBufferSize]; 
       int bytesRead = stream.Read(data, 0, Convert.ToInt32(client.ReceiveBufferSize)); 
       string request = Encoding.ASCII.GetString(data, 0, bytesRead); 
       Console.WriteLine(request); 
       byte[] msg = System.Text.Encoding.ASCII.GetBytes("200 OK"); 

       // Send back a response. 
       stream.Write(msg, 0, msg.Length); 
       client.Close(); 
      } 

感謝您的幫助

+0

這裏關閉'TcpClient'意味着要殺死它! –

+0

這是我需要它做的不是。一旦它發回了回覆,客戶端就完成了,不應該再向套接字發送更多數據,所以我關閉了連接。 – Boardy

+0

我需要繼續與客戶溝通,假設這是一個聊天應用程序,我們不希望客戶端連接並向他發送成功標記並完成,我們希望進一步進行通信。 –

0

我不是任何想象力的PHP人,所以我的答案取決於php是否能夠正確響應。在C#端,創建一個while/do-while循環,繼續運行以接受下一個傳入的請求。這裏有一個簡單的例子:

http://www.csharp-examples.net/socket-send-receive/

確保設定,使得信息被刷新的無延時選項。

2

粗硬先生的解決方案是正確的,但我認爲這樣的插座是更好的。

所以插座解決方案是:

private void Form3_Load(object sender, EventArgs e) 
{ 
    sc_listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IPEndPoint ip_local = new IPEndPoint(IPAddress.Loopback, 1225); 
    sc_listener.Bind(ip_local); 
    sc_listener.Listen(10); 

    AsyncCallback callback = new AsyncCallback(procces_incoming_socket); 
    sc_listener.BeginAccept(callback, sc_listener); 
} 

void procces_incoming_socket(IAsyncResult socket_object) 
{ 
    Socket sc_listener = ((Socket)socket_object.AsyncState).EndAccept(socket_object); 

    AsyncCallback receive = new AsyncCallback(receive_data); 
    buffer = new byte[100]; 
    sc_listener.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, receive, sc_listener); 
} 

void receive_data(IAsyncResult socket) 
{ 
    // the system need to wait so i make a loop when it gets data 
    //i end the loop by flag=false 
    bool flag = true; 
    Socket re_socket = ((Socket)socket.AsyncState); 
    while(flag) 
    { 
     int bytes_recieved = re_socket.EndReceive(socket); 

     string data = UTF8Encoding.UTF8.GetString(buffer); 
     if (textBox1.InvokeRequired) 
     { 
      // for cross thread problem 
      textBox1.Invoke(new MethodInvoker(delegate { textBox1.Text = data; })); 
     } 
     else 
     { 
      textBox1.Text = data; 
     } 
     flag = false; 
    } 
    string back_data = "my pm socket back"; 
    byte[] buffers = new byte[50]; 
    buffers = UTF8Encoding.UTF8.GetBytes(back_data); 
    re_socket.Send(buffers); 
    // if the socket is not closed php will load for maximum required time and then error 
    re_socket.Close(); 
    //start for next listening (O-0) 
    AsyncCallback callback = new AsyncCallback(procces_incoming_socket); 
    sc_listener.BeginAccept(callback, sc_listener); 
} 
+0

php代碼是一樣的 –

相關問題