0

下面是我的 php 代码,它工作正常:

<?php

//This script checks the id and code of the already registered user from the database. If correct it returns the other details otherwise the respective error

//starting session
session_start();

//catching data from client
$id=$_POST['id'];
$code=$_POST['code'];

if($id&&$code)//checking if the data is not empty
{
    //Connecting to server
    ($connect=mysqli_connect('localhost','root','','ohhell')) or exit("Connection Failed");

    //Selecting user for given id
    $result=mysqli_query($connect,"SELECT * FROM users WHERE id='$id'");

    //Counting number of rows
    $numrows=mysqli_num_rows($result);

    if($numrows!=0)
    {
        //Creating associative array
        $row=mysqli_fetch_assoc($result);

        //freeing result set
        mysqli_free_result($result);

        //fetching code from database
        $db_code=$row['code'];
        $code=md5($code);

        //checking if the codes match
        if($code==$db_code)
        {
            //change status
            mysqli_query($connect,"UPDATE users SET status='yellow' WHERE id='$id'");

            $_SESSION['id']=$row['id'];
            $_SESSION['name']=$row['name'];
            $_SESSION['location']=$row['location'];

            $name=$row['name'];
            $location=$row['location'];

            //closing connection
            mysqli_close($connect);

            //returning values to client
            exit("$name\n$location");//Successful Login. Client can now create an object and switch the screen
        }
        else
        {
            exit("Invalid Player Code");//Unsuccessful Login
        }
    }
    else
        exit("Invalid Player ID");//Unsuccessful Login
}
else
    exit("Incomplete Details");//Unsuccessful Login     

?>

它将相应的错误消息或播放器的相应详细信息返回给 c# 客户端。下面是接收数据的客户端代码:

WebRequest request = WebRequest.Create(URL);
Stream dataStream;
WebResponse response;
StreamReader reader;

response = request.GetResponse();
dataStream = response.GetResponseStream();
reader = new StreamReader(dataStream);
responseFromServer = reader.ReadToEnd();
reader.Close();
dataStream.Close();
response.Close();

成功接收数据后,c#客户端在“\n”的帮助下将两个数据分开,然后制作一个类的对象并将接收到的数据填充到该类的各个数据成员中。

现在问题来了,因为我正在测试现在一切正常。但是,我的问题是,由于正在读取的数据将以字符串的形式出现,我如何确保在客户端实际成功接收到数据,并且检索到的字符串实际上包含数据而不是错误信息。

我的意思是假设如果在连接到 php 时发生内部错误或任何其他网络错误返回相应的错误,该错误也将以字符串的形式出现,现在我将如何区分客户端应用程序是否应该开始将数据与创建对象的字符串,否则它应该以错误终止。对于我在 php 中包含的错误,我可以在 c# 客户端中使用相应的 if() 条件,但这不是正确的方法,因为不能保证错误仅限于 php 脚本中考虑的错误。可能会返回大量错误,因此在这种情况下应该采取什么方法来实际区分错误和真实数据。

一种可能的方法是在发送数据之前在数据前面加上一个信号“1”,并在客户端测试信号是否接收到的字符串以“1”开头。如果是,则进行分离,否则显示相应的错误消息。但是这种方法也不是最优的,因为如果错误本身以 1 开头,它将失败。

那么实际上应该怎么做才能通过 php 脚本以最佳方式向 c# 发送数据呢?

抱歉描述太长了!等待帮助!!!

感谢一百万万亿... :)

4

3 回答 3

2

您可以使用HTTP 状态代码来确定天气或是否发生错误。如果在运行所述 php 脚本(即使用http_response_code)期间发生错误,您的 php 可以设置相应的 HTTP 标头。如果 Startus 代码没问题,您可以解析响应(如评论中所述,使用json)并检索结果。如果网络通信发生错误,您自己在客户端产生相应的错误。如果在 PHP 中发生错误,您还可以通过解析响应来检索错误,从而检索错误消息。

PHP中的简单示例

$response = array();
$responseCode = null;
try {
  // some code is executed
  $responseCode = 200;
}
catch (Exception $e) {
  // an error occured and we have to add it to our response
  $response['error'] = array('errorcode' => $e->getCode(), 'error' => $e->getMessage());
  $responseCode = 500;
}

http_response_code($responseCode);
echo(json_encode($response ));

现在在您的 c# 中,只需检查标题。如果是 500(表示发生错误),则 json_decode 结果并获取错误。如果是 200(表示 OK),则 json_encode 结果。如果是其他情况,请根据链接 HTTP 错误代码列表进行响应。

于 2014-03-12T09:18:05.330 回答
2

您可以使用http 状态代码来指示错误情况。目前您似乎只使用200 OK(默认情况下),但例如Invalid Player Code可能导致401 Unauthorizedor 403 Forbidden(如果这意味着某种授权)。

在 c# 方面,您将通过HttpWebResponse.StatusCode 属性获得该状态代码

于 2014-03-12T09:18:44.873 回答
1

我参考了 Vikas Prasad 的评论问题:“@ReeCube 我可以满足我对尝试 JSON 或 XML 的程序的所有要求吗?如果可以,你能指点我具体的教程吗?我不知道这两个。还有哪一个两者之间更喜欢?”

JSON 或 XML只是您传输数据的方式以及之后如何读取它们,您需要 php 和 c# 才能使用 JSON 或 XML。我更喜欢 JSON,但我不确定它在 C# 上的效果如何,我从未测试过它。

在这里您可以找到适用于 C# 的 JSON API。

但首先你应该为你的 PHP 服务器添加 JSON。在 PHP 上,JSON 非常好用,有一个json_encodejson_decode函数。在您的情况下,您只需要json_encode函数,因为在服务器端,您只想为客户端生成 JSON。Google 和 PHP 文档非常支持如何使用json_encode,但是如果您有任何问题,请在评论中提问。

这是一个小例子:

<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);

echo json_encode($arr);
?>
于 2014-03-12T09:30:23.740 回答