【问题标题】:BlueSocket saying Connection Refused when connecting to Python Socket SocketBlueSocket 在连接到 Python Socket Socket 时说 Connection Refused
【发布时间】:2017-06-05 00:22:47
【问题描述】:

对于我正在制作的 iOS 应用程序,它需要连接到 python 套接字服务器。对于 iOS 应用程序,我使用的是 Swift 3 并且我使用的是 BlueSocket 当我尝试使用正确的 IP 和端口连接到服务器时,它总是返回 Connection Refused 并且我看不到服务器上的连接。 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(服务器是将成为一个局域网服务器,所以它只能在设定的网络上工作)如果它无法连接到互联网或它不在正确的网络上,它会从存储在应用程序中的有限数量的想法中选择一个。如果它可以连接到互联网并且它在正确的互联网网络上,它会尝试连接到服务器并从服务器获取信息。

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个命令,就是得到一个idea。该命令是“01”。当它得到这个命令时,它做的第一件事就是获取存储在数据库中的想法的数量。这将被写入 maxID.txt 文件,因此它会读取它。然后随机选择一个随机的idea ID,然后使用该ID从数据库中获取该idea。然后它将这个想法发送给客户。

【问题讨论】:

    标签: python ios swift sockets tcp


    【解决方案1】:

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

    这个:

    server_address = ('localhost', 8000)
    

    应该是:

    server_address = ('', 8000)
    

    【讨论】:

      猜你喜欢
      • 2015-08-17
      • 2014-01-21
      • 2017-11-22
      • 1970-01-01
      • 2022-01-02
      • 2019-02-24
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多