私が作っている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を使用してそのアイデアをデータベースから取得します。それから、そのアイデアがクライアントに送信されます。