2017-06-05 2 views
1

私が作っているiOSアプリケーションでは、Pythonソケットサーバーに接続する必要があります。 iOSアプリケーションの場合Swift 3を使用していて、私はBlueSocketを使用しています。正しいIPとポートでサーバーに接続しようとすると、常にConnection Refusedが返され、サーバーに接続が表示されません。 BlueSocketはTCP Clientに設定されており、pythonサーバーもTCPサーバーなので、なぜ動作しないのか混乱します。BlueSocket say Pythonソケットソケットに接続すると拒否されました

サーバーに接続しない理由を誰かが知っている/理解していますか?迅速なクライアントの

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

    } 
} 

}

説明:ボタンがアイデアを生成するために、クリックされたとき

、アプリが最初にするかどうかをチェック

iOSのSWIFTコードはこれですインターネットに接続することができれば、設定されたインターネットネットワーク上でSSIDをチェックすることで確認できます(サーバーはLANサーバーになるため、設定されたネットワーク上でのみ動作します)。インターネットに接続するか、適切なネットワークに接続していない場合は、アプリに保存されているアイデアの量は限られています。適切なインターネットネットワーク上でインターネットに接続できれば、サーバーに接続してサーバーからアイデアを得ようとします。

のpythonソケットサーバコード: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() 

説明:サーバーはクライアントを取得

は、それがコマンドを取得するために待機します。このサーバーには、1つのコマンドしかありません。これはアイデアを得ることです。そのコマンドは "01"です。そのコマンドを取得すると、データベースに格納されているアイデアの量が取得されます。これはmaxID.txtファイルに書き込まれ、読み込まれます。その後、無作為にアイデアIDをランダムに選択し、IDを使用してそのアイデアをデータベースから取得します。それから、そのアイデアがクライアントに送信されます。

答えて

0

問題はPythonサーバー上にありました。問題は、ホストを空白のままにするのではなく、localhostに設定したことです。

この:

server_address = ('localhost', 8000) 

がしてきたはずです。

server_address = ('', 8000) 
関連する問題