Socket(套接字)

套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

发展:套接字最初是由加利福尼亚大学Berkely分校为Unix系统开发的网络通信接口。后来随着TCP/IP网络的发展,套接字成为最为通用的应用程序接口,也是在Internet上进行应用开发最为通用的API.

应用:

实现:

基于TCP协议实现Sever端和Client端的信息互通

Sever端:

import socket
sk = socket.socket()            #创建服务器的套接字
sk.bind(('127.0.0.1',8080))     #把地址绑定到套接字

sk.listen()                     #监听链接
conn,addr = sk.accept()         #接收到客户端的连接和地址
ret = conn.recv(1024)           #接收客户端信息
print(ret)                      #打印客户端的信息

conn.send(b'hi')                #向客户端发送信息
conn.close()                    #关闭客户端的连接
sk.close()                      #关闭服务器套接字

Client端:

import socket
sk = socket.socket()             #创建客户端的套接字
sk.connect(('127.0.0.1',8080))   #尝试连接服务器

sk.send(b'hello')                #向服务器发送消息
ret = sk.recv(1024)              #接收服务器发送的消息
print(ret)                       #打印服务器发送的消息

sk.close()                       #关闭客户端的套接字

Sever端和Client端两边都要对应接收和发送信息,不能只接不收或只收不接且执行时要先执行Sever端再去执行Client端,执行结果:

当重启服务器时遇到地址已被使用的问题

解决方案:

如何让客户端和服务器能够多次进行对话?

Sever端:

import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()              #创建服务器的套接字
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
sk.bind(('127.0.0.1',8080))       #把地址绑定到套接字
sk.listen()                       #监听链接
conn,addr = sk.accept()           #接收到客户端的连接和地址print(addr)                       #打印客户端的地址
ret = conn.recv(1024)             #接收客户端信息
print(ret)                        #打印客户端的信息
conn.send(b'hi')                  #向客户端发送信息
print(addr)                       #打印客户端的地址
ret = conn.recv(1024)             #接收客户端信息
print(ret)                        #打印客户端的信息
conn.send(b'hi')                  #向客户端发送信息

conn.close()                      #关闭客户端的连接
sk.close()                        #关闭服务器套接字

Client端:

import socket
sk = socket.socket()                #创建客户端的套接字
sk.connect(('127.0.0.1',8080))      #尝试连接服务器

sk.send(b'hello')                   #向服务器发送消息
ret = sk.recv(1024)                 #接收服务器发送的消息
print(ret)                          #打印服务器发送的消息
sk.send(b'hello')                   #向服务器发送消息
ret = sk.recv(1024)                 #接收服务器发送的消息
print(ret)                          #打印服务器发送的消息

sk.close()                          #关闭客户端的套接字

执行结果:

因此我们只要在Sever端获取到Client端后让它去循环接收和发送消息、让Client端在连接上Sever端后去循环发送和接收消息就能完成一个一直发送接收消息的过程,但这个过程是一个死循环,我们需要加上一些条件让它更加完善

Sever端:

import socket
import time
from json import dumps
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()                                                                    #创建服务器的套接字
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
sk.bind(('127.0.0.1',8080))                                                             #把地址绑定到套接字
sk.listen()                                                                             #监听链接
conn,addr = sk.accept()                                                                 #接收到客户端的连接和地址while 1:ret = conn.recv(1024).decode('utf-8')                                               #接收客户端信息if ret.strip() == 'bye' or ret.strip() == 'bye'.capitalize():                       #跳出循环的条件conn.send(b'bye')                                                               #发送bytes类型的Byeprint('Client has disconnected!')breakprint(time.asctime(time.localtime(time.time())) + ' ' +  dumps(addr) + ':' + ret)   #格式化打印客户端发来的消息sendInfo = input(time.asctime(time.localtime(time.time())) + ' <<<')conn.send(sendInfo.encode('utf-8'))                                                 #向客户端发送信息

conn.close()                                                                            #关闭客户端的连接
sk.close()                                                                              #关闭服务器套接字

Client端:

import socket
import time
sk = socket.socket()                                                                #创建客户端的套接字
sk.connect(('127.0.0.1',8080))                                                      #尝试连接服务器while 1:sendInfo = input(time.asctime(time.localtime(time.time())) + ' <<<')sk.send(sendInfo.encode('utf-8'))                                               #向服务器发送消息ret = sk.recv(1024).decode('utf-8')                                             #接收服务器发送的消息if ret.strip() == 'bye' or ret.strip() == 'bye'.capitalize():                   #跳出循环的条件sk.send(b'bye')                                                             #发送bytes类型的Byeprint('Sever has disconnected!')breakprint(time.asctime(time.localtime(time.time())) + ' ["127.0.0.1", 8080]:' + ret)#格式化打印服务器发来的消息

sk.close()                                                                          #关闭客户端的套接字

执行结果:

基于UDP协议实现Sever端和Client端的信息互通

实现简单传递信息

Sever端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)      #创建服务器套接字
sk.bind(('127.0.0.1',8080))                     #绑定服务器套接字

msg,addr = sk.recvfrom(1024)                    #接收到客户端的信息和地址
print(msg.decode('utf-8'))                      #将客户端传递来的信息解码并打印出来
sk.sendto(b'Hello client!',addr)                #将bytes类型的信息发送到客户端的地址

sk.close()                                      #关闭服务器套接字

Client端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)      #创建客户端套接字
ip_port = ('127.0.0.1',8080)sk.sendto(b'Hello sever!',ip_port)              #客户端发送信息
ret,addr = sk.recvfrom(1024)                    #接收到服务器的地址和信息
print(ret.decode('utf-8'))                      #打印收到的信息

sk.close()                                      #关闭客户端套接字

执行结果:

多人版:

Sever端:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)                  #创建服务器套接字
sk.bind(('127.0.0.1',8080))                                 #绑定服务器套接字while 1:msg,addr = sk.recvfrom(1024)                            #接收到客户端的信息和地址str_msg = msg.decode('utf-8')print(addr,str_msg)info = input('<<<').encode('utf-8')sk.sendto(info,addr)sk.close()                                                  #关闭服务器套接字

Client1:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)                              #创建客户端套接字
ip_port = ('127.0.0.1',8080)while 1:info = input('Client1:')info = ('\033[32m来自Client1的消息:%s\033[0m'%info).encode('utf-8')sk.sendto(info,ip_port)msg,addr = sk.recvfrom(1024)str_msg = msg.decode('utf-8')print(str_msg)sk.close()                                                              #关闭客户端套接字

Client2:

import socket
sk = socket.socket(type=socket.SOCK_DGRAM)                              #创建客户端套接字
ip_port = ('127.0.0.1',8080)while 1:info = input('Client2:')info = ('\033[36m来自Client2的消息:%s\033[0m' % info).encode('utf-8')sk.sendto(info, ip_port)msg, addr = sk.recvfrom(1024)str_msg = msg.decode('utf-8')print(str_msg)sk.close()                                                              #关闭客户端套接字

执行结果:

udp的Sever不需要进行监听也不需要建立连接,在启动服务之后只能被动得等待客户端发送消息来,客户端发送消息的同时还会自带地址信息,消息回复的时候不仅要发送消息还要把对方的地址给填上

转载于:https://www.cnblogs.com/Fantac/p/11521009.html

Python学习日记(三十) Socket模块使用相关推荐

  1. Python学习日记(三十二) hmac检验客户端的合法性和socketsever模块

    Hmac模块 其实这个模块类似hashlib模块,它能将一些重要的信息通过算法加密成密文,让信息更具有安全性. 关于hmac加密算法的了解:它的全名是哈希运算消息认证码(Hash-based Mess ...

  2. Python学习日记(三十四) Mysql数据库篇 二

    外键(Foreign Key) 如果今天有一张表上面有很多职务的信息 我们可以通过使用外键的方式去将两张表产生关联 这样的好处能够节省空间,比方说你今天的职务名称很长,在一张表中就要重复的去写这个职务 ...

  3. Python学习日记(二十八) hashlib模块、configparse模块、logging模块

    hashlib模块 主要提供字符加密算法功能,如md5.sha1.sha224.sha512.sha384等,这里的加密算法称为摘要算法.什么是摘要算法?它又称为哈希算法.散列算法,它通过一个函数把任 ...

  4. Python学习日记-第二十九天-tcp(客户端)

    系列文章目录 tcp介绍 tcp特点 tcp客户端 一.tcp介绍 Tcp协议,传输控制协议是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义 TCP通信需要经过创建 ...

  5. Python学习日记-第十四天-面向对象练习

    前言 今天主要是针对昨天学习的面向对象,进行两个练习. 一个是添加家具的练习 另一个是士兵开枪的练习 练习1: 添加家具 需求: 1.   房子 house 有户型,总面积和家具名称列表 ·新房子没有 ...

  6. 三、Python学习(三)海龟模块turtle使用案列-奥迪图标

    学习直角坐标系,学习使用Python坐标进行定位. 经过海龟模块turtle(一)和(二)的学习之后我们开始写代码案例,首先我们绘制奥迪图标 如果前面学习理解的差不多了,自然看代码注解清晰明了,接下来 ...

  7. Python学习日记(二十五) 接口类、抽象类、多态

    接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...

  8. Python学习札记(二十八) 模块1

    参考:模块 NOTE 1.模块:一个.py文件称为一个模块. 2.代码模块化的意义:a.提升程序的可维护性 b.不用重复造轮子 3.避免模块冲突,解决方法:引入了按目录来组织模块的方法,称为包(Pac ...

  9. Python学习(三十八)—— Djago之Ajax

    转载自:http://www.cnblogs.com/yuanchenqi/articles/7638956.html 一.Ajax准备知识:json 什么是json? 定义: JSON(JavaSc ...

最新文章

  1. 协同旋转不变网格形变
  2. 回顾微软近年来对于Linux和开源的策略
  3. java模拟网易邮箱登录_求赐教:网易邮箱Web端模拟登录看信的加密参数_ntes_nnid、_ntes_nuid...
  4. centos的mysql怎么删用户_linux/centos给Mysql创建用户、授权、查看、删除、修改密码、撤...
  5. web.config配置文件格式
  6. idea 工作区右边框提示_建立自己的制造商工作区的提示
  7. spark streaming python实例_kafka+spark streaming代码实例(pyspark+python)
  8. Linux下TCP循环接收数据的方式
  9. C# Object与二进制串(byte数组)之间的转换
  10. 活着的意义 在培训期间,为什么我如此的执着……
  11. Soft Actor Critic算法论文公式详解
  12. __android_log_print 打印中文乱码,打印日志中文乱码 (Print log Chinese garbled)
  13. R语言实战笔记后续修改
  14. DNS中有哪些值得学习的优秀设计
  15. xp系统总是弹出宽带连接服务器,如何处理xp电脑总是弹出宽带连接
  16. mysql查询表的内容_mysql查询表内容
  17. Intel 14nm工艺生产线即将上马
  18. AcWing 1309. 车的放置 (加法原理、乘法原理、组合数排列数的求法、乘法逆元)
  19. springboot项目配置(yml,pom)
  20. macOS如何快速将视频转化为音频mp3(软件全免费)

热门文章

  1. 千纸鹤女孩的轮播小技巧——微博转发
  2. 美国金融学博士项目和申请介绍
  3. 520用Python花式表白的几种姿势
  4. java abstract 变量_Java基础知识详解:abstract修饰符
  5. 腾讯云服务器内存型M6实例有哪些特点?适用于哪些场景?
  6. 将xmind文件内容导出为Excel文件
  7. 升级BIOS(可解决电脑的一部分疑难杂症,如电脑出现“正在锁定”后关机等问题)
  8. 6.1_6 Python3.x入门 P7 【字符串格式化】四种方式(手动、%-formatting、str.format()、f-String)
  9. 甲骨文公司的ERP实施方法论
  10. java小游戏代码压缩包_java 贪吃蛇小游戏 源码下载