【问题标题】:PHP - C# TCP Client / Server How to send Strings ?PHP - C# TCP 客户端/服务器如何发送字符串?
【发布时间】:2015-12-01 16:00:25
【问题描述】:

嘿,我这里有一个 C# Tcp 服务器和一个 PHP 客户端,两者都在工作。

服务器

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);
            }



        }



    }
}

客户

    <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);

?>

我现在的问题是我现在如何调用我的 ping .. 然后在后面发送 1 个或多个字符串并在我的服务器中捕获它们以控制它们或其他什么? ...

我之前已经在 VB 中做过这个,所以我知道我有可能用 Streamreader 和 Write 做过,但我想这在这里不起作用? 代码示例会很有帮助

感谢您的每一个回答:)

【问题讨论】:

    标签: c# php vb.net tcp


    【解决方案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>";
    ...
    

    【讨论】:

    • 你应该真正使用标签长度值格式的混乱,它会让你的生活变得简单。 en.wikipedia.org/wiki/Type-length-value
    • 也许吧。取决于使用情况。他只是想发送字符串,我认为这种方式更简单。特别是据我所知,.NET 没有内置的解析器。
    • @Ahmad 感谢您提供详细的答复! :) 但是当我现在发送 $String1 并且我需要在其他站点将其作为字符串 String1 时,我现在怎么能得到呢?那么我怎样才能把它放回变量中呢?
    • @Hanselman parameters 是从客户端发送的参数数组。例如,如果您发送了数组$stringsToSend = array($email, $sth);,那么您将在服务器上的parameters 中拥有该数组,您可以使用它的值,例如string Email = parameters[0], Sth = parameters[1]
    • @Hanselman PHP 运行在 Web 服务器上,Web 服务器的职责就是监听! PHP 总是在听。您只需要在 HTTP 中请求它。 .NET为此提供了一些类。看看这个stackoverflow.com/questions/4015324/http-request-with-post
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2016-06-12
    • 1970-01-01
    • 2018-03-02
    相关资源
    最近更新 更多