2015-09-05 102 views
2

嘿,我在這裏有一個C#Tcp服務器,這裏的一個PHP客戶端都在工作。PHP - C#TCP客戶端/服務器如何發送字符串?

服務器

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net; 
using System.Net.Sockets; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 


     public static void Main() 
     { 
      try 
      { 
       IPAddress ipAd = IPAddress.Parse("127.0.0.1"); 
       TcpListener myList = new TcpListener(ipAd, 8001); 

       myList.Start(); 

       Console.WriteLine("The server is running at port 8001..."); 
       Console.WriteLine("The local End point is :" + 
            myList.LocalEndpoint); 
       Console.WriteLine("Waiting for a connection....."); 


       while (true) 
       { 

       Socket s = myList.AcceptSocket(); 
       Console.WriteLine("Connection accepted from " + s.RemoteEndPoint); 

       byte[] b = new byte[100]; 
       int k = s.Receive(b); 
       string szReceived = Encoding.ASCII.GetString(b.Take(k).ToArray()); 
       Console.WriteLine(szReceived); 
       Console.WriteLine("Recieved..." + szReceived + "---"); 

       switch (szReceived) 
       { 
        case "ping": 
         Console.WriteLine("Ping wird ausgeführt!"); 
         ASCIIEncoding asen = new ASCIIEncoding(); 
       s.Send(asen.GetBytes("PONG !")); 
         s.Close(); 

         break; 

        case "logout": 

         break; 
       } 


       } 




       /* clean up */ 

        myList.Stop(); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Error..... " + e.StackTrace); 
      } 



     } 



    } 
} 

CLIENT

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 
    <script src="https://code.jquery.com/jquery-1.10.2.js"></script> 
<?PHP 

error_reporting(E_ALL); 
ini_set("display_errors", 1); 

$address="127.0.0.1"; 
$service_port = "8001"; 

/* Create a TCP/IP socket. */ 
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
if ($socket === false) { 
    echo "socket_create() failed: reason: <br>" . 
     socket_strerror(socket_last_error()) . "\n"; 
} 

echo "Attempting to connect to '$address' on port '$service_port'...<br>"; 
$result = socket_connect($socket, $address, $service_port); 
if ($result === false) { 
    echo "socket_connect() failed.\nReason: ($result) <br>" . 
      socket_strerror(socket_last_error($socket)) . "\n"; 
}else { 

echo "connected<br>"; 


} 

$in = "ping"; 
$out = ''; 

echo "Client Sended: PING !<br>"; 

socket_write($socket, $in, strlen($in)); 
echo "SENDED!.\n<br>"; 

echo "Reading response:\n\n<br>"; 

while ($out = socket_read($socket, 2048)) { 
echo $out; 
} 

socket_close($socket); 

?> 

我的問題是,現在我怎麼能現在叫我平..然後發送1個或多個字符串後面趕上他們在我的服務器來安慰他們或whateve? ...

我已經在VB中做過這個,所以我知道這是可能的我用Streamreader和寫它,但我想這不是在這裏工作? 代碼示例將是非常有益的

感謝每一個答案:)

回答

1

必須定義自己的協議,可以用它來發送任何東西。例如,發送如下內容:

ping|string1,string2 

這意味着命令ping,參數爲string1和string2。您可以定義涵蓋您需求的任何內容。然後以這種格式發送它們,然後解析它。

這是一個基於你的代碼的例子。看看這個(不變代碼的某些部分,省略了可讀性):

.... 

Console.WriteLine(szReceived); 
Console.WriteLine("Recieved..." + szReceived + "---"); 

var split = szReceived.Split('|'); 
if(split.Length==0)return; 

var command = split[0]; 
var parameters = new string[0]; 

if (split.Length > 0) 
    parameters = split[1].Split(','); 

switch (command) 
{ 
    case "ping": 
     Console.WriteLine("Ping wird ausgeführt!"); 
     ASCIIEncoding asen = new ASCIIEncoding(); 

     foreach (var p in parameters) 
      Console.WriteLine(p); 

     s.Send(asen.GetBytes("PONG !")); 
     s.Close(); 

     break; 

    case "logout": 

     break; 
} 
.... 

而且PHP代碼:

... 
$stringsToSend = array("Hello", "World!", "Sth"); 

$in = "ping|" . implode(",", $stringsToSend); 
$out = ''; 

echo "Client Sended: PING !<br>"; 

socket_write($socket, $in, strlen($in)); 
echo "SENDED!.\n<br>"; 
... 
+0

,現在我們應該比較OP版本和您的版本,以獲得祕密? ?? –

+0

你是對的!我將編輯 – Ahmad

+0

您實際上應該使用標記長度值格式的混亂,它會讓你的生活變得簡單。 https://en.wikipedia.org/wiki/Type-length-value –

相關問題