热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python学习日记(三十)Socket模块使用

Socket(套接字)套接字是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像文件一样的打开、读写和关闭等操作。套接字允许应用程序将IO插入到网络中,并与网络中的其他应用

Socket(套接字)

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

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

应用:

《Python学习日记(三十) Socket模块使用》

实现:

基于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端,执行结果:

《Python学习日记(三十) Socket模块使用》

《Python学习日记(三十) Socket模块使用》

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

《Python学习日记(三十) Socket模块使用》

解决方案:

《Python学习日记(三十) Socket模块使用》

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

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()
#关闭客户端的套接字

执行结果:

《Python学习日记(三十) Socket模块使用》

《Python学习日记(三十) Socket模块使用》

因此我们只要在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类型的Bye
print('Client has disconnected!')
break
print(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类型的Bye
print('Sever has disconnected!')
break
print(time.asctime(time.localtime(time.time())) + ' ["127.0.0.1", 8080]:' + ret)#格式化打印服务器发来的消息

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

执行结果:

《Python学习日记(三十) Socket模块使用》

《Python学习日记(三十) Socket模块使用》

基于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()
#关闭客户端套接字

执行结果:

《Python学习日记(三十) Socket模块使用》

《Python学习日记(三十) Socket模块使用》

 

 &#8230;&#8230;


推荐阅读
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • SQL Server 2008 到底需要使用哪些端口?
    SQLServer2008到底需要使用哪些端口?-下面就来介绍下SQLServer2008中使用的端口有哪些:  首先,最常用最常见的就是1433端口。这个是数据库引擎的端口,如果 ... [详细]
  • IP双栈环境下网络应用迁移
    IPv4向IPv6迁移有多种途径,在选择具体的迁移方式时,当前环境中运行的应用是否支持IPv6是重要的考量因素之一,同时在编写新的应用时,需要考虑新编写的应用不仅可以适应当前主流的IPv4环境, ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 1、Ipv4只能用于内网,外网只能用2、DNS:把域名解析成ip地址3、MAC地址就是物理地址(网卡序列号)   IP地址:电脑序列号4、不同电脑,微信之间互相通信,靠的是端口;  ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • 三、寻找恶意IP并用iptables禁止掉找出恶意连接你的服务器80端口的IP,直接用iptables来drop掉它;这里建议写脚本来运行, ... [详细]
  • 1、概述首先和大家一起回顾一下Java消息服务,在我之前的博客《Java消息队列-JMS概述》中,我为大家分析了:然后在另一篇博客《Java消息队列-ActiveMq实战》中 ... [详细]
  • 域名解析系统DNS
    文章目录前言一、域名系统概述二、因特网的域名结构三、域名服务器1.根域名服务器2.顶级域名服务器(TLD,top-leveldomain)3.权威(Authoritative)域名 ... [详细]
  • 实验2:Open vSwitch虚拟交换机实践   实验3:OpenFlow协议分析实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通 ... [详细]
author-avatar
超级娱乐测试_499
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有