套接字 (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编程.的更多相关文章

  1. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  2. 揭开Socket编程的面纱

    对TCP/IP.UDP.Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵.那么我想问: 1. 什么是TCP/IP.UDP? 2. Socket在哪里呢? 3. Sock ...

  3. winsock教程- windows下的socket编程(c语言实现)

    winsock教程- windows下的socket编程(c语言实现) 使用winsock进行socket 编程     这是一个学习windows下socket编程(c语言)的快速指南.这是因为一下 ...

  4. day8---多线程socket 编程,tcp粘包处理

    复习下socket 编程的步骤: 服务端:   1 声明socket 实例 server = socket.socket()  #括号里不写  默认地址簇使用AF_INET  即 IPv4       ...

  5. 转:Python 的 Socket 编程教程

    这是用来快速学习 Python Socket 套接字编程的指南和教程.Python 的 Socket 编程跟 C 语言很像. Python 官方关于 Socket 的函数请看 http://docs. ...

  6. PHP简单socket编程

    今天再看一点邮件发送的功能,所以了解一下socket变成,看到了一篇不错的文章,转发过来做个笔记吧. 原文链接:http://www.cnblogs.com/thinksasa/archive/201 ...

  7. Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/04/2379628.html 一.概述 关于Socket编程的基本方法在基础篇里已经讲过,今天把 ...

  8. 基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET

    基于libevent, libuv和android Looper不断演进socket编程 - 走向架构师之路 - 博客频道 - CSDN.NET 基于libevent, libuv和android L ...

  9. Socket编程实践(6) --TCP服务端注意事项

    僵尸进程处理 1)通过忽略SIGCHLD信号,避免僵尸进程 在server端代码中添加 signal(SIGCHLD, SIG_IGN); 2)通过wait/waitpid方法,解决僵尸进程 sign ...

随机推荐

  1. docker搭建nginx

    在Docker下部署Nginx,包括: 部署一个最简单的Nginx,可以通过端口访问默认的网站 设置记录访问和错误日志的路径 以交互模式创建centos容器,如果本地没有镜像,会从仓库获取, 等待即可 ...

  2. C# Socket网络编程精华篇

    我们在讲解Socket编程前,先看几个和Socket编程紧密相关的概念: TCP/IP层次模型 当然这里我们只讨论重要的四层 01,应用层(Application):应用层是个很广泛的概念,有一些基本 ...

  3. DB2锁机制

    相比较Oracle来说,DB2的锁机制麻烦了很多,而且这个麻烦带来的不是性能的上升而是下降,不过如果细致了解的话,只能感慨不愧是数据库理论诞生的公司,在实现数据库理论上比Oracle全面得多.    ...

  4. 05 Maven 生命周期和插件

    Maven 生命周期和插件 除了坐标.依赖以及仓库之外, Maven 另外两个核心概念是生命周期和插件.在有关 Maven 的日常使用中,命令行的输入往往就对应了生命周期,如 mvn package ...

  5. centos6.5 redis 安装配置及java调用

    1.安装gcc 执行命令  yum install gcc 2. 安装ruby环境 yum install ruby yum install rubygems gem install redis 下载 ...

  6. jquery中innerWidth(),outerWidth(),outerWidth(true)和width()的区别

    jquery中innerWidth(),outerWidth(),outerWidth(true)和width()的区别 var a = 元素本身的宽度: width() = a: innerWidt ...

  7. 2018.09.30 bzoj2223: [Coci 2009]PATULJCI(主席树)

    传送门 主席树经典题目. 直接利用主席树差分的思想判断区间中数的个数是否合法然后决定左走右走就行了. 实际上跟bzoj3524是同一道题. 代码: #include<bits/stdc++.h& ...

  8. pyhthon 求GPA平均学分绩点

    #coding=utf-8 ''' 北大4.0 成绩 学分 100-90 4.0 89-85 3.7 84-82 3.3 81-78 3.0 77-75 2.7 74-72 2.3 71-68 2.0 ...

  9. 新浪微博mid和url的互算

    我们在使用新浪微博API时,有时需要得到一个微博的url,但是如statuses/public_timeline等接口中取得的微博status的字段中并没有包含.不过,status中包含了一个mid字 ...

  10. MemCachedClient 节点失效时的处理

    引入jar包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3 ...