目前,我支持具有以下架构的客户端,用于工业制造流程:
他们在控制工业机器的PC上运行Windows程序。
他们有一个专有的应用程序(我为他们维护)在Android设备(基本上是一个手机)上运行,它通过TCP套接字与PC软件无线连接,因此它可以远程控制这些工业流程。 / p>
客户现在想要的是在PC上运行的Web服务器和内置于应用程序中的Web浏览器,以控制一些不受其Windows程序控制的其他进程。
我已经在PC上设置了一个WAMP服务器和一个示例网页,我可以在PC上的任何浏览器上看到" localhost"。我知道如何通过WebView类将Web浏览器视图添加到Android应用程序。
但是我不知道如何使手机上的浏览器通过TCP连接看到PC上的WAMP服务器。我如何将这两件事挂钩?
答案 0 :(得分:6)
您应该了解的一些基本信息
当该PC连接到您的手机时,必须使用基础network interface,例如WiFi或以太网。另请注意,localhost
谎称loopback
。需要注意的是,loopback
接口只能在设备本身访问(即其他设备无法与其他设备的wlan
通信)。
另一方面,一旦连接了接口,就会为其分配loopback interface。我假设您的手机通过WiFi接口连接到该PC,因此在这种情况下,两个接口正在使用中。
wlan
该PC界面ifconfig
手机界面。
两者都有自己独特的IP地址。如果您想从手机连接到该PC,您应该知道该PC的wlan接口的IP地址。
如果您的PC是基于Linux的,您可以写inet addr
并在wlan0
字段中查看该IP地址(在http://IP_ADDRESS:PORT_NUMBER
部分下)。对于Windows机器,请阅读IP address。
在Android WebView中
此View提供了一个名为this page的方法,用于从远程计算机获取HTML内容。您应传递给此方法的字符串格式如下:
192.168.0.1
其中
loadUrl
:远程计算机的IP地址。 (在您的情况下,您在上一步中找到的那个)IP_ADDRESS
:每台计算机都可以在不同的端口上侦听以实现不同目的(例如HTTP,FTP,SSH等)。 HTTP的默认端口是80。因此,如果我们假设该PC的IP地址为webView.loadUrl("http://192.168.0.1:80");
,那么您应该:
webView.loadUrl("http://192.168.0.1");
// Because 80 is the default port number for HTTP
或者
<accordion class="fda-accordion panel-group panel-group-square" close-others="oneAtATime">
<accordion-group is-open="fdaClass1Open" ng-show="fdaRecallsClass1Count">
<accordion-heading>
<div class="panel-heading-blue">
<i class="fa fa-plus fa-fw" ng-class="{'fa-minus': fdaClass1Open, 'fa-plus': !fdaClass1Open}" style="margin-right:10px"></i>
FDA Class 1 Recalls ({{fdaRecallsClass1Count}})
</div>
</accordion-heading>
{{fdaRecallsClass1Content}}
</accordion-group>
</accordion>
答案 1 :(得分:2)
那么,如何将webbrowser连接到服务器?在桌面Web浏览器上,您可以在Web浏览器的地址栏中键入主机名或IP地址。
类似的过程适用于嵌入式Web浏览器,您只需调用WebView实例的方法loadUrl
。
更重要的问题是您的网络服务器具有哪个网络名称并且前置http://
。如果服务器获得静态IP地址,您也可以使用它。但是,您必须确保WAMP不仅侦听localhost,否则无法从任何设备访问(但这不是Stackoverflow的问题)。
答案 2 :(得分:2)
您想要的(不只是WAMP服务器,而是XAMPP,LAMP)是一个静态IP地址,您可以随时连接。
你提到的另一件事是套接字。套接字提供非常基本的数据事务,您需要处理所有事情,HTTP是一种应用层协议,它是传输层的抽象。 Web浏览器(通常)使用HTTP。 Here是不同的。
对于Socket编程,这里有两个链接:link1和link2。
使用HTTP需要向服务器发送GET或POST响应,可能是由php或django从那里接收的。就代码而言。你走了。
获取GET请求
public String sendGetRequest() {
HttpClient client = new DefaultHttpClient();
URI website;
try {
website = new URI(url);
HttpGet request = new HttpGet();
request.setURI(website);
HttpResponse response = client.execute(request);
return response;
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
对于POST请求
public String sendPostRequest(ArrayList<NameValuePair> nameValuePairs) {
// Create a new HttpClient and Post Header
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
try {
// Add your data
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
// Execute HTTP Post Request
HttpResponse response = httpclient.execute(httppost);
if (response != null)
return response;
else
{
Log.e("Request", "response is null");
return null;
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
} catch (IOException e) {
// TODO Auto-generated catch block
}
return null;
}
解析响应以检查服务器的响应方式。应用程序的功能应该是简化用户不向他提供已存在的解决方案。我建议你不要使用webview(只显示正确组织的相关信息)。
编辑: 以下是HTTP vs TCP的一个很好的解释。
答案 3 :(得分:1)
基本上,对于Windows机器,您需要知道IP地址。这是网络上其他设备用来联系它的地址。如果您已经有一个打开的TCP / IP套接字,那么您已经知道了这个地址。
HTTP是基于TCP的协议。它就像你的HTTP套接字一样,默认监听端口80上的连接。从文档中,看起来Wamp的默认端口是端口80.
来自包含webview的连接活动(来自here):
private WebView webview;
public void onCreate(Bundle savedInstanceState) {
[initialize stuff as needed ...]
this.webview = (WebView)findViewById(R.id.webview);
WebSettings settings = this.webview.getSettings();
settings.setJavaScriptEnabled(true);
this.webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webview.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i(TAG, "Processing webview url click...");
view.loadUrl(url);
return true;
}
public void onPageFinished(WebView view, String url) {
Log.i(TAG, "Finished loading URL: " +url);
if (progressBar.isShowing()) {
progressBar.dismiss();
}
}
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
Log.e(TAG, "Error: " + description);
Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_SHORT).show();
alertDialog.setTitle("Error");
alertDialog.setMessage(description);
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
return;
}
});
alertDialog.show();
}
});
}
然后,每当您想要将URL加载或重新加载到Web视图中时:
this.webview.loadUrl("http://ipaddress/");
其中 ipaddress 是您使用TCP套接字连接的IP。如果由于某种原因,您的Windows机器没有在端口80上运行HTTP服务器(可以在Wamp中的Apache附带的httpd.conf中配置),您也可以在URL中指定端口(在此示例中为端口8080):
this.webview.loadUrl("http://ipaddress:8080/");
答案 4 :(得分:0)
当我构建我的WAMP服务器并从我的Android手机显示数据库时,我遇到了同样的问题。
问题是WampServer是一个localHost,与WAMP连接的独特方式是通过Wifi,因为使用相同的基础设施。
如果您想要连接基础架构,则应构建一个公共主机并重试。
如果您对清单文件有权限,请向我们展示logcat并进行审核。
<uses-permission android:name="android.permission.INTERNET" />