python - BlueSocket 在连接到 Python Socket 套接字时说连接被拒绝

标签 python ios swift sockets tcp

对于我正在制作的 iOS 应用程序,它需要连接到 python 套接字服务器。对于我使用 Swift 3 和 BlueSocket 的 iOS 应用程序,当我尝试使用正确的 IP 和端口连接到服务器时,它总是返回连接被拒绝并且我在服务器上看不到连接。 BlueSocket 设置为 TCP 客户端,python 服务器也是 TCP 服务器,所以我很困惑为什么它不起作用。

有谁知道/理解为什么它无法连接到服务器?

iOS swift代码是这样的:

import UIKit
import Foundation
import SystemConfiguration
import SystemConfiguration.CaptiveNetwork
import Socket

let ssid = "SSID"
let server = "192.168.0.24"
let port = 8000

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBOutlet weak var ideaLabel: UILabel!

@IBAction func generateButton(_ sender: Any) {

    func isInternetAvailable() -> Bool
    {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress))
        zeroAddress.sin_family = sa_family_t(AF_INET)

        let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
                SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
            }
        }

        var flags = SCNetworkReachabilityFlags()
        if !SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) {
            return false
        }
        let isReachable = (flags.rawValue & UInt32(kSCNetworkFlagsReachable)) != 0
        let needsConnection = (flags.rawValue & UInt32(kSCNetworkFlagsConnectionRequired)) != 0
        return (isReachable && !needsConnection)
    }
    func getSSID() -> String? {
        var ssid: String?
        if let interfaces = CNCopySupportedInterfaces() as NSArray? {
            for interface in interfaces {
                if let interfaceInfo = CNCopyCurrentNetworkInfo(interface as! CFString) as NSDictionary? {
                    ssid = interfaceInfo[kCNNetworkInfoKeySSID as String] as? String
                    break
                }
            }
        }
        return ssid
    }
    func generateIdea() -> String? {
        let RNumber = arc4random_uniform(23)


        var idea = ""

        //(A bunch of code to get a idea for offline mode)

        return String(idea)
    }



    let InternetConnect = isInternetAvailable()


    if (InternetConnect == isInternetAvailable()){
        print("Internet Connection Verified")
        if (getSSID() == ssid){
            print("SSID Verified")

            let s = try! Socket.create()
            try! s.connect(to: server, port: 8000)
            print("Connceted to server")

            try! s.write(from: "01")
            print("String send")

            let idea = try! s.readString()
            print("Idea Received")
            ideaLabel.text = idea

            s.close()
        }
        else{

            print("SSID Verification Failed")
            ideaLabel.text = generateIdea()
        }

    }
    else {

        ideaLabel.text = generateIdea()
        print("Internet Connection Verification Failed")

    }
}

swift客户端说明:

当点击一个按钮产生一个想法时,应用程序首先检查它是否可以连接到互联网,如果可以,然后通过检查 SSID(服务器是将成为局域网服务器,因此它只能在设定的网络上工作)如果它无法连接到互联网或不在正确的网络上,它会从应用程序中存储的有限数量的想法中选择一个。如果它可以连接到 Internet 并且位于正确的 Internet 网络上,它会尝试连接到服务器并从服务器获取信息。

python 套接字服务器代码:

import socket
import sqlite3
from random import randint

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('localhost', 8000)
print("Starting Server")
s.bind(server_address)
print("Waiting for client")
s.listen(1)
alive = True

while(alive == True):
    connection, client_address = s.accept()
    print(client_address)

    try:
        command = connection.recv(2)

        if (command == "01"):
            conn = sqlite3.connect('ideas.db')
            c = conn.cursor()
            file = open("maxID.txt", "r")
            maxID = (int(file.read()) + 1)
            ideaNumber = (randint(1,maxID),)
            c.execute('SELECT * FROM ideas WHERE id=?', ideaNumber)
            idea1 = c.fetchone()
            idea = str(idea1)
            conn.close()
            idea = idea.translate(None, "1234567890'(),u")
            print("Your idea is:")
            print(idea)
            connection.send(str(idea))

    finally:
        connection.close()

python socket server的解释:

当服务器获得客户端时,它等待获得命令。在这个服务器中,只有1个命令,就是get idea。该命令是“01”。当它收到该命令时,它做的第一件事就是获取数据库中存储的创意数量。这将写入 maxID.txt 文件,因此它会读取它。然后随机选择一个随机的想法 ID,然后它通过使用 ID 从数据库中获取该想法。然后它将这个想法发送给客户。

最佳答案

问题出在 python 服务器上。问题是我将主机设置为本地主机,而不是将其留空。

这个:

server_address = ('localhost', 8000)

应该是:

server_address = ('', 8000)

关于python - BlueSocket 在连接到 Python Socket 套接字时说连接被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44360150/

相关文章:

ios - 如何设置UIPickerView初始化行?

ios - 最佳编码实践 - 在同一函数中画线和圆 - 结构、开关、类函数

ios - 父 Controller 阻止子 TableView UITableViewRowAction swift

ios - 如何从 API 添加标志图像?

python - 使用Python标准库显示函数状态

python - pyMySQL 设置连接字符集

python - NSRDB 不再提供 TMY3 数据?

python - 从条件开始计算行数

ios - 使用 alamofire 下载不完整的文件

ios - 苹果统一日志记录——如何获取文件名和行号