精华内容
下载资源
问答
  • 如何创建一个局域网

    千次阅读 2011-03-13 22:43:00
    如果你在家庭里建设小型的局域网,只需网线、路由器或者集线器或交换机即可。将网线连好后,做相应的设置就可以组建成局域网了。 推荐用路由器,较方便。 <br />对于Windows xp ,典型的路由器共享...
    如果你在家庭里建设小型的局域网,只需网线、路由器或者集线器或交换机即可。将网线连好后,做相应的设置就可以组建成局域网了。
    推荐用路由器,较方便。

    对于Windows xp ,典型的路由器共享上网

    以下方法是我试过,可以将已经集线器或者路由器还有双网卡等机器连成局域网,在网上邻居上,经共享可互相看到对方的共享文件,方法如下:
    1、添加协议
    打开“控制面板”,进入“网络连接”本地连接上右键打开其属性,在“常规”选项卡上单击安装,然后添加协议选“NWLink IPX/SPX/
    NetBIOS Compatible Transport Protocol”确定即可完成协议的添加。
    2、设置家庭或小型办公网络
    打开文件菜单,然后点击弹出菜单的网络安装向导,在弹出的窗口中一直选下一步,直到“选择连接方法”的选项中,选中“其他”,然后下
    一步,接下来在“其他Internet连接方法”中,选“这台计算机属于一个没有Internet连接的网络”,然后下一步,接着会到计算机描述及计算
    机名的设置(随便自己设置),下一步后会到工作组名的设置,在局域网的机器都设置同一个工作组,下一步选”启用文件和打印机共享“,
    接着一直下一步,选”完成该向导,我不需要在其他计算机上运行该向导“然后下一步完成即可。
    3、设置ip地址(如果用路由器,可自动分配就行)
    4、在另一台电脑上也进行相同的设置(注意ip地址不能两台机器相同,最后一个地址不一样)
    这样就可在网上邻居中可以打开工作组就可以看到对方了。

    Ref: http://zhidao.baidu.com/question/28435056.html

    对于windows 7 ,有些许不同,Windows 7中並沒有预载NWlink IPX/SPX/NetBIOS相关协议,下列的方法可以直接在Windows 7中新增
    IPX/SPX相关协议。

    x86

    請您從Windows XP x86中,複製下列路徑的檔案到對等的路徑中:

    Windows/inf/netnwlnk.pnf
    Windows/inf/netnwlnk.inf
    Windows/System32/rtipxmib.dll
    Windows/System32/nwprovau.dll
    Windows/System32/wshisn.dll
    Windows/System32/drivers/nwlnkflt.sys
    Windows/System32/drivers/nwlnkfwd.sys
    Windows/System32/drivers/nwlnkipx.sys
    Windows/System32/drivers/nwlnknb.sys
    Windows/System32/drivers/nwlnkspx.sys

     

    1

    2

    3

    4

    5

     

    x64

    若您是64位元的作業系統,則必須由x64的XP取得下列檔案:

    Windows/nwlnkipx.sys
    Windows/nwlnknb.sys
    Windows/nwlnkspx.sys
    Windows/inf/netnwlnk.inf
    Windows/inf/netnwlnk.PNF
    Windows/system32/nwprovau.dll
    Windows/system32/wshisn.dll
    Windows/system32/drivers/nwlnkipx.sys
    Windows/system32/drivers/nwlnknb.sys
    Windows/system32/drivers/nwlnkspx.sys

     

    接下來開啟網路連線的設定視窗,點下新增協定即可看到有NWLink IPX/SPX/NetBIOS 相容協定了!

    6

     

    接下來即可在區域連線中看到已完成新增。

     7


    Ref: http://www.dotblogs.com.tw/dotjason/archive/2010/08/18/17278.aspx
    展开全文
  • 在公司开会的时候,想分享同一份资料;在玩游戏的时候,想大家一起玩,都可以用局域网来完成。创建局域网可能会很麻烦,但是如果创建临时局域网却十分简单。本次小编就为大家演示办法
  • 小型局域网创建

    2016-01-09 18:57:45
    局域网创建
  • Anroid搭建一个局域网Web服务器

    万次阅读 多人点赞 2016-06-14 00:31:19
    这几天有人问我局域网Client和Client通信的时候有时候用什么技术比较好,其实我想到的是Socket和Http,我们知道Http是基于Socket的,所以它是一个非常成熟的Socket,所以我选择了用Http来实现,今天的博客内容也是...

    Anroid搭建一个局域网Web服务器

    版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003

    本文中讲的AndServer已经全新升级,升级后可以直接部署动态网站、静态网站、像Servlet一样写Http接口,请读者移步到我另一篇博客:Android也可以做web开发了


    前言

      很多开发者看到这个标题表示很怪异,Android怎么可能搭建服务器呢?根本用不到呀,这个项目毫无价值。我表示很理解这一类的开发者,毕竟每个人的经验经历都是有限的。

      必须要说说我们的用处(需要用这个功能的人自然不用解释),比如在TV开发中,现在我们有一个电视盒子,上面跑着我们的一个apk,假如我们现在用微信网页或者QQ网络连接了我们的apk软件,我们需要把一个视频传到电视上播放,这个时候是不是需要我们的apk作为服务端来接受文件了?这只是一个例子,可能还有局限性,更多的用处大家自己去发挥噢。

      在写博客之前我已经做了一个Android Http Server的开源项目,我把它取名叫AndServerAndServer源代码托管在Github:https://github.com/yanzhenjie/AndServerAndServerAndroid Http Server的简写,顾名思义AndServer是Android端Http服务器的一个项目。

      目的在于在Android可以很方便的搭建Http服务器,这几天有人问我局域网Client和Client通信的时候有时候用什么技术比较好,其实我想到的是Socket和Http,我们知道Http是基于Socket的,所以它是一个非常成熟的Socket,所以我选择了用Http来实现,今天的博客内容也是主要讲Android端如何搭建一个Http服务器。

    AndServer如何引用

      如果不想研究原理,只是想快速解决项目中的问题的同学,直接依赖AndServer,具体用法往下看,或者从Github上下载AndServer的Demo。这里给出AndroidStudio和Eclipse的使用方式:

    • Eclipse使用Jar包,如果需要依赖源码,请自行下载。

      下载Jar包

    • AndroidStudio使用Gradle构建添加依赖(推荐)

    compile 'com.yanzhenjie:andserver:1.0.1'

    Android端用什么技术实现Http服务器

      ApacheHttpCore是一个优秀的Http底层框架,支持构建服务器,支持构建客户端,所以我们第一个版本选择了Apache的HttpCore,因为Android弃用了ApacheHttpClient相关API,代码中会有弃用的警告,不过这一点大家不要担心,下面会给出解决方案。

    Android弃用了HttpClient后怎么继续使用HttpClient

      Android6.0之后SDK中删除HttpClient相关的API,我看了Google的官方文档后提示我们,如果还想继续使用HttpClient的话:

    方案一:AndroidStuid主module的gradle中配置:

    android {
        useLibrary ‘org.apache.http.legacy‘
    }

      如果提示编译不过的话,需要在android-sdk-windows\platforms\android-23\optional下检查有没有以下两个文件:

    optional.json
    org.apache.http.legacy.jar

    如果你的SDK下没有org.apache.http.legacy.jar的话到这里下载

    方案二:如果你使用的是Eclipse

      拷贝android-sdk-windows\platforms\android-23\optional下的org.apache.http.legacy.jar到你项目的libs下就完结。

    方案三:下载Apache的jar包(不推荐)

      从Apache官网下载HttpClientHttpCore的jar包导入到项目。地址是:http://hc.apache.org/downloads.cgi
      但是我推荐方案一和方案二,因为AndroidSDK中删除了HttpClient的api,但是手机系统里面还是有HttpClient的api的。方案一和二的原理最终都是引用SDK下android-sdk-windows\platforms\android-23\optional下的org.apache.http.legacy.jar这个jar包到项目中,是Google处理过的jar,添加了AndroidHttpClient等适合Android使用的api,体积相对从Apache官网下载的jar小的多。

    如何使用AndServer

      这里先给大家看下AndServer怎么用,下一步详解如何一步步用HttpCore实现一个简易的HttpServer

    (一)实现AndServerRequestHandler接口,相当Servlet

      我们每写一个服务端接口,就要一个对应的类来处理,这里要实现AndServerRequestHandler接口,相当于Java继承Servet一样,我们只需要处理Request,在Response中给出响应即可:

    public class AndServerTestHandler implements AndServerRequestHandler {
        @Override
        public void handle(HttpRequest rq, HttpResponse rp, HttpContext ct) throws HttpException, IOException {
            response.setEntity(new StringEntity("请求成功。", "utf-8"));
        }
    }

    (二)在AndServer上注册接口名称,并启动服务器

      在启动AndServer的时候最好放在Service中,这里给出启动的关键代码。指定服务器的端口号,并注册接口,再启动服务器:

    AndServerBuild andServerBuild = AndServerBuild.create();
    andServerBuild.setPort(4477);// 指定http端口号。
    
    // 注册接口。
    andServerBuild.add("test", new AndServerTestHandler());
    // 这里还可以注册很多接口。
    
    // 构建AndServer并启动服务器。
    AndServer andServer = andServerBuild.build();
    andServer.launch();

      到这里就完成了一个Android WebServer的搭建,我们已经可以通过浏览器或者NoHttp来访问我们的WebServer了。

    (三)其他设备如何访问

      如果是浏览器方法,和我们普通访问网站没有区别,比如访问我们上面的接口:

    Android本机访问的地址:http://locahost:4477/test
    局域网其他设备访问地址:http://192.168.1.116:4477/test

      如果是其它Android系统的设备,推荐使用NoHttp来访问,NoHttp是我的另一个Http客户端的项目,和AndWeb正好是相对的,一个做服务端,一个做客户端。
      到这里怎么用AndServer和Android搭建服务端的教程就完了,如果想自己尝试利用HttpCore搭建一个Http服务端的话,请往下看。

    AndroidCore实现一个简易的Http服务器

      其实里边的东西比较复杂个人感觉如果你不想自己写一个这样的框架的,没有太大必要看完,但是我推荐大家往下看噢,我相信你会有收获的。这里讲解下关键的代码,一共有六步:

    (一)ServerSocket构建服务端连接

      我们知道Http是基于Socket的,那么服务端肯定是ServerSocket了,所以我们这里也是需要一个ServerSocket来接受客户端请求的:

    ServerSocket mServerSocket = new ServerSocket();
    mServerSocket.setReuseAddress(true);
    mServerSocket.bind(new InetSocketAddress(mPort));// 绑定端口

    (二)HttpProcessor增加Http协议处理器

      这个就是添加Http协议拦截器,都是Http基本信息。

    // HTTP协议拦截器。
    BasicHttpProcessor httpProcessor = new BasicHttpProcessor();
    httpProcessor.addInterceptor(new ResponseDate());
    httpProcessor.addInterceptor(new ResponseServer());
    httpProcessor.addInterceptor(new ResponseContent());
    httpProcessor.addInterceptor(new ResponseConnControl());

    (三)HttpParams初始化Http基本信息

      初始化Http连接的信息,比如超时时间,缓存区大小,是否使用GZIP等。

    // HTTP Attribute.
    HttpParams httpParams = new BasicHttpParams();
    httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 5000)
      .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
      .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
      .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
      .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "WebServer/1.1");

    (四)HttpRequestHandlerRegistry增加接口名称

      这里要用HttpRequestHandlerRegistry把我们的RequestHandler注册进来,这一步也是最重要的,就是我们的接口名称,相当于是注册Servlet到web.xml中一样。
      我举个栗子
      举个例子,假设访问严振杰的主页http://www.yanzhenjie.com,我的主页下假设有一个login的接口,那我们的地址是:http://www.yanzhenjie.com/login,我们的Android Web Server也要实现这样一个可以访问的地址,就要注册一个login的接口,所以这里是增加接口名称:

    // 注册Http接口。
    HttpRequestHandlerRegistry handlerRegistry = new HttpRequestHandlerRegistry();
    handlerRegistry.register("/login", new RequestLoginHandle());// 增加登录接口
    handlerRegistry.register("/download", new RequestTestHandle());// 增加下载接口

      这里可以注册很多个接口,我们后面的接口对象是实现了HttpCoreHttpRequestHandler接口的自定义类,比如我们上面的RequestLoginHandle的实现是:

    public class RequestLoginHandle implements HttpRequestHandler {
    
        @Override
        public void handle(HttpRequest rq, HttpResponse rp, HttpContext c) {
            // 只要在这里处理HttpRequest,如果要发出响应数据,用HttpResponse
        }
    }

    (五)HttpService创建Http服务

      前面准备的几步都是为这一步准备参数的,把我们前面准备好的httpProcessorhttpParamshandlerRegistry都传到HttpService,为下一步的Connection做好准备。

    // 创建HTTP服务。
    HttpService httpService = new HttpService(httpProcessor, new ConnectionReuseStrategy(), new HttpResponseFactory());
    httpService.setParams(httpParams);
    httpService.setHandlerResolver(handlerRegistry);

    (六)Socket、DefaultHttpServerConnection处理客户端请求

      上面的工作都做完了,就用到我们最开始准备好的ServerSocket来接受客户端的连接的socket了,接受到一个客户端的连接后,把刚才的httpParams和socket绑定到HttpServerConnection中,开始处理请求,下面代码中有一个RequestHandleTask类,这是一个单独的线程,因为每个请求都不能干涉服务器的主线程,所以这里新开一个非阻塞的线程去处理每一个请求:

    while (isLoop) {
        if (!mServerSocket.isClosed()) {
            // 阻塞接受客户端。
            Socket socket = mServerSocket.accept();
            DefaultHttpServerConnection serverConnection = new DefaultHttpServerConnection();
            // 接受到一个请求到,把请求和刚才的param绑定到connection中。
            serverConnection.bind(socket, httpParams);
    
            // 开启一个线程去处理这个请求,不阻塞当前线程。
            RequestHandleTask requestTask = new RequestHandleTask(this, httpService, serverConnection);
            requestTask.setDaemon(true);
            AndWebUtil.executeRunnable(requestTask);
        }
    }

      在RequestHandleTask中的run方法中,我们只要判断HttpServerConnection是连接的,就调用HttpServicehandleRequest方法交给HttpCore去分析请求,并自动分发到我们刚才注册的login接口中。

    while (mServerConnection.isOpen()) {
        mHttpService.handleRequest(mServerConnection, new BasicHttpContext());
    }

      当HttpCore分析出来这个连接中的请求符合我们刚才注册的接口:

    handlerRegistry.register("/login", new RequestLoginHandle());// 增加登录接口

      它会自动调用RequestLoginHandlehande()方法,因为我们实现了HttpRequestHandle接口。
      到这里,如何利用HttpCore搭建一个Android Http Server就完成了。

    把几个步骤合起来

      有的同学可能不会把上面的代码整合起来,这里给出完整的代码:

    try {
        ServerSocket mServerSocket = new ServerSocket();
        mServerSocket.setReuseAddress(true);
        mServerSocket.bind(new InetSocketAddress(mPort));
    
        // HTTP协议拦截器。
        BasicHttpProcessor httpProcessor = new BasicHttpProcessor();
        httpProcessor.addInterceptor(new ResponseDate());
        httpProcessor.addInterceptor(new ResponseServer());
        httpProcessor.addInterceptor(new ResponseContent());
        httpProcessor.addInterceptor(new ResponseConnControl());
    
        // HTTP Attribute.
        HttpParams httpParams = new BasicHttpParams();
        httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeout)
            .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE, 8 * 1024)
            .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK, false)
            .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY, true)
            .setParameter(CoreProtocolPNames.ORIGIN_SERVER, "WebServer/1.1");
    
        // 注册Http接口。
        HttpRequestHandlerRegistry handlerRegistry = new HttpRequestHandlerRegistry();
        for (Map.Entry<String, AndServerRequestHandler> handlerEntry : mRequestHandlerMap.entrySet()) {
            handlerRegistry.register("/" + handlerEntry.getKey(), new DefaultHttpRequestHandler(handlerEntry.getValue()));
        }
    
        // 创建HTTP服务。
        HttpService httpService = new HttpService(httpProcessor, new DefaultConnectionReuseStrategy(), new DefaultHttpResponseFactory());
        httpService.setParams(httpParams);
        httpService.setHandlerResolver(handlerRegistry);
    
        /**
         * 开始接受客户端请求。
         */
        while (isLoop) {
            // 接收客户端套接字。
            if (!mServerSocket.isClosed()) {
                Socket socket = mServerSocket.accept();
                DefaultHttpServerConnection serverConnection = new DefaultHttpServerConnection();
                serverConnection.bind(socket, httpParams);
    
                // Dispatch request handler.
                RequestHandleTask requestTask = new RequestHandleTask(this, httpService, serverConnection);
                requestTask.setDaemon(true);
                AndWebUtil.executeRunnable(requestTask);
            }
        }
    } catch (Exception e) {
    } finally {
        close();
    }

      RequestHandleTask类的完整代码:

    public class RequestHandleTask extends Thread {
    
        private final HttpService mHttpService;
    
        private final HttpServerConnection mServerConnection;
    
        private DefaultAndServer mWebServerThread;
    
        public RequestHandleTask(DefaultAndServer webServerThread, HttpService httpservice, HttpServerConnection conn) {
            this.mWebServerThread = webServerThread;
            this.mHttpService = httpservice;
            this.mServerConnection = conn;
        }
    
        @Override
        public void run() {
            try {
                while (mWebServerThread.isLooping() && mServerConnection.isOpen()) {
                    this.mHttpService.handleRequest(this.mServerConnection, new BasicHttpContext());
                }
            } catch (IOException e) {
            } catch (HttpException e) {
            } finally {
                try {
                    this.mServerConnection.shutdown();
                } catch (IOException e) {
                }
            }
        }
    }

      好了咯,主要代码就是这些,剩下的自己去发挥吧!


    版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003

    展开全文
  • Android 如何搭建一个局域网 Web 服务器 前言  在写博客之前我已经做了一个Android Http Server的开源项目,我把它取名叫AndServer,AndServer源代码托管在Github:...
    
    

    Android 如何搭建一个局域网 Web 服务器

    前言

      在写博客之前我已经做了一个Android Http Server的开源项目,我把它取名叫AndServerAndServer源代码托管在Github:https://github.com/yanzhenjie/AndServerAndServerAndroid Http Server的简写,顾名思义AndServer是Android端Http服务器的一个项目。 
      目的在于在Android可以很方便的搭建Http服务器,这几天有人问我局域网Client和Client通信的时候有时候用什么技术比较好,其实我想到的是Socket和Http,我们知道Http是基于Socket的,所以它是一个非常成熟的Socket,所以我选择了用Http来实现,今天的博客内容也是主要讲Android端如何搭建一个Http服务器。

    AndServer如何引用

      如果不想研究原理,只是想快速解决项目中的问题的同学,直接依赖AndServer,具体用法往下看,或者从Github上下载AndServer的Demo。这里给出AndroidStudio和Eclipse的使用方式:

    • Eclipse使用Jar包,如果需要依赖源码,请自行下载。

      下载Jar包

    • AndroidStudio使用Gradle构建添加依赖(推荐)

    compile 'com.yanzhenjie:andserver:1.0.1'

    Android端用什么技术实现Http服务器

      ApacheHttpCore是一个优秀的Http底层框架,支持构建服务器,支持构建客户端,所以我们第一个版本选择了Apache的HttpCore,因为Android弃用了ApacheHttpClient相关API,代码中会有弃用的警告,不过这一点大家不要担心,下面会给出解决方案。

    Android弃用了HttpClient后怎么继续使用HttpClient

      Android6.0之后SDK中删除HttpClient相关的API,我看了Google的官方文档后提示我们,如果还想继续使用HttpClient的话:

    如果你的SDK下没有org.apache.http.legacy.jar的话到这里下载

    方案一:AndroidStuid主module的gradle中配置:

    android {
        useLibrary ‘org.apache.http.legacy‘
        }

      如果提示编译不过的话,需要在android-sdk-windows\platforms\android-23\optional下检查有没有以下两个文件:

    optional.json 
    org.apache.http.legacy.jar

    方案二:如果你使用的是Eclipse

      拷贝android-sdk-windows\platforms\android-23\optional下的org.apache.http.legacy.jar到你项目的libs下就完结。

    方案三:下载Apache的jar包(不推荐)

      从Apache官网下载HttpClientHttpCore的jar包导入到项目。地址是:http://hc.apache.org/downloads.cgi。 
      但是我推荐方案一和方案二,因为AndroidSDK中删除了HttpClient的api,但是手机系统里面还是有HttpClient的api的。方案一和二的原理最终都是引用SDK下android-sdk-windows\platforms\android-23\optional下的org.apache.http.legacy.jar这个jar包到项目中,是Google处理过的jar,添加了AndroidHttpClient等适合Android使用的api,体积相对从Apache官网下载的jar小的多。

    如何使用AndServer

      这里先给大家看下AndServer怎么用,下一步详解如何一步步用HttpCore实现一个简易的HttpServer

    (一)实现AndServerRequestHandler接口,相当Servlet

      我们每写一个服务端接口,就要一个对应的类来处理,这里要实现AndServerRequestHandler接口,相当于Java继承Servet一样,我们只需要处理Request,在Response中给出响应即可:

    publicclassAndServerTestHandlerimplementsAndServerRequestHandler{
    @Override
    publicvoid handle(HttpRequest rq,HttpResponse rp,HttpContext ct)throwsHttpException,IOException{
            response.setEntity(newStringEntity("请求成功。","utf-8"));
            }
            }

    (二)在AndServer上注册接口名称,并启动服务器

      在启动AndServer的时候最好放在Service中,这里给出启动的关键代码。指定服务器的端口号,并注册接口,再启动服务器:

    AndServerBuild andServerBuild =AndServerBuild.create();
    andServerBuild.setPort(4477);// 指定http端口号。
    // 注册接口。
    andServerBuild.add("test",newAndServerTestHandler());
    // 这里还可以注册很多接口。
    // 构建AndServer并启动服务器。
    AndServer andServer = andServerBuild.build();
    andServer.launch();

      到这里就完成了一个Android WebServer的搭建,我们已经可以通过浏览器或者NoHttp来访问我们的WebServer了。

    (三)其他设备如何访问

      如果是浏览器方法,和我们普通访问网站没有区别,比如访问我们上面的接口:

    Android本机访问的地址:http://locahost:4477/test
    局域网其他设备访问地址:http://192.168.1.116:4477/test

      如果是其它Android系统的设备,推荐使用NoHttp来访问,NoHttp是我的另一个Http客户端的项目,和AndWeb正好是相对的,一个做服务端,一个做客户端。 
      到这里怎么用AndServer和Android搭建服务端的教程就完了,如果想自己尝试利用HttpCore搭建一个Http服务端的话,请往下看。

    AndroidCore实现一个简易的Http服务器

      其实里边的东西比较复杂个人感觉如果你不想自己写一个这样的框架的,没有太大必要看完,但是我推荐大家往下看噢,我相信你会有收获的。这里讲解下关键的代码,一共有六步:

    (一)ServerSocket构建服务端连接

      我们知道Http是基于Socket的,那么服务端肯定是ServerSocket了,所以我们这里也是需要一个ServerSocket来接受客户端请求的:

    ServerSocket mServerSocket =newServerSocket();
    mServerSocket.setReuseAddress(true);
    mServerSocket.bind(newInetSocketAddress(mPort));// 绑定端口

    (二)HttpProcessor增加Http协议处理器

      这个就是添加Http协议拦截器,都是Http基本信息。

    // HTTP协议拦截器。
    BasicHttpProcessor httpProcessor =newBasicHttpProcessor();
    httpProcessor.addInterceptor(newResponseDate());
    httpProcessor.addInterceptor(newResponseServer());
    httpProcessor.addInterceptor(newResponseContent());
    httpProcessor.addInterceptor(newResponseConnControl());

    (三)HttpParams初始化Http基本信息

      初始化Http连接的信息,比如超时时间,缓存区大小,是否使用GZIP等。

    // HTTP Attribute.
    HttpParams httpParams =newBasicHttpParams();
    httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT,5000)
    .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE,8*1024)
    .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,false)
    .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,true)
    .setParameter(CoreProtocolPNames.ORIGIN_SERVER,"WebServer/1.1");

    (四)HttpRequestHandlerRegistry增加接口名称

      这里要用HttpRequestHandlerRegistry把我们的RequestHandler注册进来,这一步也是最重要的,就是我们的接口名称,相当于是注册Servlet到web.xml中一样。 
      我举个栗子 
      举个例子,假设访问严振杰的主页http://www.yanzhenjie.com,我的主页下假设有一个login的接口,那我们的地址是:http://www.yanzhenjie.com/login,我们的Android Web Server也要实现这样一个可以访问的地址,就要注册一个login的接口,所以这里是增加接口名称:

    // 注册Http接口。
    HttpRequestHandlerRegistry handlerRegistry =newHttpRequestHandlerRegistry();
    handlerRegistry.register("/login",newRequestLoginHandle());// 增加登录接口
    handlerRegistry.register("/download",newRequestTestHandle());// 增加下载接口

      这里可以注册很多个接口,我们后面的接口对象是实现了HttpCoreHttpRequestHandler接口的自定义类,比如我们上面的RequestLoginHandle的实现是:

    publicclassRequestLoginHandleimplementsHttpRequestHandler{
    @Override
    publicvoid handle(HttpRequest rq,HttpResponse rp,HttpContext c){
    // 只要在这里处理HttpRequest,如果要发出响应数据,用HttpResponse
    }
    }

    (五)HttpService创建Http服务

      前面准备的几步都是为这一步准备参数的,把我们前面准备好的httpProcessorhttpParamshandlerRegistry都传到HttpService,为下一步的Connection做好准备。

    // 创建HTTP服务。
    HttpService httpService =newHttpService(httpProcessor,newConnectionReuseStrategy(),newHttpResponseFactory());
    httpService.setParams(httpParams);
    httpService.setHandlerResolver(handlerRegistry);

    (六)Socket、DefaultHttpServerConnection处理客户端请求

      上面的工作都做完了,就用到我们最开始准备好的ServerSocket来接受客户端的连接的socket了,接受到一个客户端的连接后,把刚才的httpParams和socket绑定到HttpServerConnection中,开始处理请求,下面代码中有一个RequestHandleTask类,这是一个单独的线程,因为每个请求都不能干涉服务器的主线程,所以这里新开一个非阻塞的线程去处理每一个请求:

    while(isLoop){
    if(!mServerSocket.isClosed()){
    // 阻塞接受客户端。
    Socket socket = mServerSocket.accept();
    DefaultHttpServerConnection serverConnection =newDefaultHttpServerConnection();
    // 接受到一个请求到,把请求和刚才的param绑定到connection中。
            serverConnection.bind(socket, httpParams);
            // 开启一个线程去处理这个请求,不阻塞当前线程。
    RequestHandleTask requestTask =newRequestHandleTask(this, httpService, serverConnection);
            requestTask.setDaemon(true);
            AndWebUtil.executeRunnable(requestTask);
    }
    }

      在RequestHandleTask中的run方法中,我们只要判断HttpServerConnection是连接的,就调用HttpServicehandleRequest方法交给HttpCore去分析请求,并自动分发到我们刚才注册的login接口中。

    while(mServerConnection.isOpen()){
        mHttpService.handleRequest(mServerConnection,newBasicHttpContext());
        }

      当HttpCore分析出来这个连接中的请求符合我们刚才注册的接口:

    handlerRegistry.register("/login",newRequestLoginHandle());// 增加登录接口

      它会自动调用RequestLoginHandlehande()方法,因为我们实现了HttpRequestHandle接口。 
      到这里,如何利用HttpCore搭建一个Android Http Server就完成了。

    把几个步骤合起来

      有的同学可能不会把上面的代码整合起来,这里给出完整的代码:

    try{
    ServerSocket mServerSocket =newServerSocket();
        mServerSocket.setReuseAddress(true);
        mServerSocket.bind(newInetSocketAddress(mPort));
        // HTTP协议拦截器。
    BasicHttpProcessor httpProcessor =newBasicHttpProcessor();
        httpProcessor.addInterceptor(newResponseDate());
        httpProcessor.addInterceptor(newResponseServer());
        httpProcessor.addInterceptor(newResponseContent());
        httpProcessor.addInterceptor(newResponseConnControl());
        // HTTP Attribute.
    HttpParams httpParams =newBasicHttpParams();
        httpParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, timeout)
        .setIntParameter(CoreConnectionPNames.SOCKET_BUFFER_SIZE,8*1024)
    .setBooleanParameter(CoreConnectionPNames.STALE_CONNECTION_CHECK,false)
    .setBooleanParameter(CoreConnectionPNames.TCP_NODELAY,true)
    .setParameter(CoreProtocolPNames.ORIGIN_SERVER,"WebServer/1.1");
    // 注册Http接口。
    HttpRequestHandlerRegistry handlerRegistry =newHttpRequestHandlerRegistry();
    for(Map.Entry<String,AndServerRequestHandler> handlerEntry : mRequestHandlerMap.entrySet()){
            handlerRegistry.register("/"+ handlerEntry.getKey(),newDefaultHttpRequestHandler(handlerEntry.getValue()));
            }
    // 创建HTTP服务。
    HttpService httpService =newHttpService(httpProcessor,newDefaultConnectionReuseStrategy(),newDefaultHttpResponseFactory());
        httpService.setParams(httpParams);
        httpService.setHandlerResolver(handlerRegistry);
        /**
         * 开始接受客户端请求。
         */
         while(isLoop){
    // 接收客户端套接字。
    if(!mServerSocket.isClosed()){
    Socket socket = mServerSocket.accept();
    DefaultHttpServerConnection serverConnection =newDefaultHttpServerConnection();
                serverConnection.bind(socket, httpParams);
                // Dispatch request handler.
    RequestHandleTask requestTask =newRequestHandleTask(this, httpService, serverConnection);
                requestTask.setDaemon(true);
                AndWebUtil.executeRunnable(requestTask);
    }
    }
    }catch(Exception e){
    }finally{
        close();
        }

      RequestHandleTask类的完整代码:

    publicclassRequestHandleTaskextendsThread{
    privatefinalHttpService mHttpService;
    privatefinalHttpServerConnection mServerConnection;
    privateDefaultAndServer mWebServerThread;
    publicRequestHandleTask(DefaultAndServer webServerThread,HttpService httpservice,HttpServerConnection conn){
    this.mWebServerThread = webServerThread;
    this.mHttpService = httpservice;
    this.mServerConnection = conn;
    }
    @Override
    publicvoid run(){
    try{
    while(mWebServerThread.isLooping()&& mServerConnection.isOpen()){
    this.mHttpService.handleRequest(this.mServerConnection,newBasicHttpContext());
    }
    }catch(IOException e){
    }catch(HttpException e){
    }finally{
    try{
    this.mServerConnection.shutdown();
    }catch(IOException e){
    }
    }
    }
    }
    展开全文
  • CentOS7.2 创建本地与局域网yum源

    千次阅读 2017-09-07 16:09:21
    由于客户环境只有局域网,安装各种软件都相当麻烦,而且各种的依赖包,装到吐血,还是得本地安装yum源来安装软件比较便捷些,提高软件安装效率。

    1背景

    由于客户环境只有局域网,没法使用网上的各种YUM源,来回拷贝rpm包安装麻烦,还得解决依赖问题。想着在CentOS7.2搭建个本地/局域网YUM源,方便自己跟同事安装软件。

    2环境

    [root@linuxidc.com ~]# cat /etc/RedHat-release 
    CentOS Linux release 7.2.1511 (Core) 

    并且是Minimal Install。

    3安装

    3.1本地YUM源

    3.1.1 ISO源

    准备rpm包 

    挂载CentOS-7-x86_64-Everything-1511.iso,把里面所有文件都拷贝到本地目录/yum/yum-iso

    [root@linuxidc.com ~]# mkdir /mnt/yum-iso
    [root@linuxidc.com ~]# mount /dev/cdrom /mnt/yum-iso/
    mount: /dev/sr0 is write-protected, mounting read-only
    [root@linuxidc.com ~]# mkdir /yum/
    [root@linuxidc.com ~]# cp -a /mnt/yum-iso/ /yum/
    [root@linuxidc.com ~]# ll /yum/
    total 4
    dr-xr-xr-x. 8 root root 4096 Dec 10  2015 yum-iso
    [root@linuxidc.com ~]# ll /yum/yum-iso/
    total 640
    -r--r--r--. 1 root root     14 Dec 10  2015 CentOS_BuildTag
    dr-xr-xr-x. 3 root root     33 Dec 10  2015 EFI
    -r--r--r--. 1 root root    215 Dec 10  2015 EULA
    -r--r--r--. 1 root root  18009 Dec 10  2015 GPL
    dr-xr-xr-x. 3 root root     69 Dec 10  2015 images
    dr-xr-xr-x. 2 root root   4096 Dec 10  2015 isolinux
    dr-xr-xr-x. 2 root root     41 Dec 10  2015 LiveOS
    dr-xr-xr-x. 2 root root 483328 Dec 10  2015 Packages
    dr-xr-xr-x. 2 root root   4096 Dec 10  2015 repodata
    -r--r--r--. 1 root root   1690 Dec 10  2015 RPM-GPG-KEY-CentOS-7
    -r--r--r--. 1 root root   1690 Dec 10  2015 RPM-GPG-KEY-CentOS-Testing-7
    -r--r--r--. 1 root root   2883 Dec 10  2015 TRANS.TBL
    [root@linuxidc.com ~]#  

    备份、移除其他repo

    [root@linuxidc.com ~]# cd /etc/yum.repos.d/
    [root@linuxidc.com yum.repos.d]# ll
    -rw-r--r--. 1 root root 1664 Dec  9  2015 CentOS-Base.repo
    -rw-r--r--. 1 root root 1309 Dec  9  2015 CentOS-CR.repo
    -rw-r--r--. 1 root root  649 Dec  9  2015 CentOS-Debuginfo.repo
    -rw-r--r--. 1 root root  290 Dec  9  2015 CentOS-fasttrack.repo
    -rw-r--r--. 1 root root  630 Dec  9  2015 CentOS-Media.repo
    -rw-r--r--. 1 root root 1331 Dec  9  2015 CentOS-Sources.repo
    -rw-r--r--. 1 root root 1952 Dec  9  2015 CentOS-Vault.repo
    [root@linuxidc.com yum.repos.d]# tar zcvf repo-bk.tar.gz CentOS-*
    CentOS-Base.repo
    CentOS-CR.repo
    CentOS-Debuginfo.repo
    CentOS-fasttrack.repo
    CentOS-Media.repo
    CentOS-Sources.repo
    CentOS-Vault.repo
    [root@linuxidc.com yum.repos.d]# rm -f CentOS-Base.repo CentOS-CR.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Sources.repo CentOS-Vault.repo
    

    配置本地repo

    [root@linuxidc.com yum.repos.d]# vi CentOS-Media.repo

    填入如下内容

    [c7-media]
    name=CentOS-$releasever - Media
    baseurl=file:///yum/yum-iso/
    gpgcheck=0
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    注释:配置repo路径、关闭gbp校验、启用这个repo

    制作cache

    [root@linuxidc.com yum.repos.d]# yum clean all
    Loaded plugins: fastestmirror
    Cleaning repos: c7-media
    Cleaning up everything
    Cleaning up list of fastest mirrors
    [root@linuxidc.com yum.repos.d]# yum makecache
    Loaded plugins: fastestmirror
    c7-media                                                                                                         | 3.6 kB  00:00:00     
    (1/4): c7-media/group_gz                                                                                         | 155 kB  00:00:00     
    (2/4): c7-media/primary_db                                                                                       | 5.3 MB  00:00:00     
    (3/4): c7-media/filelists_db                                                                                     | 6.2 MB  00:00:00     
    (4/4): c7-media/other_db                                                                                         | 2.3 MB  00:00:00     
    Determining fastest mirrors
    Metadata Cache Created
    [root@linuxidc.com yum.repos.d]#  

    这样就可以使用yum安装软件啦

    [root@linuxidc.com yum.repos.d]# yum groupinstall "Development tools"
    Loaded plugins: fastestmirror
    There is no installed groups file.
    Maybe run: yum groups mark convert (see man yum)
    Loading mirror speeds from cached hostfile
    Resolving Dependencies
    --> Running transaction check
    ---> Package autoconf.noarch 0:2.69-11.el7 will be installed
    --> Processing Dependency: perl >= 5.006 for package: autoconf-2.69-11.el7.noarch
    --> Processing Dependency: m4 >= 1.4.14 for package: autoconf-2.69-11.el7.noarch
    --> Processing Dependency: perl(warnings) for package: autoconf-2.69-11.el7.noarch

    或者

    [root@linuxidc.com yum.repos.d]# yum install tree
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    Resolving Dependencies
    --> Running transaction check
    ---> Package tree.x86_64 0:1.6.0-10.el7 will be installed
    --> Finished Dependency Resolution

    3.1.2 自定义YUM源

    [root@linuxidc.com yum.repos.d]# yum -y install createrepo

    准备rpm包

    (需要自己确定依赖包)、目录。这里使用tree做演示。

    [root@linuxidc.com ~]# mkdir -p /yum/yum-custom/packages
    [root@linuxidc.com ~]# cp tree-1.6.0-10.el7.x86_64.rpm /yum/yum-custom/packages/

    创建repo

    [root@linuxidc.com ~]# createrepo -u -d  /yum/yum-custom/
    Spawning worker 0 with 1 pkgs
    Spawning worker 1 with 0 pkgs
    Workers Finished
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    Sqlite DBs complete
    [root@linuxidc.com ~]# ll /yum/yum-custom/
    total 4
    drwxr-xr-x. 2 root root   41 Dec 20 07:03 packages
    drwxr-xr-x. 2 root root 4096 Dec 20 07:08 repodata
    [root@linuxidc.com ~]#  

    配置自定义repo

    [root@linuxidc.com ~]# vi /etc/yum.repos.d/CentOS-Media.repo

    填入如下内容

    [c7-media]
    name=CentOS-$releasever - Media
    baseurl=file:///yum/yum-custom/
    gpgcheck=0
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 

    制作cache

    [root@linuxidc.com ~]# yum clean all
    Loaded plugins: fastestmirror
    Cleaning repos: c7-media
    Cleaning up everything
    Cleaning up list of fastest mirrors
    [root@linuxidc.com ~]# 
    [root@linuxidc.com ~]# yum makecache
    Loaded plugins: fastestmirror
    c7-media                                                                                                         | 3.0 kB  00:00:00     
    (1/3): c7-media/filelists_db                                                                                     |  880 B  00:00:00     
    (2/3): c7-media/primary_db                                                                                       | 1.8 kB  00:00:00     
    (3/3): c7-media/other_db                                                                                         | 1.3 kB  00:00:00     
    Determining fastest mirrors
    Metadata Cache Created
    [root@linuxidc.com ~]#  

    使用自定义repo

    [root@linuxidc.com ~]# yum install tree
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    Resolving Dependencies
    --> Running transaction check
    ---> Package tree.x86_64 0:1.6.0-10.el7 will be installed
    --> Finished Dependency Resolution 

    3.2 局域网YUM源

    局域网YUM源可以配成:本地YUM源 + FTP服务器

    这里使用自定义源yum-custom(见上面) + VSFTP演示。

    下载vsftpd

    [root@linuxidc.com ~]# yum -y install vsftpd

    配置vsftpd

    编辑vsftp.conf

    [root@linuxidc.com ~]# vi /etc/vsftpd/vsftpd.conf

    并增加匿名用户root目录(默认已经启用匿名访问)

    anon_root=/yum/

    注意目录权限如下

    [root@linuxidc.com ~]# ll -a /yum/
    total 8
    drwxr-xr-x.  4 root root   37 Dec 20 07:37 .
    dr-xr-xr-x. 18 root root 4096 Dec 20 06:32 ..
    drwxr-xr-x.  4 root root   36 Dec 20 07:08 yum-custom
    dr-xr-xr-x.  8 root root 4096 Dec 10  2015 yum-iso 

     关闭selinux

    临时

    [root@linuxidc.com ~]# setenforce 0

    或者,永久:

    编辑config

    [root@linuxidc.com ~]# vi /etc/selinux/config

    设置

    SELINUX=disabled

    重启

    [root@linuxidc.com ~]# reboot

    启用vsftp

    [root@linuxidc.com ~]# systemctl start vsftpd
    [root@linuxidc.com ~]# systemctl enable vsftpd
    Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
    [root@linuxidc.com ~]# 

    局域网使用

    局域网另外一台机器min-client,

    配置repo

    编辑repo

    [root@min-client ~]# vim /etc/yum.repos.d/CentOS-Media.repo

    内容如下

    [c7-media]
    name=CentOS-$releasever - Media
    baseurl=ftp://192.168.118.133/yum-custom
    gpgcheck=0
    enabled=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    其中192.168.118.133为上面vsftp服务器地址

    启用这个局域网的repo

    [root@min-client ~]# yum clean all
    Loaded plugins: fastestmirror
    Cleaning repos: c7-media
    Cleaning up everything
    [root@min-client ~]# yum makecache
    Loaded plugins: fastestmirror
    c7-media                                                                                                         | 3.0 kB  00:00
    (1/3): c7-media/filelists_db                                                                                     |  880 B  00:00
    (2/3): c7-media/other_db                                                                                         | 1.3 kB  00:00
    (3/3): c7-media/primary_db                                                                                       | 1.8 kB  00:00
    Determining fastest mirrors
    Metadata Cache Created
    [root@min-client ~]#  

    使用

    [root@linuxidc.com ~]# yum -y install tree
    Loaded plugins: fastestmirror
    Loading mirror speeds from cached hostfile
    Resolving Dependencies
    --> Running transaction check
    ---> Package tree.x86_64 0:1.6.0-10.el7 will be installed
    --> Finished Dependency Resolution 

    目前差不多这些就够用了。以后有时间把163的YUM源爬下来,当本地源用。

    展开全文
  • Socket做一个局域网聊天工具 首先创建一个序列化流类SerialiableMessage 此序列化消息定义了传输消息结构,主要有五个成员变量,分别记录如下信息: private String sendUserNmae;--发送端用户名 private String sendIp...
  • 笔记本如何创建无线局域网,建无线局域网当然要有无线网否有),由于寝室没有其它的设备,就只好建小型的网(一般可以搞无线路由卡(一般看自己的笔记本就知道是)
  • wampserver 创建局域网

    2018-03-29 15:39:06
    使用wampserver可以自动创建局域网 1 wampserver设置成在线状态 找到Wamp Setings 目录下的 Menu item :online/offline ,点击开启这时你会发现切换在线状态2、将wampserver设置成允许所有电脑访问打开后找到...
  • 这使我萌生一个念头:做一个局域网聊天工具。局域网聊天工具要实现的功能可以很多,首先需要分析的是它的核心需求是什么?分析一个软件的核心需求,要看人们用这个软件的最经常的操作是什么。我观察了一下,我们用...
  • 建立一个局域网连接

    2011-03-22 13:01:02
    1、显示描述@echo '××××××××'2、...建立一个到IP的局域网访问连接,解决访问该资源时要输入用户名密码的问题。执行该命令,自动创建连接3、其它net命令查看远程主机的共享资源 net view \\IP,查看本地的共...
  • 机子在创建局域网可以看见共享东西,两机子在创建局域网可以看见共享东西
  • 一、创建一个docker的局域网。 通过命令:  docker network create --driver=bridge --subnet=192.168.0.0/16 advnet  创建一个不重叠的子网。这个子网不是现有网络的细分。 它纯粹是为了寻址目的。可以直接...
  • Unity连接局域网 可以创建一个,连接一个,C#脚本 ,挂着空物体上即可实现
  • 1.首先保证两台电脑都有联网 2.更改适配器把两台电脑设为固定IP,同时让分配的IP地址相邻 3.使用ping命令,看是否能ping通。是,创建完成。否,有问题,重新分配固定IP后尝试。...这样肯定是同一个局域网了 ...
  • 用一台机子开发一个局域网程序共享软件,同时打开两个genymotion模拟器A B。 然而在模拟器里看到A 、B的本地ip地址都是10.10.3.15,所以根本就不在一个网络,所以也就无法使用了。 然而adb里分明看到它们是在192....
  • 创建局域网Git服务器

    千次阅读 2018-11-06 17:09:27
    本文提供的方法适用于小团队在局域网内通过git协调工作。 . 基本步骤 第1步:安装 Linux,安装 Git 此处省略具体操作步骤。 第2步:创建 git 用户 在Linux系统内以管理员权限执行如下命令: adduser git ...
  • 1.创建2台pc机并进行设置IP地址和...静态路由网段(Router20/21/22)与终端laptop10机网段为同一网段,下一跳网址是由下一个路由器FastEthrnet0/0至FastEthrnet0/1,即192.168.4.0-192.168.2.2-192.168.3.2-192.168....
  • 如何创建局域网

    千次阅读 2018-05-10 13:43:16
    LAN是Local Area Network的缩写,即局域网。WAN是Wide Area Network的缩写,即广域网。工具/原料两台及以上电脑,并且安装网卡集线器或路由器具备组网的其它必备设备方法/步骤1根据物理位置和距离情况,制作若干根...
  • 1.互相 ping 看能否访问 如图 (判断是否在一个局域网) 2.给电脑A授权创建用户 电脑B操作 允许用户myuser从ip为 192.168.1.186 的主机连接到mysql服务器,并使用123456作为密码 GRANT ALL PRIVILEGES ON . ...
  • 创建步骤: 创建4台PC机并设置IP地址和1台交换机,点击pc机在桌面中选择IP地址配置进行手动设置 ![lap里插入图片描述![在这里插入图片描述](https://img- 1.添加VLAN号; ①双击服务器会出现Switch ②点击配置中...
  • 1.创建2台pc机并设置IP地址 2.创建2个路由器并设置...静态路由网段(Router9)与终端laptop7机网段为同一网段,下一跳网址是由下一个路由器FastEthrnet0/0至FastEthrnet0/1,即192.168.3.0-192.168.2.2-192.168....
  • 一个是您的版本与其他版本不同。 现在是1.20c。楼上有防火墙或Windows防火墙可以解除阻止。为什么我不能进入局域网一个是您的版本与其他版本不同,现在是1.20c。在楼上还有一个防火墙或Windows防火墙可以解除阻止...
  • 一:准备工作 项目发起人的电脑下载安装 VisiualSVN 和 TortoiseSVN(小乌龟);...打开 VisiualSVN Server Manager,在Repositories上右键新建Repository,不需要更改设置,只需要输入一个名称,一直下一步就行...
  • 设置局域网 首先用网线连接两台电脑,然后打开其中台右下角的【网络和共享中心】,点击左侧的【更改适配器设置】: 可以看到本地连接被提示为连接到“未识别的网络”: 双击此【本地连接】,修改(TCP/IPV4)...
  • 搭建一个局域网内使用的ftp站点

    千次阅读 2019-10-24 14:41:28
    13.如果要同一个局域网内的其他机器访问FTP。有两种办法,第一是关闭本机的防火墙,第二是设置防火墙入站规则允许FTP服务的20,21号端口入站。 14.第一种方法不再介绍,下面介绍第二种方法。 Windows+R 打开...
  • 开放数据库给局域网内用户使用,需要创建用户以及开放部分权限。 解决: 1.登录mysql数据库 未设置全局变量需要进入相关路径 cd mysql8.0/bin 登录mysql mysql -u 你的账户名 -p你的密码 2.创建用户,以及开放ip ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,580
精华内容 47,832
关键字:

如何创建一个局域网