So senden Sie ein NSString über socket mit NSOutputStream
Muss ich schaffen, eine chat-app für iOS verwenden von socket-Programmierung und meine IP-Adresse ist 192.168.0.57:9300
.
Ich habe verwendet Raywenderlich
socket Programmierung Beispiel,empfangen von Daten funktioniert einwandfrei, aber das senden funktioniert nicht ,es gibt keine Fehler oder Absturz.
Mein code sind wie folgt.
code für die öffnung der Bäche
- (void) initNetworkCommunication {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.0.57", 9300, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
code zum senden der Daten
- (IBAction)sendMessage:(id)sender
{
NSString *response = @"lets start chat";
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
}
Delegierten
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
NSLog(@"stream event %i", streamEvent);
switch (streamEvent) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (theStream == inputStream) {
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(@"\nreciving data------%@,buffer);
[self messageReceived:output];
}
}
}
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"Can not connect to the host!");
break;
case NSStreamEventEndEncountered:
[theStream close];
[theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[theStream release];
theStream = nil;
break;
default:
NSLog(@"Unknown event");
}
}
Message sending
- (void) messageReceived:(NSString *)message {
[self.messages addObject:message];
[self.tView reloadData];
NSIndexPath *topIndexPath = [NSIndexPath indexPathForRow:messages.count-1
inSection:0];
[self.tView scrollToRowAtIndexPath:topIndexPath
atScrollPosition:UITableViewScrollPositionMiddle
animated:YES];
}
bitte geben Sie mir Ihren Vorschlag.
- Was meinst du mit "es zeigt die send-string"? Besitzt der receiver zeigen, dass es so ist? Was ist der Empfänger (welche Software, post-source-snippet, wenn möglich)? Wie verarbeiten Sie die empfangene Zeichenfolge?
- Ich habe anbei der gesamte code.server-code in php geschrieben sind
- Ich habe Ihre genauen code zum initialisieren einer Verbindung und senden von Netzwerk-traffic von einem iPhone auf meinem Mac. Die empfangende software ist in Objective C geschrieben und auch mit NSStreams. Alle übermittelten strings waren OK. Ich denke, dein problem könnte sein, auf der server-Seite (PHP). Haben Sie schon in der Lage zu überprüfen (mit anderen software zum senden von strings), die Ihre server-Teil funktioniert?
- Hi ich bin auch dabei, dies in android, Es ist in Ordnung, die in android mit der gleichen Php-server
- server-Seite verwenden phpwebsocket code, die heruntergeladen werden kann von hier aus code.google.com/p/php-websocket-server - code.google.com/p/php-websocket-server/wiki/Scripting
- Hast du einen Weg aus der es bin ich immer das : server gesagt: :{"type":"usermsg","name":null,"message":null,"Farbe":null}
- In meinem Fall-code nicht eingibt NSStreamEventHasBytesAvailable Abschnitt. Was könnte der Grund dafür sein?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie die "\n" am Ende deiner Antwort wie diese:
Diese Arbeit für mich, aber mein problem ist, dass ich nicht empfangen von Daten mit der Funktion
(void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
Hatte ich ähnliches problem. Habe es gelöst, indem eine neue Zeile und line-feed-Zeichen in der Zeichenkette.
Ich fand das schreiben einer separaten thread gelöst ist dieses Problem für mich.
Macht Sinn, wie sollte man nicht wirklich tun, Netzwerk-ops auf dem Haupt-thread.
Hier ist mein code:
Ein weiterer Punkt zu beachten ist, dass die NSStreamEventOpenCompleted Veranstaltung wird zweimal genannt. Einmal bei den einzelnen input-und output-streams geöffnet werden. So muss man vorsichtig sein, nicht zu schreiben auf den Ausgabe-stream vor der Veranstaltung.