2017-06-05 136 views
1

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

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

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") 

    } 
} 

}

迅速客户端的说明:

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

Python的socket服务器代码:

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() 

蟒蛇插槽服务器的说明:

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

回答

0

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

此:

server_address = ('localhost', 8000) 

不该得到:

server_address = ('', 8000)