TCP/IP

1,建立连接(三次握手)  

            

  1,客户端发起请求

  2,服务器请求回应

  3,请求确认,双方建立连接

2,数据传输

3,断开连接(四次挥手)

        

  1,客户端请求断开 连接

  2,服务器回应请求

  3,服务器向客户端请求断开连接

  4,客户端回应请求

套接字:

    三种套按字:1,监听套接字;2,客户端套接字;3,对等套接字

服务器

#  服务器
import socket server = socket.socket() # 实例化
# print(server) # 监听套接字
# <socket.socket fd=368, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>
# 唯一 地址家族(域) 套接字 TCP server.bind(('0.0.0.0',9001)) # 绑定ip,和端口,
server.listen(5) # 同时服务5个,
# print(server) # 监听套接字
# <socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 9001)>
# server.accept()
print(server.accept()) # 对等连接套字,用于传输数据 连接成功时与客户端一至
# (<socket.socket fd=484, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9001), raddr=('127.0.0.1', 57015)>, ('127.0.0.1', 57015))

客户端

#  客户端
import socket cllent = socket.socket() # 实例化
cllent.connect(('127.0.0.1',9001)) # 建立连接
print(cllent) # 客户端 套接字
# <socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, # laddr=('127.0.0.1', 56950), raddr=('127.0.0.1', 9001)>
# 本地地址 远程地地址

  

服务器 a

import socket
server = socket.socket()
server.bind(('',9000))
server.listen(5)
con,addr = server.accept()
print(con,addr) # con 是对等连接套接字
# con = <socket.socket fd=324, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 57162)>
# addr 是 连接通信地址,
# addr = ('127.0.0.1', 57162)
#  数据发送
con.send(b'hi')
#  接收客户端数据
a = con.recv(1024)
print(a)
print(a.decode())
     ----》

  b'\xe8\x8a\xb1\xe7\x97\xb4'
  花痴

 

客户端 a

import socket
cllent = socket.socket()
cllent.connect(('127.0.0.1',9000))
# 数据接收
r = cllent.recv(1024)
print(r) # ----》b'hi'
# 向服务器发数据
cllent.send('花痴'.encode())
# 关闭连接
cllent.close()

  

不能发送空值  ''

#服务器
from socket import * ip_port = ('127.0.0.1',9100)
back_log = 5
buf_siz = 1024 # tcp_server = socket(AF_INET,SOCK_DGRAM)
tcp_server = socket()
#  tcp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)  #  在 linux 中重启如果 ip ,端口会被占用,可添加这行,
tcp_server.bind( ip_port )      #  绑定 ip
tcp_server.listen( back_log ) while True: # 外层循环,为了服务多个人(要等待)
conn,addr = tcp_server.accept() # 接收 等待 TCP 进来 (阻塞)
print('双向连接',conn)
print('客户端地址:',addr) while True: # 内层循环,与一个人通信,
try:
data = conn.recv( buf_siz ) # 接收客户端数据
print('来自客户端的数据:',data.decode('utf-8'))
conn.send(data) # 回信息
except Exception:
break
# conn.close() tcp_server.close()

  

#客户端
import socket,time
client = socket.socket()
client.connect(('127.0.0.1',9100)) while True:
c = input('--->>')
if not c: continue # 输入空值,重来
client.send(c.encode('utf-8'))
print('客户端已经发送消息')
time.sleep(0.1)
data= client.recv(1024)
print('收到服务器发来的信息:',data.decode()) client.close()

  

基于 TCP 服务端

  1, s = socket()   创建套接字,

  2, s.bind()  套接字绑定地址,

  3,s.listen()  监听,

  4,while True:       为了报备多人的外部循环

    5,c = s.accept()    接受客户端连接

      6, while True:     通信循环

        7,  recv,conn  对话,收发

      8,  c.close()    关闭客户端套接字

  9,s.close()          关闭服务器

补充:UDB通信

服务器:

# -*- coding: utf-8 -*-

from socket import*

udp_server = socket(AF_INET,SOCK_DGRAM)
udp_server.bind(('127.0.0.1',8080)) while True:
data,addr = udp_server.recvfrom(1024)
print(data)
# 发送数据要带上客户端IP
udp_server.sendto(data, addr)

客户端:

# -*- coding: utf-8 -*-

from socket import*

udp_cl = socket(AF_INET,SOCK_DGRAM)
# udp_cl = socket() while True:
ma = input('--->>>') # 服务器 ip
udp_cl.sendto(ma.encode('utf8'),('127.0.0.1',8080))
data, addr = udp_cl.recvfrom(1024)
print(data.decode('utf8'))

  

潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)的更多相关文章

  1. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)

    index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

  2. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第三课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  3. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第二课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  4. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第一课 (课堂笔记)

    index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  5. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)

    类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...

  6. 潭州课堂25班:Ph201805201 并发(协程) 第十五课 (课堂笔记)

    #斐波那契 def fid(n): res = [] indx = 0 a = 0 b = 1 while indx < n : res.append(b) a,b = b,a+b indx + ...

  7. 潭州课堂25班:Ph201805201 并发(进程,线程) 第十一课 (课堂笔记)

    线程,进程,是实现并发的方法, 并行: 在同一时刻,同时运行多个任务,CPU 的数量大于等于任务数量, 并发: 在同一时间间隔内, 同时处理多个任务, 并行是并发. 进程:表示一个正在执行的程序, 操 ...

  8. 潭州课堂25班:Ph201805201 tornado 项目 第九课 深入应用 WebSockets(课堂笔记)

    tornado 相关说明 在 handler 中创建一个  chat.py 文件,用来处理聊天室 在 templates 模板文件夹下创建 room.html 文件,是个聊天室 做好服务器的准备

  9. 潭州课堂25班:Ph201805201 django 项目 第九课 图片验证码前台实现,判断用户是否注册功能实现 (课堂笔记)

    u胎代码实现 : 针对每一个 app 写个 js 脚本, 先给 users 的 app 应用创建个 js:在指定目录下的 js 文件夹下,创建 users 文件夹,下创建 suth.js ,图片验证 ...

随机推荐

  1. Linux 入门记录:十二、Linux 权限机制【转】

    转自:https://www.cnblogs.com/mingc/p/7591287.html 一.权限 权限是操作系统用来限制资源访问的机制,权限一般分为读.写.执行. 系统中每个文件都拥有特定的权 ...

  2. mysql系列十三、mysql中replace into和duplicate key的使用区

    一.创建测试表 1.创建唯一索引"b" CREATE TABLE `test2` ( `id` int(10) NOT NULL AUTO_INCREMENT, `a` varch ...

  3. 转载: 使用vue全家桶制作博客网站 HTML5 移动网站制作的好教程

    使用vue全家桶制作博客网站   前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用vue全家桶制作的博客网站 概述 该项目是基于vue全家桶(vue. ...

  4. MySQL 命令行工具不能向表中插入中文的解决方法

    1.报错图示 解释:sname这个字段 解析出错. 2.解决方法 打开MySQL的安装目录,找到my.ini文件,把57和81行的utf8改成gbk后 保存,最后,重启MySQL的服务 即可. 3.测 ...

  5. InterruptedException 异常

    当一个方法后面声明可能会抛出InterruptedException 异常时,说明该方法是可能会花一点时间,但是可以取消的方法. 抛InterruptedException的代表方法有: 1. jav ...

  6. C++ code:浮点数的比较(Floating-Pointing Number Comparison)

    浮点数可以进行比较,但是浮点数由于表示精度在不同浮点数类型中的差异,所以会被误用.例如: #include <iostream> using namespace std; int main ...

  7. Renderscript图像处理

    作者:慧能 最近正在学习renderscript,后期会整理一篇完整的文档,先记着.... https://blog.csdn.net/codemydream/article/details/5346 ...

  8. 性能测试二十二:环境部署之Nginx

    由于单纯用tomcat只能通过ip+端口号的形式访问,这样只能访问一个tomcat,而真实项目中又不可能只用一两个tomcat,所以就需要Nginx来进行分配访问请求, Nginx本身性能非常好,据官 ...

  9. 性能测试十二:jmeter进阶之java请求参数化

    如项目中的ip.端口号之类的,都可以在此代码中定义 public Arguments getDefaultParameters() { // TODO Auto-generated method st ...

  10. 【C++ Primer 第11章 练习答案】2. 关联容器操作

    11.3.1节练习 [练习11.16]代码 map<int, int> m; auto iter = m.begin(); iter ->second = ;