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 ...
随机推荐
- cannot convert from 'wchar_t *' to 'char *' 问题
MFC中使用unicode 会导致cstring之间的转换变的很复杂 经常遇到这样的错误cannot convert from 'wchar_t *' to 'char *' 强制转换成wchar_t ...
- 使用threejs点云秀出酷炫的图片效果(一)
来源:http://blog.csdn.net/srk19960903/article/details/70214556 使用了点云拼凑出了照片轮播十分有趣,于是用threejs实现这个效果. 首先这 ...
- centos7之iptables与firewalld
保障数据的安全性是继保障数据的可用性之后最为重要的一项工作.防火墙作为公网 与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用. firewalld与iptables iptables f ...
- sock基础编程介绍
一个简单的python socket编程 一.套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并 ...
- Linux screen命令
一.简介 GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件.用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换. GNU Screen可以看作是窗口管理器的 ...
- 如何将硕大笨重的git仓库拆分成灵活轻巧的模块小仓库
方法1.拆分一个子目录为独立仓库 参考链接:https://segmentfault.com/a/1190000002548731 以前是用 filter-branch 来实现,这个需求太常见了,有人 ...
- 如何删除win8自带输入法
如何删除 win8 自带输入法 win8 自带的那个中文输入法太坑了,想删又删不了.试了半个小时才试出一个方法.方法如下: 第一步:在更改语言道选项下面点击[添加语言] [控制面板] -> [时 ...
- OSGi 系列(十二)之 Http Service
OSGi 系列(十二)之 Http Service 1. 原始的 HttpService (1) 新建 web-osgi 工程,目录结构如下: (2) HomeServlet package com. ...
- part1:13-linux编译器GCC
Gcc特点 Gcc基本用法 1.gcc的概念 GCC(GNU Compiler Collection,GNU编译器套装),是一款由GNU开发的编程语言编译器.GCC原名为GNU C 语言编译器,因为它 ...
- 2018.08.15 bzoj3747: [POI2015]Kinoman(线段树)
传送门 简单题. 先不管时间复杂度看看怎么做. 对于一段区间[l,r],如果从右端加入一个数a[r+1],对这个区间有什么影响?显然如果区间中已经有了a[r+1]这个数就会产生-a[i+1]的影响,否 ...