zoukankan      html  css  js  c++  java
  • socket本地模拟TCP 服务器+客户端(二)

    建立两个py文件,分别打开两个cmd界面,即可进行通信。服务器端运用多进程,连续不断的处理从客户端接收到的数据;客户端通过一个list不断给客户端发送数据。

    (每个连接都必须创建新线程(或进程)来处理,否则,单线程在处理连接的过程中,无法接受其他客户端的连接。)本例中,多进程其实没有起到作用。

    代码以及解释如下:

    # 服务器端
    # 1 创建套接字,绑定套接字到当地地址,然后开始监听连接。就是socket,bind,listen。 # 2 进入循环,不断接受客户端的连接请求,然后接收传来的数据,当然也可以发送给对方数据。就是accept一个连接,然后recv数据。 # 3 接收完毕可以关闭套接字,close。 # 这个过程的伪代码如下:
    ss=socket()    #创建服务器套接字
    ss.bind() #把本地地址绑到套接字上
    ss.listen() #监听连接
    inf_loop: #服务器无限循环
    cs=ss.accept() #接受客户端的连接
    comm._loop: #通信循环
    cs.recv()/cs.send() #对话
    cs.close() #关闭客户套接字
    ss.close() #关闭服务器套接字

      

    #客户端
    #   1 创建套接字,然后连接远端地址,socket ,connect。
    #  2 建立连接之后开始发送数据。Send(data),当然可以从缓冲区读取服务器发来的数据。Recv(BUFF)
    #   3 完毕后,关闭套接字。Close
    #   伪代码如下:
    cs=socket()       #创建客户套接字
    cs.connect()       #尝试连接服务器
    comm._loop:     #通信循环
    cs.send()/cs.recv()  #对话
    cs.close()          #关闭套接字
    #socket服务器端程序
    import socket
    import time
    from multiprocessing import Process         #多进程和多线程一样的用法
    
    def tcplink(sock1,addr1):                   #新建一个函数,用来接收客户端发来的信息
        print('Accept new connection......')
        sock1.send(b'welcom')                   #若连接建立成果,服务器给客户端发送一个welcome
        while 1:                                #服务器持续接收客户端发送过来的数据,直到服务器收到exit时,退出不在接收数据
            data = sock1.recv(1024)             #接收数据
            time.sleep(1)                       #延时1s
    
            '''data为客户端发送给服务器的数据,服务器给客户端发送hello,%data ,全部转为utf-8编码'''
            sock1.send(('hello,%s'%data.decode('utf-8')).encode('utf-8'))
    
            if not data or data.decode('utf-8') == 'exit':
                break
    
        sock1.close()                           #连接关闭
        print('connection form %s is close....'%addr1)
    
    if __name__ == "__main__":
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)           #建立一个套接字
        '''监听端口127.0.0.1表示客户端和服务器必须都为本机才能运行。
        我们要绑定监听的地址和端口。服务器可能有多块网卡,可以绑定到
        某一块网卡的IP地址上,也可以用0.0.0.0绑定到所有的网络地址,还
        可以用127.0.0.1绑定到本机地址。127.0.0.1是一个特殊的IP地址,表
        示本机地址,如果绑定到这个地址,客户端必须同时在本机运行才能连接
        ,也就是说,外部的计算机无法连接进来。端口号需要预先指定。因为我
        们写的这个服务不是标准服务,所以用9999这个端口号。请注意,小于1024
        的端口号必须要有管理员权限才能绑定:'''
        s.bind(('127.0.0.1', 9999))            #绑定端口
    
        s.listen(1)                                     #同时接收连接的最大数量
        print('Waiting for connecting......')
    
        while 1:                                        #服务器通过一个循环来一直接收来之客户端发送的信息
            sock,addr = s.accept()                      #s.accept返回两个数据
            t = Process(target=tcplink,args=(sock,addr))    #多线程
            t.start()                                       #开启多线程

    #socket客户端程序
    #同chenhang001.py
    import socket
    
    s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)        #新建一个套接字
    s.connect(('127.0.0.1',9999))                               #建立连接,为什么是双括号
    
    print(s.recv(1024).decode('utf-8'))                         #打印接收到的数据
    
    #发送数据,定义一个list,
    for data111 in [b'chenhang',b'wangyadan',b'wuhankejidaxue',b'wuchangfenxiao']:
        s.send(data111)
        print(s.recv(1024).decode('utf-8'))
    # for a in range(100):
    #     s.send(b(a))
    
    s.send(b'exit')             #发送exit字符,服务器退出接收数据
  • 相关阅读:
    shell Builtin variables(shell内建变量)
    [置顶] 九度笔记之 1434:今年暑假不AC
    OpenRisc-45-or1200的ID模块分析
    hdu1556 Color the ball
    PB C/S轉B/S ODBC方式連接數據庫
    Django的安装配置和开发
    通过一个月时间字段分组
    如何加入该网站for Linux(绑定域名)
    LeetCode 36 Sudoku Solver
    POJ 1986 Distance Queries LCA两点距离树
  • 原文地址:https://www.cnblogs.com/hanggegege/p/5745033.html
Copyright © 2011-2022 走看看