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()

 

原文地址:https://www.cnblogs.com/realadmin/p/10179264.html