pthon网络编程——网络模块socket

版本:python2.7.11
开发工具:Spyder

原理

本文设计TCP连接(面向连接的可靠传输协议):

socket面向连接传输原理

这里写图片描述

服务器根据地址类型(ipv4,ipv6)、socket类型、协议创建socket
服务器为socket绑定ip地址和端口号
服务器socket监听端口号请求,随时准备接收客户端发来的连接,这时候服务器的socket并没有被打开
客户端创建socket
客户端打开socket,根据服务器ip地址和端口号试图连接服务器socket
服务器socket接收到客户端socket请求,被动打开,开始接收客户端请求,直到客户端返回连接信息。这时候socket进入阻塞状态,所谓阻塞即accept()方法一直到客户端返回连接信息后才返回,开始接收下一个客户端谅解请求
客户端连接成功,向服务器发送连接状态信息
服务器accept方法返回,连接成功
客户端向socket写入信息
服务器读取信息
客户端关闭
服务器端关闭

应用

套接字,两端点程序间的信息通道。
源IP地址和目的IP地址、源端口号和目的端口号的组合称为套接字。

  • 客户机端:
    • 创建套接字(socket)
    • 连接套接字(connect)
    • 关闭套接字(close)
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM,0)

s.connect(('www.google.com', 80))

s.close()

error: [Errno 10060]

ping www.google.com,无法ping通,将代码改为www.baidu.com,可以运行。

import socket  
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  
sock.connect(("127.0.0.1", 8001))  
import time  
time.sleep(2)
while True:
    data=raw_input("input command:");
    sock.send(data)
    print sock.recv(1024)
    if data=="3":
       break
sock.close()
  • 服务器端:

    • 创建套接字(socket)
    • 绑定地址(bind)
    • 设置为监听状态(listen)
    • 接受客户端连接(accept)
    • 关闭连接(close)

accept会返回一个套接字,服务端会利用这个套接字与客户端进行联系。

import socket  
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#初始化socket 
sock.bind(("127.0.0.1", 8001))#绑定本机地址,8001端口
sock.listen(5)#等待客户连接,系统有5个空位可以放未决请求 
while True:
    print "waiting client connection..."
    connection,address = sock.accept()#接收客户连接请求
    print "a client have connected..."
    while True:
        try:  
            connection.settimeout(5)  #设置超时时间
            buf = connection.recv(1024) #接收数据
            if buf == "1":  
               connection.send("you have send me 1!welcome to server!")
            elif buf=="2":
                connection.send("you have send me 2!I have recv!")
            elif buf=="3":
                connection.send("close the connection!")
                break
            else:  
               connection.send("unknow command!")  
        except socket.timeout:  
            print "time out"  
    connection.close()
    print "a client exit..."

accept方法会阻塞,直到客户端被连接。
recv用于接收数据,当协议把数据接收完毕,recv函数就把sock的接收缓冲中的数据copy到buf中(注意协议接收到的数据可能大于buf的长度,所以在这种情况下要调用几次recv函数才能把s的接收缓冲中的数据copy完。recv函数仅仅是copy数据,真正的接收数据是协议来完成的)

将客户端第二个代码与服务器端代码同时打开运行。
源代码下载地址:http://download.csdn.net/detail/u012192235/9554285

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值