zoukankan      html  css  js  c++  java
  • 20181225 基于TCP/IP和基于UDP/IP的套接字编程

     

    一、TCP/IP的套接字编程

    服务器端代码:

    import  socket

    server = socket.socket() # 默认是基于TCP
    # 基于TCP的对象serve=socket.socket(socket.AF_INET,socket.SOCK_STREAM,0)
    # 基于UDP的对象serve=socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)

    server.bind(("127.0.0.1",8888))  #绑定服务器IP地址和端口

    server.listen()  #监听是否有握手请求,参数一般不写(由系统默认处理)或者不超过5个



    while True:
       client,addr = serve.accept()  #得到对方的socket对象和地址
       while True:
           try:
               data = client.recv(1024)  #1024表示应用程序的缓冲区大小,recv是从系统缓冲区读取数据到应用程序bytes
               if not data: # 如果是windows,对方强行关闭连接,会抛出异常,如果是linux,不会抛出异常,会死循环收到空的数据包。
                   print("对方已经关闭.....")
                   client.close()
                   break
               print(data.decode("utf-8"))  # 收到的数据解码并打印
               client.send(data.upper())
           except ConnectionResetError:
               print("对方异常关闭连接...")
    client.close()
               break
    server.close()

     

    用户端代码:

    import socket

    client = socket.socket()

    client.connect(("127.0.0.1",8888))

    while True:
       msg = input(">:")
       client.send(msg.encode("utf-8"))
       data = client.recv(1024)
       print("收到服务器:%s" % data.decode("utf-8"))

    client.close()

    半连接池:此处待续

     

     

    二、UDP/IP的套接字编程

    服务器端代码:

    import socket

    # UDP协议 在创建socket时只有一个类型不同(SOCK_DGRAM)
    server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,proto=0)

    server.bind(("127.0.0.1",8888))
    # 没有监听listen,没有accept

    while True:
       data,addr = server.recvfrom(1024) # 阻塞 直到收到数据为止
       print("收到来自%s的消息:%s" % (addr[0],data.decode("utf-8")))  # addr是元组,包含客户端IP和端口号
       # 返回值为 数据 和 对方ip地址 和端口号
       server.sendto(data.upper(),addr)

    server.close()

     

    客户端代码:

    import socket
    # 客户端也为SOCK_DGRAM
    client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)


    while True:
       data = input(">>:").encode("utf-8")
       client.sendto(data,("127.0.0.1",8888))  #服务器端IP与端口
       d,addr = client.recvfrom(1024)
       print(d.decode("utf-8"))

    client.close()

     

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/realadmin/p/10179264.html
Copyright © 2011-2022 走看看