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

时间:2015-05-28 15:43:18

标签: android tcp wamp

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

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

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

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

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

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

5 个答案:

答案 0 :(得分:6)

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

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

另一方面,一旦连接了接口,就会为其分配loopback interface。我假设您的手机通过WiFi接口连接到该PC,因此在这种情况下,两个接口正在使用中。

  • wlan该PC界面
  • ifconfig手机界面。

enter image description here

两者都有自己独特的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编程,这里有两个链接: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的一个很好的解释。

答案 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" />