nfl*_*cco 4 cocoa tcp objective-c asyncsocket
我正在尝试使用cocoaasyncsocket库附带的echo服务器示例的修改版本执行以下操作:
1)打开与作为服务器的python脚本的连接
2)发送数据//工作,但委托不激活
3)接收数据//委托不激活
4)断开//不断开,显然还在我的帖子里
目前,我在didFinishLaunchingWithOptions委托中打开一个连接,然后尝试在didConnectToHost委托中发送数据.然后,我尝试读取从客户端返回的数据,然后断开连接.
我能够打开一个连接并发送数据(服务器验证为收到),但didWriteDataWithTag委托永远不会触发.但是,服务器接收数据.然后服务器会激活一些数据,但didReadData也不会触发.
除了读/写代理没有触发的事实,似乎我组织我的代码的方式不对,但我不确定这在事件驱动的系统中看起来如何与运行循环相反(我'在事件驱动的东西+网络新手.如果我的一系列行动的各自的完成是由他们的代表触发的,那么代表们是否应该分享某种消息 - 即我们收到了"xxx"消息,请回写"yyy"?我更喜欢有一个功能来管理所有这些.这样做有规范的方法吗?
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];
}
}
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
我知道这是一个已经被接受的答案的旧问题,但为了澄清那些发现这个线程寻找某事的人,委托方法没有被调用的原因是因为GCDAsynchSocket以socket:而不是onsocket:ie 开头:
- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
变为:
- (void) socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
Run Code Online (Sandbox Code Playgroud)