使用Ruby TCPServer的IOS聊天应用程序,可以接收但不能发送消息。

时间:2011-12-01 12:57:40

标签: objective-c ruby ios

我正在尝试为iOS创建一个简单的聊天应用程序。它适用于接收消息,但不适用于发送消息。我使用Ruby和TCPServer作为聊天服务器(截至:twgr),它看起来像这样:

require 'socket'                                   

server = TCPServer.new("localhost", 80)             
chatters = []

def welcome(chatter)                               
  chatter.puts "Welcome Chatter!"
end

def broadcast(message, chatters)                   
  chatters.each do |chatter|
    chatter.puts message
  end
end

while (chatter = server.accept)                         
  Thread.new(chatter) do |c|
    welcome(chatter)                        
    chatters << chatter                            
    begin                                            
      loop do
        line = c.readline                            
        broadcast("#{line}", chatters)       
      end
    rescue EOFError                                  
      c.close
      chatters.delete(c)                             
      broadcast("Chatter has left", chatters)
    end
  end
end 

服务器似乎工作正常,因为我可以在两个本地telnet连接之间发送消息。我认为问题是我的iOS客户端。我用于发送/接收消息的代码如下所示(截至:http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server):

- (void)messageReceived:(NSString *)message 
{
    [messages insertObject:message atIndex:0];

    NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    [self.tableView beginUpdates];
    [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]  
    withRowAnimation:UITableViewRowAnimationTop];
    [self.tableView endUpdates];
}

/*
 Method for creating messages. 
 New messages are added above older messages.
 It gets called when the user hits the "Send" button.
 */
- (IBAction)sendMessage:(id)sender {
    NSString *response  = [NSString stringWithFormat:messageField.text];
    NSData *data = [[NSData alloc] initWithData:[response  
    dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
    messageField.text = @"";
}

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {    
    switch (streamEvent) {
        case NSStreamEventHasBytesAvailable:

            if (theStream == inputStream) {

                // This NSLog message dosn't get called when I want to send messages from 
                // my iOS client.
                NSLog(@"Hello");  
                uint8_t buffer[1024];
                int len;

                while ([inputStream hasBytesAvailable]) {
                    len = [inputStream read:buffer maxLength:sizeof(buffer)];
                    if (len > 0) {

                        NSString *output = [[NSString alloc] initWithBytes:buffer 
                        length:len 
                        encoding:NSASCIIStringEncoding];                        
                        if (nil != output) {
                            NSLog(@"server said: %@", output);
                            [self messageReceived:output];
                        }
                    }
                }
            }
        break;        
        case NSStreamEventEndEncountered:
            [theStream close];
            [theStream removeFromRunLoop:[NSRunLoop currentRunLoop]  
            forMode:NSDefaultRunLoopMode];
        break;
    }
}

当我发送消息时,我可以在iOS客户端上收到消息但是当我尝试发送消息时没有任何反应。客户端目前看起来像这样:

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一个破解的坚果,但我认为我解决了它(试错法)。消息接收部分似乎有效,因为Ruby的puts方法会自动为字符串添加换行符,而NSStrings则不然。这一改变使其发挥作用:

NSString *response = [NSString stringWithFormat: @"%@\n", messageField.text];