通过套接字查看Web服务器。 。 。

目前我支持以下架构的客户,用于工业制造过程:

  1. 他们有一个运行在控制工业机器的PC上的Windows程序。

  2. 他们有一个运行在Android设备(基本上是一个电话)上的专有应用程序(我为其维护),它通过TCP套接字与PC软件无线连接,因此可以远程控制这些工业过程。

客户现在想要的是在PC上运行的Web服务器,以及内置在应用程序中的Web浏览器,以控制一些不受Windows程序控制的附加进程。

我在PC上设置了一个WAMP服务器,并在PC上的任何浏览器上都可以看到一个示例网页,名为“localhost”。 我知道如何通过WebView类添加一个Web浏览器视图到Android应用程序。

但我不知道如何使手机上的浏览器通过TCP连接看到PC上的WAMP服务器。 我怎么把这两件事情挂钩?

    一些你应该知道的基本信息

    当PC连接到手机时,必须使用底层networking接口 ,例如WiFi或以太网。 另外请注意, localhost在回送接口上是撒谎的。 应该注意的是, loopback接口只能在设备本身访问(即其他设备不能与其他设备的loopback通信)。

    另一方面,一旦接口连接,将被分配一个IP地址 。 我假设你的手机通过WiFi接口连接到那台电脑,所以在这种情况下有两个接口正在使用。

    • 那个PC的wlan接口
    • 你的手机的wlan接口。

    在这里输入图像说明

    并且都有其唯一的IP地址。 如果你想从你的手机连接到PC,你应该知道该PC的wlan接口的IP地址。

    如果您的PC是基于Linux的,您可以编写ifconfig并在inet addr字段(在wlan0部分下)中查看该IP地址。 对于Windows机器阅读这个页面 。


    在Android WebView中

    该视图提供了一种称为loadUrl的方法,用于从远程机器获取HTML内容。 你应该传递给这个方法的string如下所示:

     http://IP_ADDRESS:PORT_NUMBER 

    哪里

    • IP_ADDRESS :远程机器的IP地址。 (在你的情况下,你已经在上一步find一个)
    • PORT_NUMBER :每台机器都可以监听不同的端口(例如HTTP,FTP,SSH,…)。 HTTP的默认端口是80。

    因此,如果我们假设该PC的IP地址是192.168.0.1 ,那么你应该有:

     webView.loadUrl("http://192.168.0.1:80"); 

    要么

     webView.loadUrl("http://192.168.0.1"); // Because 80 is the default port number for HTTP 

    那么,你如何连接一个浏览器到服务器? 在桌面浏览器上,您可以在网页浏览器的地址栏中input主机名或IP地址。

    一个类似的过程适用于embedded式浏览器,您只需调用WebView实例的loadUrl方法loadUrl

    更重要的问题你的networking服务器有什么networking名称,并预先安装http:// 。 如果服务器获得一个静态IP地址,你也可以使用它。 但是,你必须确保WAMP不仅在本地主机上进行监听,否则不能从任何设备访问(但这不是Stackoverflow的问题)。

    你想要什么(不只是为WAMP服务器,而是为XAMPP,LAMP)是一个静态IP地址,你可以在任何时间连接到。

    你提到的另一件事是套接字。 套接字提供了非常基本的数据事务,并且您需要处理所有事情,HTTP是一个应用层协议,是对传输层的抽象。 networking浏览器(普遍)使用HTTP。 这是区别。

    对于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; } 

    parsing响应以检查服务器如何响应。 应用程序的function应该是缓解用户不提供他已经存在的解决scheme。 我build议你不要使用webview(只显示相关信息组织正确)。

    编辑:这是一个很好的解释HTTP与TCP 。

    本质上,对于Windows机器,您需要知道IP地址。 这是networking上其他设备用来联系的地址。 如果你已经有一个开放的TCP / IP套接字,那么你已经知道这个地址。

    HTTP是基于TCP的协议。 它的工作方式就像HTTP套接字一样,默认侦听端口80上的连接。从文档看,Wamp的默认端口看起来好像是80端口。

    从包含webview的连接活动(从这里 ):

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

    然后,每当你想要加载或重新加载到networking视图的URL:

     this.webview.loadUrl("http://ipaddress/"); 

    ipaddress是您使用TCP套接字连接的IP。 如果由于某种原因,Windows机器不能在端口80上运行HTTP服务器(可在Apache WPS内附带的httpd.conf中configuration),也可以在URL中指定端口(本例中为端口8080):

     this.webview.loadUrl("http://ipaddress:8080/"); 

    当我构build我的WAMP服务器并从我的Android手机显示数据库时,我遇到了同样的问题。

    问题是WampServer是本地主机,与WAMP连接的独特方式是通过Wifi,因为使用相同的基础设施。

    如果你想连接你的基础设施,你应该build立一个公共的主机,然后再试一次。

    请告诉我们logcat,并检查您的清单文件是否有权限。

     <uses-permission android:name="android.permission.INTERNET" />