使用cocoaHTTPServer实现wifi传书时电脑浏览器显示拒绝连接

在开发一个iOS电子书阅读器,想实现wifi传书功能,从GitHub下载了cocoaHTTPServer,依照网上的介绍,导入到了项目中,在实现wifi传书功能时,找了网上相关的代码,https://www.jianshu.com/p/2852d7875fe2,适当作了修改,代码如下:

@IBAction func wifichuanshu1(_ sender: UIButton) {
        
        var localHttpServer=HTTPServer()
        func setupLocalHttpServer() {
            //       setupLocalHttpServer()\
            localHttpServer = HTTPServer.init()
            localHttpServer.setType("_http.tcp")
            let webPath = Bundle.main.path(forResource: "web", ofType: nil)
            let webPath1=String(describing: webPath)
            print("web \(webPath1)")
            localHttpServer.setDocumentRoot(webPath)
            localHttpServer.setConnectionClass(MyHTTPConnection.classForCoder())
            //               [httpServer setConnectionClass:[MyHTTPConnection class]];
            startServer()
            
        }
        setupLocalHttpServer()
        
        func startServer() {
            
            do {

                localHttpServer.setPort(13131)
                try localHttpServer.start()
                //let port = localHttpServer.listeningPort()
                let port=localHttpServer.port()
                print("port \(port)")
                if let ip = getWifiIP() {
                    ipdizhi1.text="address http://\(ip):\(port)"
                    print("address http://\(ip):\(port)")
                    
                }
                else{
                    let alertController = UIAlertController(title: "ip地址获取失败",
                                                            message: nil, preferredStyle: .alert)
                    //显示提示框
                    self.present(alertController, animated: true, completion: nil)
                    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 10) {
                        self.presentedViewController?.dismiss(animated: false, completion: nil)}
                    
                }
                
            } catch let err {
                print("error \(err)")
            }         
            
        }

    }
    
    

现在的问题是,在xs max上真机测试时,能显示ip地址和端口号,但在电脑浏览器键入访问时,显示“192.168.1.4已拒绝连接”,App Transport Security Settings中Allow Arbitrary Loads已设置为yes,开发者账号也已续期,申请了证书,导入了profile 文件,在手机使用无线局域网和蜂窝网络的app列表中已可找到我开发中的app,允许了无线局域网,浏览器还是显示“已拒绝连接”。
(1)httpserver应该已经启动,在httpserver的start方法中有以下语句:


if (success)
        {
            HTTPLogInfo(@"%@: Started HTTP server on port %hu", THIS_FILE,
                        [asyncSocket localPort]);
            printf("Started HTTP server on port %hu");
            isRunning = YES;
            [self publishBonjour];
        }

在控制台输出了Started HTTP server on port,但端口号与13131不一致,这是什么原因,是不是这里出了问题,但用这个端口号连接,也显示“已拒绝连接”。
(2)允许了无线局域网,app能访问电脑上的php文件,关闭了无线局域网,就不能访问,很正常,但电脑浏览器访问手机app,无论是允许无线局域网还是关闭,都显示“192.168.1.4已拒绝连接”,个人直观上觉得手机有保护功能,不允许随便访问,只要打开某个开关就行了,但不知道是哪个,应如何操作,如果这也不是,是不是要在httpconnection中添加什么语句,对这块我完全不熟悉,这个问题已耽搁了我很多时间,恳请各位指教,谢谢!

我怀疑是系统屏蔽了你的访问。

你可以看看系统安全中,有没有拦截你的app

你的电脑和手机处于要处于同一个网络,你的手机打开无线局域网,电脑也要连接这个无线局域网。先排除是否是这个问题!!!

1、在调用 HTTPServer 的 start() 方法时设置了端口号为 13131,但 HTTPServer 对象使用的端口号与设置的可能不同。这是因为,当调用 start() 方法时,HTTPServer 对象会自动分配一个可用的端口号。可以通过 HTTPServer 对象的 listeningPort() 方法来获取实际使用的端口号。

2、如果电脑和手机不在同一局域网内,那么电脑无法直接访问手机上的本地 HTTP 服务器。需要将手机连接到电脑的 WiFi 网络或者将电脑连接到手机的热点网络。这样电脑和手机就在同一局域网内,就可以使用电脑的浏览器访问手机上的本地 HTTP 服务器了。

3、如果手机连接到电脑的 WiFi 网络或者电脑连接到手机的热点网络后,还是无法访问手机上的本地 HTTP 服务器,那么可能是因为手机或者电脑的防火墙软件阻止了 HTTP 服务器的通信。可以试试关闭防火墙软件或者将 HTTP 服务器添加到防火墙软件的例外列表中,然后再试试访问。

4、在 MyHTTPConnection 类中,可以实现 shouldUseCredentialStorage() 方法。这个方法用于告诉本地 HTTP 服务器是否应该使用证书存储来验证连接。如果返回 YES,就服务器会使用证书存储中的证书来验证连接;如果返回 NO,就服务器会忽略证书存储中的证书。

例如可以在 MyHTTPConnection 类中实现如下代码:

- (BOOL)shouldUseCredentialStorage {
    return NO;
}

这样本地 HTTP 服务器就不会使用证书存储来验证连接了。但是这只是一种解决方案,并不保证它在应用中一定有效。应该根据实际情况来决定是否使用证书存储。
仅供参考,望采纳,谢谢。

想办法本地抓个http交互的报文 用wireshark看看流程 基本可以确定是系统的问题,还是代码问题

浏览器提示代理服务器拒绝连接怎么处理
跟着操作
https://blog.csdn.net/xitongzhijia_abc/article/details/126176037

看你这个问题也困扰了挺久了哇,有找相关成功的实例去看下不?同步对比下。如果还定位不到原因的话。
实例:利用CocoaHTTPServer实现wifi局域网传输文件到iphone,链接:https://blog.csdn.net/xyt8023y/article/details/50365140

是不是你设置了网关无法连接,总是连接到192.168.1.4,另外你启动的服务器端口应该是13131,你说不一致,具体怎么不一致,把截图贴上来,说的有点不清楚,不好帮你判断解决。

1.首先,确保你的电脑和手机在同一个局域网内,这样才能通过浏览器访问你在手机上运行的服务器。

2.其次,可以使用终端命令 ifconfig 查看手机的 IP 地址,在浏览器中输入 http://<手机 IP 地址>:<端口号>,尝试访问服务器。

3.如果仍然无法访问,可能是你的手机防火墙设置了端口限制,导致无法通过浏览器访问服务器。你可以在手机设置中关闭防火墙,或者将所需要的端口添加到防火墙白名单中。

4.最后,也可以尝试使用代理工具 Fiddler 或 Charles 来检查网络请求,以确定问题所在。

1、是不是因为端口策略问题,比如防火墙
2、电脑和手机不在同一个局域网,可以通过ping和telnet测试
3、确认192.168.1.4 是否能正常存在

手机和电脑是同一个局域网吗

看看防火墙有没有关闭

确保手机和电脑是同意局域网下

1.首先通过ping双方,看是否可以ping通,至少证明两方处于同一个局域网内,并且双方没有类似局域网的拦截
2.如果双方都可以ping通,那么就是api使用的问题,很简单设置验证no,然后再运行一下,网上demo很多

参考一下


https://www.jianshu.com/p/2cd0333bfa31

可能是在使用cocoaHTTPServer时,没有配置正确的域名或IP地址,导致手机上的应用无法通过电脑的浏览器访问。

另外,还有一种可能是电脑和手机处于不同的网络中,或者电脑的防火墙被设置为阻止端口访问,导致手机的服务器无法被访问。

可以尝试检查以下几点:

1 确保手机和电脑处于同一网络中
2 检查防火墙是否被设置为阻止端口访问
3 确保cocoaHTTPServer设置了正确的IP地址或域名。
4 确保电脑的IP地址 是正确的,也就是可以ping到对应ip
5 检查iOS的网络连接,确保没有其他的问题(如:手机的网络没有连接上)
在做好以上检查之后如果问题还是没有解决,尝试更换端口或者尝试其他的第三方库来实现Wifi传书功能。

如果在检查了上述几点之后,问题仍然没有解决,可以考虑以下几点进行排查:

1 检查安全策略是否限制了网络访问。
2 检查当前网络是否具有外网访问权限。
3 检查服务器端是否具有外网访问权限。
4 尝试使用代理服务器连接试试。
5 检查服务器和客户端之间是否存在端口问题。
如果仍然无法解决问题,建议检查代码,看看是否有遗漏的配置或者错误的配置,在使用cocoaHTTPServer实现Wifi传书功能时,需要在HTTPServer的HTTPConnection的子类中实现具体的处理逻辑。这个类负责处理客户端的请求和响应,它需要重写一些方法来处理请求,例如 processMethod:URI: 。

为了让电脑浏览器能正常访问手机上的服务器,可能需要在HTTPConnection类中添加如下语句:

1 关于CORS(Cross-Origin Resource Sharing), 在response中添加Access-Control-Allow-Origin,Access-Control-Allow-Methods,Access-Control-Allow-Headers等相关的头, 这些头信息允许跨域访问
2 关于端口号的问题,在设置端口号的时候要确保端口号是可用的,空闲的
3 关于接口访问权限,在设置服务器时,如果要允许跨域访问,可能需要更改配置
注意: 上面只是一些可能需要添加的语句, 实际应用中还需根据具体的情况来判断, 并进行配置.

下面是一个使用cocoaHTTPServer实现Wifi传书功能的简单案例:

1 创建一个继承自HTTPServer的类MyHTTPServer
2 在MyHTTPServer中添加一个端口号属性,用于设置服务器端口号
3 在MyHTTPServer中重写init方法,初始化端口号并设置跨域头
4 创建一个继承自HTTPConnection的类MyHTTPConnection,
5 在MyHTTPConnection中重写processMethod:URI:方法,在这个方法中实现对文件的上传和下载的处理逻辑。
6 在MyHTTPServer中设置使用MyHTTPConnection处理请求

这里是一个例子:


class MyHTTPServer: HTTPServer {
    var port: UInt16

    override init() {
        self.port = 13131
        super.init()
        self.setType("_http._tcp.")
        self.setConnectionClass(MyHTTPConnection.self)
    }

    func startServer() {
        if !self.start(self.port, error: nil) {
            println("Server failed to start")
        }
    }
}

class MyHTTPConnection: HTTPConnection {
    override func processMethod(method: String!, URI: String!) {
        if method == "GET" {
            // handle GET request
        } else if method == "POST" {
            // handle POST request
        }
    }
}

7 在你的控制器类中创建MyHTTPServer的实例,并启动服务器

let server = MyHTTPServer()
server.startServer()

注意: 这只是一个简单的例子, 你需要在实际应用中根据具体情况来进行实现. 希望对您有所帮助,望采纳。

可能原因:1.没有正确配置服务器。检查服务器地址和端口是否正确。
2.电脑和iOS设备不在同一个局域网中。确保它们在同一Wi-Fi网络中。
3.服务器还未启动。确保已经调用CocoaHTTPServer的start方法启动服务器。 4.防火墙设置可能导致连接失败。请检查你的防火墙设置。