cocoaasyncsocket ライブラリに付属するエコー サーバーの例の修正版を使用して、次のことを実行しようとしています。
1) サーバーとして機能する Python スクリプトへの接続を開く
2) データを送信する // 機能するが、デリゲートは起動しない
3) データを受信する // デリゲートは起動しない
4) 切断する // 明らかに切断しないまだ私のスレッドに
現在、didFinishLaunchingWithOptions デリゲートで接続を開き、didConnectToHost デリゲートでデータを送信しようとしています。次に、クライアントから返されたデータを読み取ってから切断しようとします。
接続を開いてデータを送信することはできますが (サーバーが受信したことを確認します)、didWriteDataWithTag デリゲートは起動しません。ただし、サーバーはデータを受信します。次に、サーバーはいくつかのデータを起動しますが、didReadData も起動しません。
読み取り/書き込みデリゲートが起動しないという事実に加えて、コードを整理する方法が正しくないようですが、実行ループとは対照的に、イベント駆動型システムでこれがどのように見えるかはわかりません (I'イベント駆動型のもの + ネットワーキングの初心者です)。それぞれの完了がデリゲートによってトリガーされる一連のアクションがある場合、デリゲートは何らかのメッセージを共有する必要がありますか?つまり、「xxx」メッセージを受け取り、「yyy」と書き戻しますか? これらすべてを管理する 1 つの関数が必要です。これを行う標準的な方法はありますか?
IPhoneConnectTestAppDelegate.m (スニペット)
- (void)localConnect {
NSError *error = nil;
if (![asyncSocket connectToHost:@"localhost" onPort:5000 error:&error]) {
DDLogError(@"Error connecting: %@", error);
}
}
- (void)disconnect {
[asyncSocket setDelegate:nil];
[asyncSocket disconnect];
[asyncSocket release];
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Setup our socket (GCDAsyncSocket).
dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue];
[self localConnect];
// Add the view controller's view to the window and display.
[window addSubview:viewController.view];
[window makeKeyAndVisible];
}
- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
NSString *output = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"didReadData: %@", output);
}
- (void)onSocket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag {
NSLog(@"didWriteDataWithTag");
}
- (void)socket:(GCDAsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {
NSLog(@"socket:%p didConnectToHost:%@ port:%hu", sock, host, port);
if(port == 5000)
{
NSString *msg = @"q";
NSData *dataOut = [msg dataUsingEncoding:NSASCIIStringEncoding];
[asyncSocket writeData:dataOut withTimeout:-1 tag:0];
[asyncSocket readDataWithTimeout:-1 tag:0];
[self disconnect];
}
}
tcpserver.py
# TCP server example
import socket, time
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("", 5000))
server_socket.listen(5)
print "TCPServer Waiting for client on port 5000"
while 1:
client_socket, address = server_socket.accept()
print "I got a connection from ", address
while 1:
data = client_socket.recv(512)
print "Data from client",data
time.sleep(2)
data = "xxx"
print "Sending data to client",data
client_socket.send (data)
break;