2015-09-05 145 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 –

相关问题