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

最新文章

  1. Linux安装mariadb二进制版本
  2. 骨骼蒙皮动画算法(Linear Blending Skinning)
  3. MySQL支持的数据类型(2)( 日期)
  4. javascript基础知识show
  5. discuz!安装遇到问题的解决方案
  6. 记录Sqlserver2012附加Sqlserver2008的数据库出错的解决方案
  7. C++中引用与指针的区别(详细介绍)
  8. Entity Framework 第十篇 条件查询
  9. 关于Mapper、Reducer的个人总结(转)
  10. self关键字
  11. kubernetes的安装方法
  12. mysql 自定义方法 function
  13. JAVA 第八周学习总结
  14. pytest 的 yield
  15. vue 异步请求
  16. R绘图 第八篇:绘制饼图(ggplot2)
  17. 【转帖】Git学习笔记 记录一下
  18. 基于bootstrap的文本编辑器组件:Summernote
  19. VMware 增加硬盘ubuntu
  20. OpenCL 学习step by step (5) 使用二维NDRange workgroup

热门文章

  1. HBase 相关API操练(二):Java API
  2. Android 中文 API (101) —— AsyncTask
  3. web.config文件executionTimeout的单位
  4. .net 向新页面跳转的语句
  5. Lambda动态排序通用方法
  6. springboot 学习笔记(五)
  7. jenkins代码自动部署
  8. Html+css实现带图标的控件
  9. ZooKeeper保证之单一视图(Single System Image)
  10. 如何解决EXCEL中的科学计数法