初试python网络通信

Python网络通信

网络通信你怕不怕,相当厉害的技能!今天从《Python标准库》第5章直接跳到了第11章——网络通信。
然后实现了TCP/IP客户和服务器,以及UDP客户和服务器实现。网络部分之前有所了解,但是不够深入。应用层几个最具代表性的协议了解一下,不过年代久远,而且当时没有动手实践。今天最终实现了,也算是亡羊补牢?来记录下今天实现的东西

TCP/IP

基于socket库实现。
书上代码如下

import socket
import sys
#Create a TCP/IP socket
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server_name = sys.argv[1]
server_address = (server_name,10002)
print  >>sys.stderr,'starting up on %s port %s '%server_address
sock.bind(server_address)
sock.listen(1)
while True:
    print >>sys.stderr,'waiting for a connection'
    connection,client_address = sock.accept()
    try:
        print >>sys.stderr,'connection from',client_address
        while True:
            data = connection.recv(16)
            print  >>sys.stderr,'received "%s" ' % data
            if data:
                print >>sys.stderr,'sending data back to the client'
                connection.sendall(data)
            else:
                print >>sys.stderr,'no data from',client_address
                break

    finally:
        connection.close()

这是服务器的,主体思想是先建立一个socket,然后绑定一个端口,然后监听。非常清楚,感谢之前各位已经造好轮子的dalao们。
顺便说下,书上所用端口是10000,我改成了10002,原因是会报错,socket error 10048 查了一下发现应该是端口被用了,所以改了
然后下面是客户的示例:

import socket
import sys
def get_constans(prefix):
    """Create a dictionary mapping socket module
    constants to their name
    """
    return  dict((getattr(socket,n),n)
                  for n in dir(socket)
                 if n.startswith(prefix)
                 )
families = get_constans('AF_')
types = get_constans('SOCK_')
protocols = get_constans('IPPROTO_')
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_address = (sys.argv[1],10002)
sock.connect(server_address)
try:
    message = 'Oh here is my first try to make a server and client.It is so cooooooooooool'
    sock.send(message)
    amount_received = 0
    amount_expected = len(message)

    while amount_received<amount_expected:
        data = sock.recv(16)
        amount_expected += len(data)
        print >>sys.stderr,' received "%s"  '%data

这样就实现了一个TCP/IP的客户和服务器。这个两个需要cmd运行,并且提供一个地址。我用的是自己的IP地址,当然好多细节还是需要日后去了解。我的一小步,日后的一大步。
下面是udp的了。

UDP

udp和tcp/ip 在服务器上的差异在于
sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
上面的是udp,下面是tcp
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
好像tcp和udp关于报文的长短格式也是有差异。
这些以后复习了再记录吧。

客户端的差异,从模型而言。tcp连接需要三次握手,udp不要。
所以tcp的客服端连接为
server_address = (sys.argv[1],10002)
sock.connect(server_address)

udp直接
send to 就可以了.
sent = sock.sendto(message,server_address)

接收方面,一个是recv()此乃tcp的,一个是recvfrom(),此乃udp的

差不多就是这些东西了。

还要点问题是关于书中所讲的 IP地址表示 一节
我还是没有猜出来
inet_ntoainet_aton中的a和n分别是什么
还得找人问下。
现在4.30还可以继续看下去。有趣有趣!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值