2011-08-12 40 views
9

Tôi đã xây dựng một chương trình khá đơn giản để theo dõi một thư mục, thao tác các tệp khi chúng được thêm vào và cung cấp một cái nhìn tiến độ đơn giản về những gì đang diễn ra. Thư mục được xem qua một lớp con của NSOperation để chuyển thông tin trong một NSDictionary tới khung nhìn tiến trình của tôi, thông qua NSNotificationCenter.Xây dựng ứng dụng Máy chủ/Khách hàng trong Cocoa

Bây giờ tôi cần chia nhỏ mọi thứ và chạy phần thư mục/xử lý đã xem trên máy chủ của tôi và xây dựng ứng dụng khách để giám sát tiến trình từ nhiều máy trạm. Vấn đề của tôi là tôi không biết làm thế nào để thực hiện điều này và tìm kiếm của tôi không thực sự giúp tôi.

Có vẻ như tôi đang nhận được rất nhiều giải pháp ngày tháng (WebObjects, Đối tượng phân phối di động) hoặc thông tin không đầy đủ. Có vẻ như tôi muốn sử dụng NSStream để truyền dữ liệu qua lại, nhưng mọi thứ tôi tìm thấy trên NSStream có vẻ như nó được thiết lập cho phía máy khách bởi vì nó tìm kiếm một địa chỉ IP. Điều gì sẽ là cách tốt nhất để đi về việc thiết lập cả một máy chủ, và một khách hàng để kết nối với nó?

Trả lời

6

Tôi khuyên bạn nên sử dụng TCP cho mục đích tương tự. Kể từ khi (tôi giả sử) bạn đang viết phần mềm này cho BSD (Mac OS X và iPhone là cả BSD), bạn có thể sử dụng ổ cắm BSD C, hoặc một wrapper Objective-C cho việc này. Một thư viện tốt cho khách hàng là CocoaAsyncSocket. Cá nhân tôi đã viết một lớp socket Objective-C nhẹ cho mạng TCP được gọi là SocketKit. Cách sử dụng của thư viện này là một cái gì đó như sau:

// open a connection 
SKTCPSocket * socket = [[SKTCPSocket alloc] initWithRemoteHost:@"SERVER_IP" port:SERVER_PORT]; 
// write data 
[socket writeData:someData]; 
// read data 
NSData * someData = [socket readData:4]; 
// close the socket 
[socket close]; 
[socket release]; 

Từ một quan điểm máy chủ, bạn có thể nghe trên một cổng bằng cách sử dụng lớp SKTCPSocketServer:

SKTCPSocket * aSocket = nil; 
SKTCPSocketServer * server = [[SKTCPSocketServer alloc] initListeningOnPort:1337]; 
@try { 
    [server listen]; 
    while ((aSocket = (SKTCPSocket *)[server acceptConnection]) != nil) { 
     // do something with aSocket 
     [aSocket close]; 
    } 
} @catch (NSException * e) { 
    NSLog(@"Exception : %@", e); 
} 
[server stopServer]; 
[server release]; 

Tất nhiên sử dụng socket TCP có nghĩa là văn bản giao thức mạng riêng của bạn . Một ví dụ đơn giản sẽ gửi một trường độ dài bốn byte, tiếp theo là dữ liệu của một NSDictionary hoặc một cái gì đó của bản chất đó. Điều này có thể cho phép bạn thực hiện một cái gì đó tương tự như một hệ thống đối tượng phân tán rất cơ bản.

+0

Không có nghĩa là để câu hỏi này chết trong vài ngày qua. Vừa bận rộn và chưa trở lại dự án này. Cảm ơn cho các thông tin tôi sẽ xem xét cả CocoaAsyncSocket và SocketKit nó có vẻ như đây là những gì tôi đang tìm kiếm. – Kris

+0

CocoaAsyncSocket hóa ra là những gì tôi cần. Tôi đang gặp vấn đề khi nhận dữ liệu để ghi vào ổ cắm được kết nối khi sự kiện xảy ra ... Nhưng hiện tại tôi đang đọc một kết nối ban đầu vì vậy tôi chắc chắn có điều gì đó tôi đã bỏ sót trong tài liệu. Cảm ơn một lần nữa! – Kris

4

Tại sao không xem xét Bonjour cho mạng không cấu hình (tức là bạn không phải tìm địa chỉ IP của máy chủ)?

Vì Bonjour cũng được hỗ trợ trên Windows và iOS (iPhone/iPad), bạn thậm chí có thể làm cho ứng dụng đa nền tảng (ví dụ: máy chủ trên máy khách Windows và Mac hoặc ngược lại) hoặc thậm chí có một hành động iPhone như một khách hàng của bạn máy chủ (không biết nếu điều này có ý nghĩa trong trường hợp của bạn nhưng tôi chỉ đề xuất).

0

Điều này, thật không may, là nơi Cocoa khá yếu. Quên về WebObjects (Apple có). Bạn có lẽ nên quên về các đối tượng phân tán. Không có giải pháp máy khách/máy chủ tích hợp trên máy Mac. iOS có một số công cụ ngang hàng ngang hàng, nhưng nó vẫn khá vô dụng đối với khách hàng/máy chủ.

Đề xuất của tôi là sử dụng API REST đơn giản. Xây dựng máy chủ của bạn với cocoahttpserver. Xây dựng ứng dụng khách của bạn với NSURLConnection hoặc ASIHTTPRequest. Giữ nó đơn giản. Tôi thích JSON cho giao thức. YAJL đã làm việc tốt cho tôi, nhưng đối với một cái gì đó thực sự đơn giản, có rất nhiều lựa chọn.

Các vấn đề liên quan