什么是socket:socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。我们无需再去深入理解tcp/udp协议,按照socket的规定去使用就行了。

首先一个c/s架构:分为两部分,服务端,客户端    (讲解基于tcp协议,传输数据)

服务端是怎么设置的呢

import socket     #首先导入socket模块

server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #这是获取tcp套接字(流式协议)

# server = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)  #这是获取udp套接字

server.bind(('127.0.0.1',8080))  #然后就是绑定服务器的ip和端口,记住bind()括号里加(ip,端口) 是一个元组形式的

server.listen(5)    #括号是监听数,比如我们设置为5,当服务端正在跟五个客户端通信时,再来一个客户端,那个客户 端就会连接不进去。

# a  = server.accept()   #这里就是等待着客户端连接,当有客户端连接时  a = (一个具有客户端到服务端和一个服务端到客户端的套接字,客户端的ip和端口)   a 是一个元组类型的数据,我们可以通过解压的方式,分别讲他们赋值给conn和client_addr 也就是以下的代码

conn,client_addr = server.accept()     # 我们可以通过这个coon 跟客户端收发信息,这是

data = conn.recv(1024)     #这是收取客户端的信息,1024代表一次性接收最大是1024字节的数据。将接收的信息赋值给data      记住data 现在是二进制类型数据

conn.send(data.upper())    #这里我们将接收的数据大写形式发送过去。  你也可以发送其他数据过,这只是一种例子而已。发过去的数据没有大小的限制。但是注意接收一次性最多接收1024大小的字节。

conn.close()       #通信结束了的话,记得关闭conn这个套接字。这个f.open() 记得f.close()是差不多的

server.close()     #关闭服务端。严格来说服务端的作用就是一直对外开放服务的,一般来说不用关闭。

下面是客户端的搭建,其方法和服务端一样的

import socket

client = socket.socket()     #这里括号里不填的话,就是默认tcp协议(流式协议),前面服务端也是一样。

client.connect(('127.0.0.1',8080))         #这里就是直接去连接服务端。记住ip和端口是元组形式。

client.send('你好呀,我是客户端'.encode('utf-8'))    #记住你发过的数据必须是二进制。可以通过encode('utf-8')转换

data = client.recv(1024)    #收到服务端的信息

print(data.deconde('utf-8'))           打印信息

client.close()   关闭客户端

以上就是通过socket模块搭建的c/s架构(基于tcp协议)

udp协议理论方法是一样的。我就不一一介绍了。

上面就是一个最基本的c/s架构。但是健壮性可能不太行。我们可以通过在上面模板在上面增加代码。

隐藏错误1:客户端和服务端两者都建立的连接,如果客户端这边出于某种不正常断开的话,那么服务端的就是崩掉。

解决方法一:就是通过捕捉异常的方式。

    try:

      data = conn.recv(1024)

      conn.send(data.upper())

    except ConnectionResetError:

      break

解决方式二:其实在windows系统下,解决方式一就够了,但是我们以后还会在linux在运行,所以说呢,在解决方式二就使用于linux系统,我们写这个windows的时候也没有影响,防止以后再linux下出错了。

基于上面的改进,以后就写这种

    try:

      data = conn.recv(1024)   #正常情况(客户端没有意外断开,能正常和服务端通信),data 永远不会接收到空值,他只会接收有大小的数据。  注意!!!

      if not data : break         #只有在客户端意外断开后,在linux系统下才会运行这段代码,正常情况是不会运行的。

      conn.send(data.upper())

    except ConnectionResetError:

      break

基于解决方法二,我有一点强调的写在上面。

隐藏错误2 :客户端不能输入空,这样会导致服务端接收不到数据,在那里一直等着,客户端虽然发出了数据,但接收数据状态永远接收不到值。会一直在那里等待服务端的发过来的数据。你可以基于上面的模板去试试。

解决方式很简单,就是不让客户端发送空值就行了,就是多加了一条判断语句。

    msg = input('客户端要发送到内容').strip()

    if not msg : continue      #基于可循环通信,也就是客户端收发信息在一个while循环里。前面服务端可以这样

这就是几个会出现的小错误和解决的方案。

模块socket使用的更多相关文章

  1. node模块之net模块——socket

    当我们去面试的时候,常常会遇到这样一个问题:当用户在浏览器地址栏输入一段url发出资源请求后,到服务端返回数据呈现给用户的这个过程都发生了什么? 我们把进行通信的这两个端(这里指的是,浏览器和资源获取 ...

  2. Python模块 Socket

    一个简单的python socket编程 一.套接字 套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并 ...

  3. python模块——socket

    实例一. server: #socket套接字(IP + 端口号)(qq,wechat 发送接收消息依靠socket模块),cs架构import socketserver = socket.socke ...

  4. python模块—socket

    创建套接字: socket.socket(family,type[,protocal]) 使用给定的地址族.套接字类型.协议编号(默认为0)来创建套接字. 1. socket类型: socket.AF ...

  5. python模块——socket (实现简单的C/S架构端通信操作CMD)

    # 服务端代码#!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" import socket impo ...

  6. socket套接字模块及黏包现象

    一.socket套接字模块 socket概念 socket层 理解socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模 ...

  7. python网络编程-socket

    python提供了两个socket模块 Socket,它提供了标准的BSD Sockets API SocketServer,它提供了服务器中心类,可以简化网络服务器的开发 下面先说socket模块 ...

  8. Python—Socket

    Socket模块 socket通常也称作"套接字",用于描述IP地址和端口,是特定网络协议如TCP/IP.UDP/IP套件对网络应用程序提供者提供的当前可移植标准的对象, 用来连接 ...

  9. nodejs原生模块简介

    一.Express框架 前面的章节已经介绍过了,可以使用npm来安装node.js模块.具体操作请参照以前写的nodejs概论. Express是一个nodejs的web开源框架,用于快速的搭建web ...

随机推荐

  1. C# 判断List集合中是否有重复的项

    /*在.Net 3.5 以上*/ ).Count() >= ;

  2. HTML表单特别效果—音量调节,购物数量

    <form oninput="x.value=parseInt(a.value)+parseInt(b.value)">0<input type="ra ...

  3. less自动编译 VScode 开发工具配置

    1.首先在vscode商店下载EasyLess插件,安装 2.在VS Code项目中,有一个.vscode的文件夹,找里面的settings.json文件(或者在文件-首选项-设置-搜索setting ...

  4. SVM个人学习总结

    SVM个人学习总结 如题,本文是对SVM学习总结,主要目的是梳理SVM推导过程,以及记录一些个人理解. 1.主要参考资料 [1]Corres C. Support vector networks[J] ...

  5. sharepoint2007就地升级2010系列(一)2007概览

    大家可能熟悉了sharepoint2010,熟悉了sharepoint2013,做了N多个项目,但是有没有做过从sharepoint2007升级或者迁移到sharepoint2010的项目呢?我们做实 ...

  6. YCRefreshView-自定义支持上拉加载更多,下拉刷新。。。

    自定义支持上拉加载更多,下拉刷新,支持自由切换状态[加载中,加载成功,加载失败,没网络等状态]的控件,拓展功能[支持长按拖拽,侧滑删除]可以选择性添加 .具体使用方法,可以直接参考demo. 轻量级侧 ...

  7. 解析angularjs中的绑定策略

    一.首先回顾一下有哪些绑定策略? 看这个实在是有点抽象了,我们来看具体的实例分析吧! 二.简单的Demo实例 @绑定:传递一个字符串作为属性的值.比如 str : ‘@string’ 控制器中代码部分 ...

  8. sqlserver broker远端端点证书认证

    1:采用windows验证的方法: CREATE ENDPOINT InstInitiatorEndpoint STATE = STARTED AS TCP ( LISTENER_PORT = ) F ...

  9. Selenium2学习(十四)-- 加载Firefox配置

    前言有小伙伴在用脚本启动浏览器时候发现原来下载的插件不见了,无法用firebug在打开的页面上继续定位页面元素,调试起来不方便 . 加载浏览器配置,需要用FirefoxProfile(profile_ ...

  10. /etc/hosts.allow和/etc/hosts.deny详解

    今天遇到一台服务器22端口正常,但是通过ssh连接的问题.排查了防火墙和端口问题,半天没有找出来原因,后来求助大神,终于明白了通过etc目录下hosts.deny和hosts.allow文件可以限制远 ...