我正在尝试为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客户端上收到消息但是当我尝试发送消息时没有任何反应。客户端目前看起来像这样:
答案 0 :(得分:1)
这是一个破解的坚果,但我认为我解决了它(试错法)。消息接收部分似乎有效,因为Ruby的puts方法会自动为字符串添加换行符,而NSStrings则不然。这一改变使其发挥作用:
NSString *response = [NSString stringWithFormat: @"%@\n", messageField.text];