博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网络编程-socket(三)(TCP长连接和UDP短连接、时间服务器)
阅读量:4562 次
发布时间:2019-06-08

本文共 3422 字,大约阅读时间需要 11 分钟。

详解地址:

TCP

server端

 

import socket sk = socket.socket()  # 创建了一个socket对象 sk.bind(('192.168.21.36',8080))  # 绑定一台机器的(ip,端口) # 回环地址 - 指向自己这台机器 sk.listen()    # 建立监听等待别人连接 conn,addr = sk.accept()       # 阻塞:在这里等待直到接到一个连接 # conn是连接 # addr是对方的地址 print(conn) print(addr) conn.send(b'hello')              # 和对方打招呼 msg = conn.recv(1024)                 # 对方和我说的话 # 有发必有收 收发必相等 print(msg) conn.close()                      # 挂电话 sk.close()                        # 关机 client端
import socket sk = socket.socket()  # 买个手机 sk.connect(('127.0.0.1',8080))  # 拨号 ret = sk.recv(1024) print(ret) sk.send(b'byebye!') sk.close() TCP聊天小工具 server端
import socket sk = socket.socket() sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) sk.bind(('192.168.21.36',9000)) sk.listen() while True:     conn,addr = sk.accept()  # 接收连接 三次握手conn     while True:         inp = input('>>>')         if inp == 'q':             conn.send(inp.encode('utf-8'))             break         conn.send(inp.encode('utf-8'))         msg = conn.recv(1024)         if msg == b'q':break         print(msg.decode('utf-8'))     conn.close()    # 四次挥手 sk.close()

 

client端
import socket sk = socket.socket() sk.connect(('127.0.0.1',9000)) while True:     msg = sk.recv(1024)     print(msg.decode('utf-8'))     if msg == b'q':break     inp = input('>>>')     if inp == 'q':         sk.send(inp.encode('utf-8'))         break     sk.send(inp.encode('utf-8')) sk.close() client1

再加一个client2

 

#server client 已建立了长连接通道,client2发送的消息只能等待,直到服务端和client1断开

server服务端建立一个长连接,作为和client断开后,继续下一个连接通道,调整如下:

server端

 

 

 

UDP
server端
import socket sk = socket.socket(type=socket.SOCK_DGRAM)  # 建立一个socket对象, # 指定以UDP协议的形式来连接 sk.bind(('127.0.0.1',8080)) # 指定服务的地址 msg,addr = sk.recvfrom(1024) # 接收消息,发送端的地址 print(msg,addr) sk.sendto(b'HELLO',addr) # 给发送端回复消息 sk.close() # 关闭socket连接 # UDP的server不需要进行监听也不需要建立建立连接 # 在启动服务之后只能被动的等待客户端发送消息过来 # 客户端发送消息的同时还会自带地址信息 # 消息回复的时候 不仅需要发送消息,还需要把对方的地址填写上
client端
import socket     sk = socket.socket(type=socket.SOCK_DGRAM)     sk.sendto(b'hello',('127.0.0.1',8080)) # 直接给服务器发送一段消息 msg,addr = sk.recvfrom(1024) # 接收对面的回信 print(msg) sk.close()
 
 

udp聊天的小程序 

  server端

import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9090)) while True: msg,addr = sk.recvfrom(1024) print('来自[%s:%s]的消息--%s'%(addr[0],addr[1],msg.decode('utf-8'))) inp = input('>>>') sk.sendto(inp.encode('utf-8'),addr) sk.close() client端
import socket sk = socket.socket(type=socket.SOCK_DGRAM) addr = ('127.0.0.1',9090) while True: msg = input('>>>') sk.sendto(msg.encode('utf-8'),addr) msg_recv,addr = sk.recvfrom(1024) print(msg_recv.decode('utf-8')) sk.close()
QQ多人聊天(用户带颜色而且显示地址、端口)

 

 

 

 

 

时间服务器

 

# 需求     # 写一个时间同步的服务器     # 服务端接收请求     # 按照client端发送的时间格式,将服务器时间转换成对应格式     # 发送给客户端 server端--------- import time import socket sk = socket.socket(type=socket.SOCK_DGRAM) sk.bind(('127.0.0.1',9000)) while True: msg,addr = sk.recvfrom(1024) # msg 客户端发送给server端的时间格式 "%Y-%m-%d %H:%M-%S" time_format = msg.decode('utf-8') time_str = time.strftime(time_format) sk.sendto(time_str.encode('utf-8'),addr) sk.close() client端----
# client端每隔一段时间发送请求到服务端 # 发送时间的格式 import time import socket sk = socket.socket(type = socket.SOCK_DGRAM) sk.sendto('%Y-%m-%d %H:%M:%S'.encode('utf-8'),('127.0.0.1',9000)) msg,addr = sk.recvfrom(1024) print(msg.decode('utf-8')) sk.close() # 方式一 # 操作系统的定时任务 + python代码的形式 # 方式二 # while True + time.sleep的形式
 

转载于:https://www.cnblogs.com/mys6/p/10778795.html

你可能感兴趣的文章
python 虚拟环境的 安装与 使用 和修改为豆瓣源
查看>>
js 快速入门
查看>>
Python 中的GIL
查看>>
如何解决ASCII 字符显示不出来的情况
查看>>
制表符 \t 的用法
查看>>
断点模式
查看>>
Ubuntu 侧边栏和顶栏设置
查看>>
底层原理
查看>>
21. Merge Two Sorted Lists
查看>>
shiro设置加密算法源码解析
查看>>
第二次冲刺
查看>>
实验四
查看>>
win8.1镜像制作
查看>>
Windows 服务开发框架介绍 - Topshelf
查看>>
php,字符串(二)
查看>>
easyui validatebox 验证类型
查看>>
编程迷茫时候看一看
查看>>
“ORA-00913: 值过多”、“ORA-00911: 无效字符”
查看>>
编程中的那些容易迷糊的小知识
查看>>
Sizzle前奏
查看>>