【问题标题】:iphone :client-server communication not occuringiphone:客户端-服务器通信未发生
【发布时间】:2011-05-31 06:44:56
【问题描述】:

我为客户端服务器编程进行了以下编程,但它不起作用。服务器无法接收连接设置请求。请帮助。

#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

【问题讨论】:

  • 朋友,这是你的第 25 个问题..你应该学习如何格式化你的问题..
  • ....什么有效,什么无效,什么错误信息,等等,等等,等等,.....

标签: iphone client-server communication


【解决方案1】:

您只打开流而不对它们执行任何操作。这就像拿起电话而不拨号码一样。使用NSStreamDelegate协议实现数据传输代码。

更新

你有这些为流设置代理的行:

[iStream setDelegate:self];
[oStream setDelegate:self];

现在在您自己的类中实现NSStreamDelegate 协议中定义的方法(AFAIK - 只有其中一个)。了解如何从那里接收/发送数据。

【讨论】:

  • @eimantas 如何使用 nsstreamdelegate 以及在哪里使用它。我是一个初学者,知识不多,你能不能给我推荐一本关于 Objective C 中的套接字编程的书,其中给出了编程和示例
  • 如果您是 Objective C 和 cocoa 的新手,我建议您学习其设计模式,而不是直接跳入网络编程等复杂主题。委托是可可中最常用的设计模式之一。如果您只是尝试使用 google,我相信您会找到一些示例。
  • @ Eimantas 是上面给出的能够与服务器建立套接字连接的程序。
  • 很难说。我不知道你想达到什么目的。
【解决方案2】:

您使用流媒体是否有特定原因?

使用 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];
}

【讨论】:

    【解决方案3】:

    JB 大门,

    在您的代码中,您通知 iStream 和 oStream 您的 clientserverprogramViewController 对象将成为每个对象的委托。然而,一个合适的委托需要实际的实现。你的类需要实现这个方法:

    – stream:handleEvent:

    详细信息记录在这里:

    此外,您的代码将无法在真正的 iPhone 上运行。有一个更新的 Core Foundation API 用于创建套接字对,details here

    更新

    只是想知道这是否不是软件问题,但可能是服务器位于防火墙后面。请详细说明服务器是什么,即 webserver、netcat 或简单的 TCP 套接字等。

    彼得

    【讨论】:

    • @Junior Bill Gates 806116 描述了如何使用CFStreamCreatePairWithSocketToHost 而不是getStreamsToHost
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2012-12-26
    • 2011-09-05
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多