踩了一上午的坑之后,终于对网络编程有了一点大致的、基本的了解。真的是0基础,之前对socket网络编程一点都不知道。(感觉自己与时代脱轨。。。。)

首先我想对这些美妙的专业术语进行一番搜索:

服务器:简而言之,它是一个位于一个物理服务器上的网络服务器(呀,服务器上的服务器),它等待客户端发送请求。当它接收到一个请求,就会生成一个响应并回发给客户端。客户端和服务器使用HTTP协议通信。客户端可以是浏览器或者别的使用HTTP协议的软件。-----------------------伯乐在线

 套接字:TCP用主机的IP地址加上主机上的端口号作为TCP连接的端点,这种端点就叫做套接字(socket)或插口。套接字用(IP地址:端口号)。-------------------------百度

表示如果把服务器和客户端比作一对情侣的话,那么套接字就是他们相互拥抱的双手。

TCP?HTTP?:HTTP是高层协议,而TCP/IP是个协议集,包过许多的子协议。包括:传输层的 FTP,UDP,TCP协议等,网络层的ip协议等,高层协议如HTTP,telnet协议等,HTTP是TCP/IP的一个子协议。

TCP/IP :他是一个协议栈,就像操作系统的运行机制一样,必须要具体实现,同时还要提供对外的操作接口。这个就像操作系统会提供标准的编程接口,比如win32编程接口一样,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。

socket:实际上socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、listen、connect、accept、send、read和write等等。---------------------------------http://www.cnblogs.com/shangdahao/archive/2013/05/22/3085131.html?share_from=com.rae.cnblogs

利用Socket建立网络连接的步骤:

建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

(我是盗图小能手)

好了,了解了一些可能会用到的术语,下面看看一个用python搭建的简易服务器是长什么样的:

#coding: utf-8

"""
搭建简单服务器
""" import socket HOST = '10.130.167.108' #获取本地主机名,cmd下用ipconfig命令查看
PORT = 12345 #设置端口号
ADDR = (HOST,PORT)      #放在一起就是套接字了 web = socket.socket() #创建socket对象
web.bind(ADDR) #绑定端口 web.listen(5) #等待客户端连接,参数为TCP连接队列的大小,就是连接数
print('sever is listening...') while True:
client_connection,client_address = web.accept() #建立客户端连接
print('link addr:')
print(client_address) #打印客户端发来的嵌套字 client_connection.send(str.encode("HELLO,WORLD")) #向客户端发送信息,需要byte类型的参数,需要做一下转换 data = client_connection.recv(1024)
print(data) client_connection.close() #关闭连接

其中 listen 函数会监听连接到socket上的连接,参数表示在拒绝连接之前系统可以挂起的最大连接队列数量为5。这些连接还没有被accept处理。数量不能无限大,通常指定5。一旦我们监听到了连接,就会调用  accept 函数接收连接 。

accept 函数返回一个二元组,client_connection  是一个新的socket对象,用来接收和发送数据。client_address  表示另一端的socket地址。

我们打印出客户端的套接字后,紧接着向客户端发送信息,这里发送的时候,注意一下我用的python3.6,里面的字符编码的格式问题。

发送完信息之后,我们等待接收客户端发送来的信息并显示。然后关闭连接,一个循环结束。进入下一个循环。

客户端的程序:

"""
简易客户端
""" import socket HOST = '10.130.167.108' #获取本地主机名
PORT = 12345 #设置端口号
ADDR = (HOST,PORT) web = socket.socket() web.connect(ADDR) #请求与服务器建立连接
web.send(str.encode("this is client...")) #向服务器发送信息 data = web.recv(1024) #接收数据
print(data) #打印出接受到的数据 web.close()

运行效果:

这是服务器的打印结果。

客户端:

python3+socket搭建简易服务器的更多相关文章

  1. python搭建简易服务器实例参考

    有关python搭建简易服务器的方法. 需求分析: 省油宝用户数 已经破了6000,原有的静态报表 已经变得臃肿不堪, 每次打开都要缓上半天,甚至浏览器直接挂掉 采用python搭建一个最最简易的 w ...

  2. Python使用socketServer包搭建简易服务器过程详解

    官方提供了socketserver包去方便我们快速的搭建一个服务器框架. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的 ...

  3. 使用Python3.7.0搭建简易服务器

    一.下载并安装Python 官网地址 二.新建start_server.bat 在需要搭建服务器的根目录位置,新建一个start_server.bat文件 内容 python -m http.serv ...

  4. [容器]python搭建简易服务器+docker导入多个镜像shell脚本

    从其他机器导出来的docker镜像,集中地放在某台上,其他的机器执行 curl xxx:8000/load_images.sh 来导入镜像,简单方便 使用python简易web服务器. (在镜像目录下 ...

  5. nodejs 搭建简易服务器

    www文件夹下 template文件夹下 server.js代码: const express=require('express'); const static=require('express-st ...

  6. 搭建简易的WebServer(基于pyhton实现简易Web框架 使用socket套接字)

    1. 使用web底层socket的方式实现简易服务器的搭建,用来理解学习 # 1.导入socket模块 import socket import re import gevent import sys ...

  7. django+nginx+xshell简易日志查询,接上<关于《rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>》的反思>

    纠正一下之前在<关于<rsyslog+mysql+loganalyzer搭建日志服务器<个人笔记>>的反思>中说到的PHP+MySQL太慢,这里只是说我技术不好,没 ...

  8. Python中使用Flask、MongoDB搭建简易图片服务器

    主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...

  9. express搭建简易web的服务器

    express搭建简易web的服务器 说到express我们就会想到nodejs,应为它是一款基于nodejs平台的web应用开发框架.既然它是基于nodejs平台的框架那么就得先安装nodejs. ...

随机推荐

  1. Lua获取系统时间和时间格式化方法及格式化参数

    一.系统当前时间对应的时间戳 复制代码代码如下: local ntime = os.timeprint(ntime) 二.格式化时间显示,参考下表常用于设置header等 复制代码代码如下: ngx. ...

  2. Android开发学习笔记-显示对话框

    private void ShowUpdateDialog() { Log.i("version", "shengji"); AlertDialog.Build ...

  3. 【转载】MongoDB集群和实战详解

    1.概述 最近有同学和网友私信我,问我MongoDB方面的问题:这里我整理一篇博客来赘述下MongoDB供大家学习参考,博客的目录内容如下: 基本操作 CRUD MapReduce 本篇文章是基于Mo ...

  4. cmd.exe启动参数详解

    https://blog.csdn.net/moonhillcity/article/details/53039763 各个系统中打开文件的命令 "windows系统: cmd " ...

  5. RESTful状态码说明

    https://www.zhihu.com/question/58686782/answer/159603453 常用状态码: 200 请求成功并返回所需资源 400 客户端请求有语法错误 401 未 ...

  6. PHP如何获取本周周二的日期?

    在计算某个特定周几的时候,需要对当前时间做一个转换和比对,比如,如何求出本周周二的时间日期. 代码如下: <?php // 如何计算本周的星期二 $time=time();//时间 $now=d ...

  7. HttpClient(二)-- 模拟浏览器抓取网页

    一.设置请求头消息 User-Agent模拟浏览器 1.当使用第一节的代码 来 访问推酷的时候,会返回给我们如下信息: 网页内容:<!DOCTYPE html> <html> ...

  8. U3D教程宝典之两步实现超实用的XML存档

    两步实现超实用的XML存档 本套存档的优点:易使用,跨平台,防作弊(内容加密 + 防拷贝) 脚本下载地址 使用方法非常简单:把GameDataManager和XmlSaver两个脚本添加至工程后(1) ...

  9. 在windows2003下可以用哪个版本的JDK

    JDK在windows下只区分32位还是64位的, 而windows 2003有32位也有64位的,你先查查看自己机器是哪种,参照下面这个经验http://jingyan.baidu.com/arti ...

  10. PHP多种序列化/反序列化的方法

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 1. serialize和 ...