zoukankan      html  css  js  c++  java
  • python中的socket模块

    熟悉了一下python的socket模块,感觉还是有点好玩的,不过坑也也是不少的。

    1、服务器端代码

    #!/usr/bin/env python
    
    import socket
    
    HOST='192.168.1.60'
    PORT=55555
    
    s = socket.socket()
    s.bind((HOST,PORT))
    s.listen(10)
    while True:
        conn,addres = s.accept()
        conn.send('HELLO')
        while True:
            data = conn.recv(1024)
            print data,addres
            if data =='exit':
                print 'byebye'
                break
            if not data.strip():
                continue
            flag = True
            while flag:
                info = raw_input('Answer:>>')
                if info.strip():
                    flag=False
            conn.sendall(' %s' % info)
        conn.close()

    主要是创建一个服务端,在创建服务端的时候,主要步骤如下:

    创建socket对象socket——》绑定IP地址和端口bind——》监听listen——》得到请求accept——》接收请求recv——》发送信息send——》关闭close

    2、 客户端代码

    #!/usr/bin/env python
    import socket
    
    HOST='192.168.1.60'
    PORT=55555
    
    s = socket.socket()
    s.connect((HOST,PORT))
    while True:
        data = s.recv(1024)
        if  data.strip():
            print 'Replay is ',data
            flag = True
            while flag:
                kel = raw_input('Question :>>')
                print 'raw_input values : %r' % kel
                if kel.strip():
                    flag=False
            s.sendall(kel)
            if kel == 'exit':
                break
    s.close()

    客户端代码就是连接服务器,接收和发送消息,具体流程如下:

    创建socket对象socket——》connet连接服务器——》获取消息recv——》发送消息send——关闭close

    3、 基本方法描述

    在使用socket模块的时候,创建对象一般是使用如下的代码:

    s = socket.socket()

    在使用默认值的时候,表示创建的是TCP 的socket,地址家族表示为socket.AF_INET,socket类型默认值为socket.SOCK_STREAM表示为TCP的,而UDP的为socket.SOCK_DGRAM,表示为数据包


    绑定的代码如下:

    s.bind((IP,port))
    注意在绑定的时候,参数只有一个表示为元组tuple,其中第一个元素为ip地址或者是hostname,第二个参数为port端口号,也就是开始监听哪个IP地址的哪个端口


    监听的代码如下:

    s.listen(5)
    其中的参数为整数,5表示阻塞五个连接,实际上,,经过测试,十几个都没问题,主要是阻塞式的,当有一个连接上的时候,那么其他的都不会连接上,只有在第一个推出的时候,其他的才能进行连接,开始还以为是可以同时连接五个,然后测试下,发现不行,无论是同一个服务器上还是不同的机器上,是不能同时进行连接的,也就是所谓的阻塞式。


    被动接受请求的代码如下:

    conn,addres = s.accept()
    返回的是一个元组,也就是在接受客户端的连接,返回的第一个元素是一个socket对象,可以认为是客户端的socket对象,address表示为客户端的地址,其实这个也就使用和客户端进行通信的。

    客户端连接服务器端的代码如下:

    s.connect((ip,port))
    参数为服务器的IP地址和服务器监听的端口。


    发送消息的代码如下:

    conn.send('string is send')
    conn.sendall('send')
    l两个都是用来发送消息的,区别就是sendall尽量一次发送,而send的话主要看接收能力,如果超出范围的话,那么会进行发送两次进行发送


    接收消息的代码如下:

    conn.recv(1024)

    主要方法是recv方法表示接收消息,最多接收的字节数为1024,那么多余的字符将会在下次接收的过程中进行接收。


    4、运行客服端和服务端

    在运行客户端和服务端代码之后,发现是可以交互的,也就是客户端和服务端进行说话,就想其他的一些交流软件一样,注意,在上述的代码中还存在一些bug,并不是指异常处理


    在上述的代码中,主要的思路就是如果客户端输入为空,那么会一直输入,除非输入exit,那么退出,输入了字符之后,才会发送到服务端

    如果服务端回复为空,那么会要求服务端一直输入,输入字符后发送给客户端,如果客户端退出,那么断开连接,继续监听。






  • 相关阅读:
    Kostya the Sculptor
    Parade
    zoj 1097 普吕弗序列
    API分析——Jquery UI Dialog
    伸缩性和可用性反模式(转)
    可伸缩性最佳实战(转)
    二叉索引树BIT
    RMQ
    线段树(区间树)
    双栈计算算术表达式
  • 原文地址:https://www.cnblogs.com/kellyseeme/p/5525026.html
Copyright © 2011-2022 走看看