[英]GCDAsyncSocket server receive data only first time
Client sent message every time when I press send button but Server receive message only first time. 每次按下发送按钮但客户端第一次收到消息时,客户端都会发送消息。 What is the issue in server
服务器有什么问题
Server: 服务器:
- (void)viewDidLoad
{
[super viewDidLoad];
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *err = nil;
if (![asyncSocket acceptOnPort:10000 error:&err]){
NSLog(@"Error in acceptOnPort:error: -> %@", err);
}
}
- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
NSLog(@"Accepted new socket from %@:%hu", [newSocket connectedHost], [newSocket connectedPort]);
self.asyncSocket = newSocket;
NSString *welcomMessage = @"Hello from the server\r\n";
[self.asyncSocket writeData:[welcomMessage dataUsingEncoding:NSUTF8StringEncoding] withTimeout:-1 tag:1];
[self.asyncSocket readDataWithTimeout:-1 tag:0];
}
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag{
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"MSG: %@",msg);
}
Client: 客户:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
socket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
[socket setDelegate:self];
}
-(IBAction)connectToServer {
NSError *err = nil;
if (![socket connectToHost:self.txtIp.text onPort:10000 error:&err]) // Asynchronous!
{
// If there was an error, it's likely something like "already connected" or "no delegate set"
NSLog(@"I goofed: %@", err);
return;
}
}
- (void)socket:(GCDAsyncSocket *)sender didConnectToHost:(NSString *)host port:(UInt16)port
{
NSLog(@"Cool, I'm connected! That was easy.");
[socket readDataWithTimeout:-1 tag:0];
}
- (void)socket:(GCDAsyncSocket *)sock didWriteDataWithTag:(long)tag
{
if (tag == 1)
NSLog(@"First request sent");
else if (tag == 2)
NSLog(@"Second request sent");
}
- (void)socket:(GCDAsyncSocket *)sender didReadData:(NSData *)data withTag:(long)tag
{
NSLog(@"Received Data: %@",data);
}
-(void)sendMessage {
NSData *msg = [self.txtMsg.text dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Data Send: %@",msg);
[socket writeData:msg withTimeout:-1 tag:1];
}
You have to make a read call from your server class in didReadData: delegate. 您必须在didReadData: delegate中从服务器类进行读取调用。 Rest is fine.
休息很好。 Use below code.
使用以下代码。
-(void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {
[sock readDataWithTimeout:-1 tag:0];
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"MSG: %@",msg);
}
so after struggling with this for a bit, I came up with the following pattern for digesting data. 所以经过一段时间的努力,我想出了以下消化数据的模式。 Though the below is an over simplification, it is easily ported to different tasks:
虽然以下是过度简化,但它很容易移植到不同的任务:
Somewhat Swift Solution
var dataCache = Data()
func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
sock.readData(withTimeout: -1, tag: 0)
}
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
dataCache.append(data)
sock.readData(withTimeout: -1, tag: 0)
}
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
print("Closed with error: \(err)")
processData()
}
func socketDidCloseReadStream(_ sock: GCDAsyncSocket) {
print("Closed successfully")
processData()
}
func processData() {
// Do something with dataCache eg print it out:
print("The following read payload:\(String(data:dataCache, encoding: .utf8) ?? "Read data invalid")")
dataCache = Data()
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.