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

10

目前我为一家工业制造企业的客户提供支持,他们使用以下架构:

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

  2. 他们拥有一款专有应用程序(由我维护),运行于Android设备上(基本上是手机),通过TCP套接字与PC软件进行无线接口交互,以便远程控制这些工业过程。

现在客户想要在PC上运行一个Web服务器,并在应用程序中嵌入一个Web浏览器,以便控制一些未被其Windows程序控制的额外过程。

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

但我不知道如何使手机上的浏览器通过TCP连接看到PC上的WAMP服务器。 我该如何将这两个东西连接起来?


1
服务器应该有一个地址,它们应该在同一个网络上,并且服务器应该可以从该网络访问。 - njzk2
5个回答

6

你需要了解的一些基本信息

当电脑连接到你的手机时,必须使用一个底层的网络接口,例如WiFi或Ethernet。还要注意的是,localhost位于回环接口上。应该指出,loopback接口只能在设备本身中访问(即其他设备无法与另一设备的loopback通信)。

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

  • 那台电脑的wlan接口
  • 你的手机的wlan接口。

enter image description here

两者都有自己独特的IP地址。如果你想从手机连接到电脑,则应知道电脑的wlan接口的IP地址。

如果你的电脑基于Linux,你可以输入ifconfig并在inet addr字段中查看该IP地址(在wlan0部分下)。对于Windows机器,请参阅这个页面


在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
好的,如何将Web浏览器连接到服务器?在桌面Web浏览器中,您可以在地址栏中键入主机名或IP地址。
类似的过程也适用于嵌入式Web浏览器,您只需要调用WebView实例的loadUrl方法。
更重要的问题是,你的Web服务器有什么网络名称并在之前加上http://。如果服务器有静态IP地址,你也可以使用它。但是,你必须确保WAMP不仅仅侦听localhost,否则它无法从任何设备访问(但这不是Stackoverflow的问题)。

2
你想要的(不仅仅是针对WAMP服务器,还包括XAMPP、LAMP)是一个静态IP地址,可以随时连接。

你提到的另一件事是套接字。套接字提供非常基本的数据传输,你需要处理所有的东西。HTTP是一个应用层协议,是对传输层的抽象。Web浏览器(通常)使用HTTP。这里是区别之处。

关于Socket编程,以下是两个链接:链接1链接2

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

1
基本上,对于 Windows 机器,您需要知道 IP 地址。 这是网络上其他设备用来联系它的地址。 如果您已经有一个开放的 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();
            }
        });
}

然后,每当您想要将URL加载或重新加载到Web视图中时:

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

其中ipaddress是您使用TCP套接字连接的IP地址。如果由于某些原因,您的Windows机器不在端口80上运行HTTP服务器(在Wamp内置的httpd.conf中可配置),您也可以在URL中指定端口(在此示例中为8080):

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

0

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

问题在于WampServer是一个本地主机,连接WAMP的唯一方式是通过Wifi,因为它使用相同的基础设施。

如果您想在基础设施之外进行连接,则应构建公共托管并重试。

请向我们展示logcat,并审查您是否具有清单文件中的权限。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接