资源描述:
《从服务器获取数据》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Socket编程file:///E:/SVN/gook/reBook/Programming_Erlang_En/chp...Socket编程译者:gashero日期:2008-02-11目录1使用TCP1.1从服务器获取数据1.2一个简单的TCP服务器1.3改进服务器1.4序列服务器1.5并行服务器2控制问题2.1主动消息获取(非阻塞)2.2被动消息获取(阻塞)2.3混合消息获取(部分阻塞)3连接从哪里来?4Socket的错误处理5UDP5.1简单的UDP服务器和客户端5.2一个UDP阶乘服务器5.3UDP的附加注释6向多台计算机广播7一个SHOUT广播服务器7.1SHO
2、UTcast协议7.2SHOUTcast服务器如何工作7.3SHOUTcast服务器伪码7.4运行SHOUTcast服务器7.5构造播放列表7.6启动SHOUTcast服务器7.7测试服务器8深入挖掘大多数我写的更有趣的程序都包含了Socket。一个Socket是一个允许机器与Internet上另一端使用IP通信的端点。本章关注Internet上两种核心网络协议:TCP和UDP。UDP允许应用发送简短报文(叫做数据报datagram)到另一端,但是对报文没有交付的担保。并且可能在到达时有错误的顺序。而TCP则提供了可靠的字节流,并且确保在连接后传输数据的顺序也是对的。第1页
3、共20页2008-5-919:17Socket编程file:///E:/SVN/gook/reBook/Programming_Erlang_En/chp...为什么Socket编程很有趣呢?因为它允许应用于其他Internet上的机器通信,而这些比本地操作更有潜力。有两种主要的库用于Socket编程:gen_tcp用于TCP编程、gen_udp用于UDP编程。在本章,我们看看如果使用TCP和UDPsocket编写客户端和服务器。我们将会尝试多种形式的服务器(并行、串行、阻塞、非阻塞)并且看看通信接口应用如何将数据流传递给其他应用。1使用TCP我们学习Socket编程的历险
4、从一个从服务器获取TCP数据的程序开始。然后我们会写一个简单的串行TCP服务器展示如何并行的处理多个并发会话。1.1从服务器获取数据我们先写一个小函数(标准库的http:request(Url)实现相同的功能,但是这里是演示TCP的)来看看TCPsocket编程获取http://www.google.com的HTML页面:nano_get_url()->nano_get_url("www.google.com").nano_get_url(Host)->{ok,Socket}=gen_tcp:connect(Host,80,[binary,{packet,0}]),ok=g
5、en_tcp:send(Socket,"GET/HTTP/1.0rr"),receive_data(Socket,[]).receive_data(Socket,SoFar)->receive{tcp,Socket,Bin}->receive_data(Socket,[Bin
6、SoFar]);{tcp_closed,Socket}->list_to_binary(reverse(SoFar))end.它如何工作呢?1.我们通过gen_tcp:connect在http://www.google.com打开TCP协议80端口。connect的参数binary告知系统
7、以binary模式打开socket,并且以二进制方式传递数据到应用。{packet,0}意味着无需遵守特定格式即可将数据传递到应用。2.我们调用gen_tcp:send并发送消息GET/HTTP/1.0rr到socket。然后我们等待响应。响应并不会一次性得到,而是分片的、分时间的。这些分片是按照一系列报文的方式接收的,并且通过打开的socket发送到进程。3.我们接收一个{tcp,Socket,Bin}报文。第三个参数是binary。这是因为我们已经使用二进制方式打开了socket。这是从WEB服务器发到我们的一个消息报文。我们把这个报文加到分片列表并等待下一
8、个报文。4.我们接收到{tcp_closed,Socket}报文,这在服务器发送完所有数据时发生(这仅在HTTP/1.0时正确,现在版本的HTTP使用另外一种结束策略)。第2页共20页2008-5-919:17Socket编程file:///E:/SVN/gook/reBook/Programming_Erlang_En/chp...5.当我们收到了所有的分片,存储顺序是错误的,所以我们重新对分片排序和连接。我们看看他如何工作:1>B=socket_examples:nano_get_url().<<"HTTP/1