[答案]
我的原始帖子的答案被标记(Kimmax的第一篇文章)
事实证明,我应该最初提到这是在Android模拟器中运行(现在)。我发现通过模拟器连接到本地主机的IP是“10.0.2.2
”。拥有端口号似乎并不重要。尽可能运行与裸机相同的代码返回页面文本。这意味着它在Android中引发了这个问题。希望这篇文章能为其他人节省一些时间。
[原文]
我是网络/套接字编程的新手,所以我不知道任何特定的常见做法。
我正在尝试向php页面发送一个相当短的字符串(最多32个字符)(我控制)。那个php页面将根据需要处理该字符串并将响应字符串发送回发送者。这是客户端和服务器之间所需的连接(按时间)的范围。我在网上搜索一个简单的答案,但似乎找不到任何我希望有人在这里可以提供帮助。
例如:假设初始请求字符串是名称(“Bob”)。服务器上的php页面接收该页面,并通过处理数字输出正确的返回字符串/值(例如,年龄“31”)。然后,该字符串/值被发送到原始请求者并由其接收,以根据需要进行处理。
我只是寻找最简短和最基本的答案。现在服务器是一个wamp本地主机,我在一个子目录(localhost / subdir / 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
。
来自 access.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
文件中似乎没有任何内容正在转储
必须有一些我忽略的细节...
答案 0 :(得分:2)
如果您只是想从网站收到回复,我建议您使用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;
}
}
请阅读this以了解正在发生的事情,这是非常基本的。