将字符串从c#发送到php页面&;接收响应

本文关键字:amp 响应 页面 php 字符串 | 更新日期: 2023-09-27 18:10:47

[答案]
我原来的帖子的答案是有标记的(Kimmax的第一个帖子(
事实证明,我一开始应该提到这是(目前(在Android模拟器之外运行的。我发现通过模拟器连接到本地主机的IP是"10.0.2.2"。拥有端口号似乎并不重要。尽可能地运行相同的代码,返回页面文本。这意味着是安卓系统中的某些东西导致了这个问题。希望这篇文章能为其他人节省一些时间。

[原件]
我是web/socket编程的新手,所以我不知道任何特定于它的常见做法。我正在尝试向php页面(我控制(发送一个相当短的字符串(最多32个字符(。然后,php页面将根据需要处理该字符串,并将响应字符串发送回发送方。这是客户端和服务器之间所需的连接范围(按时间(。我在网上搜索了一个简单的答案,但似乎找不到任何答案。我希望这里有人能帮忙。

例如:假设初始请求字符串是一个名称("Bob"(。服务器上的php页面接收到它,并通过处理计算出正确的返回字符串/值(比如年龄"31"(。然后,这个字符串/值被发送给原始请求者并由原始请求者接收,以便根据需要进行处理。

我只是在寻找最简短、最基本的答案。现在,服务器是一个wamplocalhost,我正在子目录(localhost/subdr/test.php(中测试php页面

[编辑]
使用Kimmax示例后的代码示例:
C#

public String DownloadFrom(String url)
{
    string str = "";  // For debugging only
    try
    {
        using(WebClient client = new WebClient())
        {
            str = client.DownloadString(new Uri(url));
            return str; 
        }
        catch(WebException e) {
            Log.Error ("Error while receiving data from server:", e.Message);
            return null;
        }
    }
}

传递给该函数的值为"http://localhost/php/test.php?name=Bob">

test.php:

<?php
include 'logging.php';
if(isset($_GET['name']) && !empty($_GET['name']))
{
    $data = $_GET['name'];
    logg("test.php: name received: " . $data);
    $download = "Test string.";
    logg("test.php: setting data for download: " . $download);
    print $download;
}
?>

logging.php文件提供了logg函数,它只是将给定的字符串附加到其他文件中。当您在浏览器中输入地址时,test.php页面将输出$download,但给定的C#代码不会返回任何内容。即使是日志文件也不会通过C#代码写入。经过一些调试,我注意到抛出了WebException。异常消息为"Error: ConnectFailure (Connection refused)"。

完全异常堆栈跟踪

e   {System.Net.WebException: Error: ConnectFailure (Connection refused) ---> System.Net.Sockets.SocketException: Connection refused
  at System.Net.Sockets.Socket.Connect (System.Net.EndPoint remoteEP) [0x00000] in <filename unknown>:0 
  at System.Net.WebConnection.Connect (System.Net.HttpWebRequest request) [0x00000] in <filename unknown>:0 
  --- End of inner exception stack trace ---
  at System.Net.HttpWebRequest.EndGetResponse (IAsyncResult asyncResult) [0x00000] in <filename unknown>:0 
  at System.Net.HttpWebRequest.GetResponse () [0x00000] in <filename unknown>:0 
  at System.Net.WebClient.GetWebResponse (System.Net.WebRequest request) [0x00000] in <filename unknown>:0 
  at System.Net.WebClient.ReadAll (System.Net.WebRequest request, System.Object userToken) [0x00000] in <filename unknown>:0 
  at System.Net.WebClient.DownloadDataCore (System.Uri address, System.Object userToken) [0x00000] in <filename unknown>:0 }    System.Net.WebException

我能够在telnet localhost 80 GET期间得到返回的文本,所以看起来连接应该是可行的。我是不是在某个地方缺少一些权限?

[编辑]
在完全禁用防火墙并在路由器上设置端口转发后,一切都没有改变——目前我不排除任何可能性。我还尝试使用本地IP地址(127.0.0.1(而不是localhost访问.log的代码段

...
192.168.1.1 - - [01/Jul/2014:11:48:18 -0500] "GET /HNAP1/ HTTP/1.1" 404 292
192.168.1.1 - - [01/Jul/2014:11:48:18 -0500] "POST /JNAP/ HTTP/1.1" 404 291
192.168.1.1 - - [01/Jul/2014:11:48:18 -0500] "GET / HTTP/1.1" 200 4821
127.0.0.1 - - [01/Jul/2014:11:50:06 -0500] "GET /php/test.php?s=Bob HTTP/1.1" 200 16
127.0.0.1 - - [01/Jul/2014:11:50:11 -0500] "GET /php/test.php?s=Foo HTTP/1.1" 200 16
127.0.0.1 - - [01/Jul/2014:11:50:15 -0500] "GET /php/test.php?s=Bar HTTP/1.1" 200 16

最后三行是我在浏览器(Chrome(中输入的链接。我相信前三个来自C#代码——奇怪的是,我认为它们是在我停止调试之后编写的。

apache_error.log文件中似乎没有为这些连接尝试转储任何内容
我一定忽略了一些微小的细节。。。

将字符串从c#发送到php页面&;接收响应

如果您只想从网站接收响应,我建议使用WebClient类及其.DowloadString()方法。

示例

whatsmyname.php

<?php
    $name = $_GET['name'];
    echo "Your name is $name."
?>

whatsmyname.cs

private void btnSayMyName_Click(object sender, EventArgs e)
{
    string response = SendRequest("http://localhost/whatsmyname.php?name=" + txtMyName.Text);
    if(response != null)
    {
        MessageBox.Show(response, "Hey there!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}
private string SendRequest(string url)
{
    try
    {
        using (WebClient client = new WebClient())
        {
            return client.DownloadString(new Uri(url));
        }
    }
    catch(WebException ex)
    {
        MessageBox.Show("Error while receiving data from the server:'n" + ex.Message, "Something broke.. :(", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
        return null;
    }
}

请阅读这篇文章来了解发生了什么,这是非常基本的。