Приложение IOS chatt, использующее Ruby TCPServer, может получать, но не отправлять сообщения. - PullRequest
0 голосов
/ 01 декабря 2011

Я пытаюсь создать простое приложение для чата для 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 Ответ

1 голос
/ 03 декабря 2011

Это был хоть чокнутый, но я думаю, что решил (методом проб и ошибок).Часть получения сообщения, кажется, работает, потому что метод put в Ruby автоматически добавляет новую строку в строки, что не относится к NSStrings.Это изменение заставило его работать:

NSString *response = [NSString stringWithFormat: @"%@\n", messageField.text];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...