• socket编程TCP之服务器和客户端


    服务端和客户端就像银行出纳员和客户样,一个银行出纳员(服务器),不吃不睡的服务排队的客户,每个客户都会有要解决的问题,一旦完成,客户就会走开,出纳员等待下一个客户的到来。

    面向连接的套接字:在进行通讯之前必须建立连接,主要协议是传输控制协议,简称TCP,TCP套接字的名字是SOCK_STREAM

    服务器端:

    from socket import *
    from time import ctime
    
    HOST =  '' #空白,是对bind方法的标识,可以使用任何可用的地址
    PORT =  21567
    BUFSIZ = 1024 #缓冲区大小设为1kb
    ADDR = (HOST, PORT)
    
    tcpSerSock = socket(AF_INET, SOCK_STREAM) #分配tcp协议套接字
    tcpSerSock.bind(ADDR) #将套接字绑定到服务器地址
    tcpSerSock.listen(5) #开启tcp监听器的调用
    
    while True: #无限的循环,不断的监听
        print('waitting for connect')
        tcpCliSock, addr = tcpSerSock.accept() #等待客户端的连接
        print('...connect from: ', addr)
        
        while True:
            data = tcpCliSock.recv(BUFSIZ)#接受客户端数据
            if not data:#如果消息为空,跳出本会话循环,等待另一个客户端连接
                break
            tcpCliSock.send(b'[%s] %s' %(bytes(ctime(), 'utf-8'),data))#必须加b‘’否则还是str #如果得到消息则格式化返回数据并加上时间戳
        
        tcpCliSock.close()#并不会执行
    tcpSerSock.close()#并不会执行
    >>>
    waitting for connect
     

    客户端:

    from socket import *
    
    HOST =  '127.0.0.1'
    PORT =  21567 #应与服务端相同
    BUFSIZ = 1024 #大小也应该相同
    ADDR = (HOST, PORT)
    
    tcpCliSock = socket(AF_INET, SOCK_STREAM)#分配tcp客户端套接字
    tcpCliSock.connect(ADDR)#主动调用并连接到服务器
    
    while True:#无限循环,
        data = input('>')#输入数据
        if not data:#如果输入为空,则跳出循环
            break
        tcpCliSock.send(bytes(data, encoding = "utf8") )#发送的数据只能是bytes,用bytes(s, encoding='utf-8')将输入的str转为bytes #发送到服务器进行数据处理
        data = tcpCliSock.recv(BUFSIZ)#接受到服务器加工过的信息
        if not data:#如果调用失败则退出循环
                break
        print(data.decode('utf-8'))#将bytes转为str #输出到屏幕
        
        
    tcpCliSock.close()

    >>>
    [Thu Feb  8 16:51:49 2018] h
    >hello lily
    [Thu Feb  8 16:52:56 2018] hello lily
    >你好
    [Thu Feb  8 16:53:43 2018] 你好
    >as long as you were happy
    [Thu Feb  8 17:27:39 2018] as long as you were happy
     
  • 相关阅读:
    多线程使用常识
    《30天自制操作系统》实现中文显示
    DDD实践(一)
    为了钱这是很正当的,我跟你干,我要获得一个好的收入,我要改善我的生活,我要提高我的生活质量(转)
    Java对象序列化/反序列化的注意事项(转)
    Java使用Socket传输文件遇到的问题(转)
    大胆采用开源工具(转)
    如果常量类进行改变时,只编译常量类,而使用常量的类不重新编码,这样改动实际上算没有生效(转)
    在html中写python代码的语法和特点-----基于webpy的httpserver
    在Activity中为什么要用managedQuery()
  • 原文地址:https://www.cnblogs.com/Zhu-Xueming/p/8432662.html
Copyright © 2020-2023  润新知