【问题标题】:seeing a web server over a socket . . .通过套接字查看 Web 服务器。 . .
【发布时间】:2015-05-28 15:43:18
【问题描述】:

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

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

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

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

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

但我不知道如何让手机上的浏览器通过 TCP 连接看到 PC 上的 WAMP 服务器。我如何将这两件事联系起来?

【问题讨论】:

  • 服务器应该有一个地址,它们应该在同一个网络上,并且服务器应该可以从那个网络访问

标签: android tcp wamp


【解决方案1】:

您应该了解的一些基本信息

当该 PC 连接到您的手机时,必须使用底层 network interface,例如 WiFi 或以太网。还要注意localhost 是在loopback interface 上的。需要注意的是,loopback接口只能在设备本身访问(即其他设备无法与其他设备的loopback通信)。

另一方面,一旦连接了接口,它就会被分配一个IP address。我假设你的手机是通过 WiFi 接口连接到那台电脑的,所以在这种情况下,两个接口都在使用中。

  • wlan该PC的接口
  • wlan手机界面。

两者都有其唯一的 IP 地址。如果你想从你的手机连接到那台电脑,你应该知道那台电脑的 wlan 接口的 IP 地址。

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


在 Android WebView 中

此视图提供了一个名为loadUrl 的方法,用于从远程机器获取 HTML 内容。您应该传递给此方法的字符串格式如下:

http://IP_ADDRESS:PORT_NUMBER

在哪里

  • IP_ADDRESS :远程机器的 IP 地址。 (在您的情况下,您在上一步中找到了)
  • 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

【讨论】:

    【解决方案2】:

    那么,如何将网络浏览器连接到服务器?在桌面网络浏览器上,您在网络浏览器的地址栏中键入主机名或 IP 地址。

    类似的过程适用于嵌入式网络浏览器,您只需调用 WebView 实例的方法loadUrl

    更重要的问题是您的网络服务器有什么网络名称并在前面加上http://。如果服务器获得静态 IP 地址,您也可以使用它。但是,您必须确保 WAMP 不仅在 localhost 上侦听,否则无法从任何设备访问它(但这不是 Stackoverflow 的问题)。

    【讨论】:

      【解决方案3】:

      您想要的是一个静态 IP 地址(不仅适用于 WAMP 服务器,还适用于 XAMPP、LAMP),您可以随时连接到该地址。

      您提到的另一件事是套接字。套接字提供了非常基本的数据事务,您需要处理所有事情,HTTP 是一种应用层协议,它是传输层的抽象。 Web 浏览器(通常)使用 HTTP。 Here 是不同的。

      对于 Socket 编程,这里有两个链接:link1link2

      使用 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的一个很好的解释。

      【讨论】:

        【解决方案4】:

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

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

        来自包含 web 视图的连接活动(来自 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/");
        

        【讨论】:

          【解决方案5】:

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

          问题在于 WampServer 是本地主机,而与 WAMP 连接的唯一方式是通过 Wifi,因为使用相同的基础架构。

          如果您想连接到您的基础架构之外,您应该构建一个公共主机并重试。

          如果您对清单文件有权限,请向我们展示 logcat 并查看。

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

          【讨论】:

            猜你喜欢
            • 2015-02-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多