我为客户端服务器编程进行了以下编程,但它无法正常工作。服务器无法接收连接setup.plz帮助的请求。
#import "clientserverprogramViewController.h"
#import "secondview.h"
#import <CoreFoundation/CFSocket.h>
#include <sys/socket.h>
#include <netinet/in.h>
NSInputStream *iStream;
NSOutputStream *oStream;
@implementation clientserverprogramViewController
@synthesize name,filepath,display;
-(IBAction) print {
NSString *urlStr = serverIP;]
[display setText : urlStr];
if (![urlStr isEqualToString:@""]) {
NSURL *website = [NSURL URLWithString:urlStr];
if (!website) {
NSLog(@"%@ is not a valid URL");
return;
}
NSHost *host = [NSHost hostWithName:[website host]];
[NSStream getStreamsToHost:host port:3000 inputStream:&iStream outputStream:&oStream];
[iStream retain];
[oStream retain];
[iStream setDelegate:self];
[oStream setDelegate:self];
[iStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream scheduleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
[oStream open];
}
}
-(IBAction) settings {
[self presentModalViewController:nextview animated: YES];
}
-(IBAction) cancel {
exit(0);
}
- (void)dealloc {
[super dealloc];
}
@end
答案 0 :(得分:2)
您只能打开流,不会对它们执行任何操作。这就像拿起电话而不拨号码。使用NSStreamDelegate
协议实现数据传输代码。
<强>更新强>:
您可以使用以下行来设置流的代理:
[iStream setDelegate:self];
[oStream setDelegate:self];
现在实现在您自己的类中NSStreamDelegate
协议中定义的方法(AFAIK - 只有其中一个)。了解如何从那里接收/发送数据。
答案 1 :(得分:1)
您是否有使用流的特定原因?
使用NSURLConnection怎么样?这是我的一个项目的一段代码。两者都在KANetworkManager中。 KANetworkTransactionType只是一个枚举,可以帮助我了解如何解析响应。
+ (void) createAndStartUrlConnection:(NSMutableURLRequest *)request type:(KANetworkTransactionType)type target:(id)target callback:(SEL)callback;
{
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
NSDictionary *requestDict = [NSDictionary dictionaryWithObjectsAndKeys:request, @"request", [NSNumber numberWithInt:type], @"type", target, @"target", [NSValue valueWithPointer:callback], @"callback", nil];
[KANetworkManager performSelectorInBackground:@selector(makeNetworkCall:) withObject:requestDict];
}
我能够进行同步网络调用,因为我总是在自己的线程上调用此方法。这是一种在不处理委托的情况下实现异步网络通信的简单方法(尽管委托方法提供了一些好处)。您的parseResponse方法需要特定于您发回的任何Web服务。 parseResponse会通知回调方法。如果您对此有其他疑问,请与我们联系。
+ (void) makeNetworkCall:(NSDictionary *)params
{
// We assume this method won't be called from the main thread, so we need our own NSAutoreleasePool.
NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];
NSMutableURLRequest *request = [params objectForKey:@"request"];
KANetworkTransactionType type = [(NSNumber *)[params objectForKey:@"type"] intValue];
id target = [params objectForKey:@"target"];
SEL callback = (SEL)[[params objectForKey:@"callback"] pointerValue];
NSURLResponse *response;
NSError *err;
// We make a synchronous request assuming we're on a background thread.
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
if (data.length > 0)
{
[self parseResponse:data type:type target:target callback:callback];
}
else
{
NSLog(@"Error occured during network call. %@", err);
}
[autoreleasePool drain];
}
答案 2 :(得分:0)
JB gate,
在您的代码中,您通知iStream和oStream,您的clientserverprogramViewController对象将成为每个对象的委托。但是,适当的代表需要实际实施。您的类需要实现此方法:
– stream:handleEvent:
详细信息请记录在这里:
此外,您的代码无法在真正的iPhone上运行。有一个更新的Core Foundation API用于创建套接字对details here。
<强>更新强>
只是想知道这不是软件问题,但服务器可能是在防火墙后面。请详细说明服务器是什么,即webserver,netcat或简单的TCP套接字等。
彼得