Day 33 Socket编程.
套接字 (socket)处使用
基于TCP 协议的套接字
TCP 是基于链接的 ,服务器端和客户端启动没有顺序.
服务器端设置:
import socket
sk =socket.socket() # 1. 实例化
sk.bind(('127.0.0.1',))#把地址绑定到套接字 #2. bind
sk.listen()#监听链接 #3.监听
conn,addr = sk.accept()#接收客户端链接 #4.接收链接
ret =conn.recv(())#接收客户端信息 #5. 接收信息
print(ret)
conn.send(b'hello_world')#向客户端发送信息. #6.发消息
conn.close()#关闭链接
sk.close()#关闭服务器套接字,可选
输出结果 :b'hellow iam the client side !'
客户端配置:
import socket
sk =socket.socket() #创建客户套接字 1.实例化
sk.connect(('127.0.0.1',)) #尝试链接服务器 #2.连接
sk.send(b'hellow iam the client side !') #3. 发送
ret =sk.recv() #4.接收
print(ret)
sk.close()#关闭客户套接字.
输出结果:b'hello_world'
问题:有的同学在重启服务端时可能会遇到

解决办法
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk =socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,)#在bind前绑定.
sk.bind(('127.0.0.1',))#把地址绑定到套接字
sk.listen()#监听链接
conn,addr = sk.accept()#接收客户端链接
ret =conn.recv(())#接收客户端信息
print(ret)
conn.send(b'hello_world')#向客户端发送信息.
conn.close()#关闭链接
sk.close()#关闭服务器套接字,可选
基于UDP的套接字协议
upd是面向无连接的,启动服务后可以直接接受消息,不需要提前建立链接
Server端
import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM) #1. 实例化
udp_sk.bind(('127.0.0.1',)) #2.bind 地址与端口
msg,addr = udp_sk.recvfrom() #3. 接收消息.
print(msg)
udp_sk.sendto(b'hello iam the serverside',addr) #4.发送消息.
udp_sk.close()
输出结果:
client端
import socket
ip_port =('127.0.0.1',)
udp_sk =socket.socket(type=socket.SOCK_DGRAM) #1.实例化
udp_sk.sendto(b'hello',ip_port) #2.发送
msg,addr=udp_sk.recvfrom() #3.接收
print(msg)
输出结果 b'hello iam the serverside'
TCP 聊天小工具
服务器端
import socket
sk =socket.socket()
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,)
sk.bind(('192.168.21.36',))
sk.listen()
while True:
con,addr =sk.accept()#接收连接,三次握手conn
while True:
inp = input('请输入')
if inp =='q':
con.send(inp.encode('utf-8'))
break
con.send(inp.encode('utf-8'))
msg =con.recv()
if msg ==b'q':break
print(msg.decode('utf-8'))
con.close()
sk.close()
客户端:
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',))
while True:
msg = sk.recv()
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()
UDP 聊天小工具
服务器端
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连接
客户端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto(b'hello',('127.0.0.1',)) # 直接给服务器发送一段消息
msg,addr = sk.recvfrom() # 接收对面的回信
print(msg)
sk.close()
时钟同步试题
服务器端
import socket
sk = socket.socket(type=socket.SOCK_DGRAM)
sk.sendto(b'hello',('127.0.0.1',)) # 直接给服务器发送一段消息
msg,addr = sk.recvfrom() # 接收对面的回信
print(msg)
sk.close()
客户端
# 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',))
msg,addr = sk.recvfrom()
print(msg.decode('utf-8'))
sk.close() # 方式一
# 操作系统的定时任务 + python代码的形式
# 方式二
# while True + time.sleep的形式
Day 33 Socket编程.的更多相关文章
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- 揭开Socket编程的面纱
对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP? 2. Socket在哪里呢? 3. Sock ...
- winsock教程- windows下的socket编程(c语言实现)
winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程 这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...
- day8---多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
- 转:Python 的 Socket 编程教程
这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...
- PHP简单socket编程
今天再看一点邮件发送的功能,所以了解一下socket变成,看到了一篇不错的文章,转发过来做个笔记吧. 原文链接:http://www.cnblogs.com/thinksasa/archive/201 ...
- Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)
链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...
- 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET
基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...
- Socket编程实践(6) --TCP服务端注意事项
僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...
随机推荐
- mysql非主键自增长
mysql并非只有主键才能自增长,而是设为键的列就可以设置自增长. 如下: CREATE TABLE t1 ( id INT, col1 INT auto_increment NOT NULL ) ...
- Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this scrip
在运行phpize时出现的错误 > /data/php/bin/phpize Configuring for: PHP Api Version: 20131106 Zend Module Api ...
- program by the way......
ostrich birds fruit apple constructor height weight method overload override base sub inherit extend ...
- Netty 源码 NioEventLoop(一)初始化
Netty 源码 NioEventLoop(一)初始化 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Netty 基于事件 ...
- Java NIO系列教程(十)DatagramChannel
Java NIO系列教程(十)DatagramChannel 转载自并发编程网 – ifeve.com,本文链接地址: Java NIO系列教程(十) Java NIO DatagramChannel
- Java WebService 教程系列之 Spring 整合 CXF
Java WebService 教程系列之 Spring 整合 CXF 一.引入 jar 包 <dependency> <groupId>org.apache.cxf</ ...
- jsp 页面 摘要, 要截取字符串 ,当时 字符串中包含 html标签,截取后无法显示
如题: 处理办法: 1. 使用struts标签 <s:property value ="#text.replaceAll('<[^>]+>','').substr ...
- window.name跨域实现
参考:window.name实现的跨域数据传输 有三个页面: a.com/app.html:应用页面. a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件,需要和应用页面 ...
- java反编译工具jad使用
参考:http://blog.csdn.net/u014472711/article/details/53713269 http://lijingshou.iteye.com/blog/2005717 ...
- IDEA SpringBoot Deprecated configuration property ‘server.servlet-path’
错误样式如图所示.说我这个版本中的这个标签是过时的. 解决: 出现这个问题后,这个标签被IDEA化成了黄线,同时,想使用server.servlet-path=*.html,配置servlet路径跳转 ...