开发一款客户端-服务器的iPhone应用程序。

5
如果我想开发一个具有客户端-服务器设计(以iPhone设备作为客户端和c#服务器)的iPhone应用程序,有两个问题:
  1. 是否可以使用我的笔记本电脑来运行服务器?如果不行,有什么选择?
  2. 我必须为传输消息开发自己的协议吗?
所以,如果我理解正确,从客户端向服务器发送消息(例如“创建新用户”)的过程如下:
1. 客户端将创建一个包含命令“CREATE NEW USER”和新用户详细信息的JSON/XML。
2. 客户端将通过HTTP请求(作为HTTP请求正文)发送此JSON/XML,其中URL映射到服务器侧的c#方法。
3. 这将触发服务器上的适当方法,并在数据库中创建新用户。
4. 服务器将创建包含回复“CREATED”的JSON/XML,并将其作为HTTP响应(作为HTTP响应正文)发送给客户端。
是否正确?

我看到你是新手 - 你也可以用箭头进行点赞。阅读Stack Overflow的常见问题解答真的很有帮助。它在你的别名旁边的菜单栏上。 - bryanmac
4个回答

3
你需要使用http协议的xml或json。Web服务和REST over http是为解决不同平台之间的互操作性问题而创建的,这正是你所面临的问题。
由于你正在使用C#作为服务器,因此可以研究WCF并使用REST模式或SOAP(Web服务)来公开你的操作和数据。关于数据,你可以将这些对象序列化为JSON或XML。
对于iPhone的消费,我建议使用REST(因为它基本上将url请求路径映射到C#方法)。从手机的角度来看,它只是一个url请求,然后返回xml或json数据。
在C#中,你只需创建你的方法并使用DataContract属性进行装饰。然后,在你的方法上将它们映射到url相对路径。搜索WCF和REST服务。你可以在任何主机上运行它,从命令行到Windows服务到IIS。

http://msdn.microsoft.com/en-us/library/bb412178.aspx

创建C#服务时,如果是REST,您可以在浏览器中发送请求并查看数据。 您还应该了解Fiddler以检查流量:http://www.fiddler2.com/fiddler2/ 在手机端,您首先需要发出http请求。 您可以使用iOS类来完成,但像ASIHTTPRequest这样的包装器可以使其更加容易。 一旦收到响应,您必须对其进行解析。 如果选择XML,则iOS类提供了简单的方法来解析xml响应。 如果选择JSON,则有像SBJSON这样的类。 http://allseeing-i.com/ASIHTTPRequest/ - (在使用前请阅读ASIHTTPRequest博客

https://github.com/stig/json-framework

在 iPhone 上使用 REST Web 服务

还有一个更高级的框架叫做 RESTKit,使 iPhone 端变得更加容易。

https://github.com/RestKit/RestKit

希望这可以为您提供帮助,将其联系起来。

编辑: 添加创建新用户场景:

客户端使用数据(用户名、密码等)创建用户对象,并将HTTP PUT请求发送到http://yourserver/myservice/users。客户端在主体中将用户对象序列化为JSON/XML。

REST PUT方法的推荐/有效请求有效负载是什么?

在REST中PUT与POST相比如何选取?

服务器接收请求。在服务器上,您有一个WCF“myservice”服务(它是一个类)。它具有“public User CreateUser(User user)”方法。在该方法中,它通过执行必须执行的操作(调用数据库等...)创建用户对象。它返回User对象,因为服务器可能添加了信息,如用户ID。下面的文章提供了一个PUT请求示例。

http://damianm.com/tech/building-a-rest-client-with-wcf/

客户端将收到响应,并且用户对象及其所有详细信息(如id等)将以JSON/XML格式出现在正文中。它会将其反序列化为手机上的User对象。
服务器还可以公开诸如: /User/{id} --> public User GetUser(string id);

谢谢您详细的回复。在阅读了您的回答后,我已经根据自己的理解编辑了我的问题,请问您能否对此做出回应?实际上,我想将它作为对您答案的评论来编写,但是它太长了……所以作为我的“Stack Overflow导师”,请问我编辑了我的问题是否可以?或者我应该将其拆分为两个较小的评论来添加到您的答案中? - Eyal
我会在我的回答中附上你的后续问题。 - bryanmac
哇,谢谢,这对我来说都是新的东西。我正在尝试理解所有这些与我熟悉的构建客户端-服务器应用程序的事物如何相互配合。在服务器端,我是否仍需要一个大的while(True)循环,并使用TCPClient.GetStream()从缓冲区读取HTTP请求?我需要检测一个HTTP请求何时结束并另一个开始吗? - Eyal
不需要 - WCF会为您处理这个问题。请参见第一个链接中的“托管自己的服务”部分:http://msdn.microsoft.com/zh-cn/library/bb412178.aspx - bryanmac
那么我该如何管理我的客户端呢?通常我会将已连接的客户端保存在某个数组中,这样我就可以检查客户端是否已连接,并将消息从一个客户端转发到另一个客户端。使用 WCF 是否有可能与已登录的客户端保持持久连接呢? - Eyal
如果你做类似于TCP服务器的东西,你可以保持连接的客户端 - http/rest的典型模式是客户端连接,发出请求,获取数据,然后完成。这是一种适用于无状态服务器的http请求/响应模式,可以很好地扩展。 - bryanmac

2
我强烈建议您依赖HTTP协议。不要自己实现网络协议!
使用GET请求从服务器获取数据,使用POST请求将大量数据从客户端发送到服务器。
为了结构化数据,请使用JSON编码数据。 以下是一个很好的教程,介绍了如何使用ASIHTTPRequest和JSONKit进行编码:http://www.icodeblog.com/2011/09/30/dynamically-controlling-your-application-from-the-web/ 是的,您可以在工作机器上运行服务器。

1

你可以使用ASIHTTPRequest轻松实现此功能。它是一个免费的第三方解决方案,可以与不同类型的Web服务进行通信。

ASIHTTPRequest网站


感谢您的回复,我看到它正在使用HTTP协议,但是HTTP协议是用于传输网页和与Web服务器一起工作的,对吗?我的服务器不使用网页,我需要一种从客户端向服务器发送命令的方法,例如:客户端向服务器发送“创建新用户”命令,然后服务器在数据库上创建用户并向客户端返回答案。您的意思是我需要将“创建新用户”命令放在HTTP消息体中吗? - Eyal
你可以将这些消息作为GET或POST请求发送。 - Jeff Wolski
ASIHTTPRequest已经不再是最佳解决方案,正如其开发者在这篇博客文章中所说http://allseeing-i.com/[request_release]。 - Paul.s

1

我不确定这是否回答了你的问题,但是作为建议,为了避免处理过多的服务器端内容,可以使用Parse


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接