zoukankan      html  css  js  c++  java
  • 网络编程

    1、基于 TCP 的套接字

    2、基于 UCP 的套接字

    3、SocketServer 模块


    1、基于 TCP 的套接字:

    服务端:

    import socket
    
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp协议
    # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    phone.bind(('127.0.0.1',8083)) #0-65535
    phone.listen(5)
    
    print('starting...')
    while True: #链接循环
        conn,client_addr=phone.accept()
        # print(conn,client_addr)
        print(client_addr)
    
        while True: #通信循环
            try:
                data=conn.recv(1024) #1024bytes?
                if not data:break #针对的是linux系统
                print('客户端消息',data)
                conn.send(data.upper())
            except ConnectionResetError:#针对的是windows系统
                break
        conn.close()
    phone.close()

    客户端:

    import socket
    
    phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #tcp协议
    phone.connect(('127.0.0.1',8083)) #0-65535
    
    while True:
        msg=input('>>: ').strip()
        if not msg:continue
    
        phone.send(msg.encode('utf-8'))
        data=phone.recv(1024)
        print(data)
    
    phone.close()

     

    2、基于 UCP 的套接字

    服务端:

    #_*_coding:utf-8_*_
    import socket
    ip_port=('127.0.0.1',9000)
    BUFSIZE=1024
    udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #数据报协议
    udp_server_client.bind(ip_port)
    
    while True:
        msg,addr=udp_server_client.recvfrom(BUFSIZE)
        print(msg,addr)
    
        udp_server_client.sendto(msg.upper(),addr)

    客户端:

    #_*_coding:utf-8_*_
    import socket
    ip_port=('127.0.0.1',9000)
    BUFSIZE=1024
    udp_server_client=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    
    while True:
        msg=input('>>: ').strip()
        if not msg:continue
        udp_server_client.sendto(msg.encode('utf-8'),ip_port)
    
        back_msg,addr=udp_server_client.recvfrom(BUFSIZE)
        print(back_msg.decode('utf-8'),addr)

    3、SocketServer 模块:

    #服务端TCP
    import socketserver
    
    class MyTCPhandler(socketserver.BaseRequestHandler): #requests来解决通信问题
        def handle(self): #必须是handle这个名字
            #print('==>',self) #客户端连接就打印一个对象
            while True:
                #conn.recv(1024)
                data=self.request.recv(1024) #self.request 就是conn
                self.request.send(data.upper())
    if __name__ == '__main__':
        #print(socketserver.ForkingTCPServer) #windows没有fork这个模块,不能在windows开进程,linux可以 
        s=socketserver.ThreadingTCPServer(('127.0.0.1',8080),MyTCPhandler) #server来解决链接问题
        s.serve_forever() #一直提供服务
    #服务端udp
    import socketserver
    
    class MyTCPhandler(socketserver.BaseRequestHandler):
        def handle(self):
            print(self.request) #打印一个元组,第一个元素是数据,第二个元素是服务端的套接字s=socket(AF_INET,SOCK_DGRAM)
            client_data=self.request[0]
            self.request[1].sendto(client_data.upper(),self.client_address)
    
    if __name__ == '__main__':
    s=socketserver.ThreadingUDPServer(('127.0.0.1',8080),MyTCPhandler)
        s.serve_forever()
    #客户端TCP #和之前一样
    from socket import *
    
    c=socket(AF_INET,SOCK_STREAM)
    c.connect(('127.0.0.1',8080))
    
    while True:
        msg=input('>>: ').strip()
        if not msg:break
        c.send(msg.encode('utf-8'))
        data=c.recv(1024)
        print(data)
    c.close()
    #客户端UDP #和之前一样
    from socket import *
    
    c=socket(AF_INET,SOCK_DGRAM)
    
    while True:
        msg=input('>>: ').strip()
        if not msg:break
        c.sendto(msg.encode('utf-8'),('127.0.0.1',8080))
        data=c.recvfrom(1024)
        print(data)
    c.close()
  • 相关阅读:
    移植性问题のCString转char * ,string
    HDU 2894(欧拉回路)
    POJ 1149(最大流)
    POJ 3422 K取方格数(费用流)/TYVJ 1413
    POJ 1112(染色+连通分量+DP)
    POJ 2195(KM模板题)
    POJ 3615(FLOYD应用)
    POJ 1797(SPFA变种)spfa能做很多!
    POJ 1325(最小点覆盖)
    NOI2010 海拔(平面图最大流)
  • 原文地址:https://www.cnblogs.com/snailgirl/p/8990495.html
Copyright © 2011-2022 走看看