Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页、QQ 聊天、收发 email 等等。要解决网络上两台主机之间的进程通信问题,首先要唯一标识该进程,在 TCP/IP 网络协议中,就是通过 (IP地址,协议,端口号) 三元组来标识进程的,解决了进程标识问题,就有了通信的基础了。

在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是IP地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。但是,网络地址只能确定进程所在的计算机,而一台计算机上很可能同时运行着多个进程,所以仅凭网络地址还不能确定到底是和网络中的哪一个进程进行通信,因此套接口中还需要包括其他的信息,也就是端口号(PORT)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,在一台计算机中,端口号和进程之间是一一对应关系。
所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程.

TCP通信的基本步骤如下:
服务端:socket---bind---listen------accept---recv---send-------close
客户端:socket---------connect---send---recv-------close

Server端

#!/usr/bin/env python
#-*-coding=utf-8-*-
import socket
#定义ip和端口,(元组)
ip_port = ('127.0.0.1',9999) #绑定协议,创建套接字,对象
s=socket.socket() #绑定ip+协议+端口:用来唯一标识一个进程,ip_port必须是元组格式
s.bind(ip_port)
#定义最大可挂起的链接数
s.listen(3)
#等待客户端的链接,conn相当于一条客户端和server端链接的通道,addr是客户端ip+port
conn,addr = s.accept() #server 每次接收最大值是1024字节
data = conn.recv(1024)
print(data.decode()) #server 端发送消息
conn.send(bytes('已收到',encoding='utf8')) s.close()

Client端

#!/usr/bin/env python
#-*-coding=utf-8-*-
import socket
ip_port = ('127.0.0.1',9999) #创建一个套接字对象
s=socket.socket() #连接服务端,如果服务端现在有一个连接,那么挂起,挂起个数在服务端配置
s.connect(ip_port) #客户端发送消息
#python 3.0以后只能发送字节,所以需要把字符串转换成字节
#s.send('消息已发送,请注意查收!') #错误格式
s.send(bytes('消息已发送,请注意查收!',encoding='utf8')) #客户端接收消息,每次接收最大值是1024字节
cli_recv = s.recv(1024)
print(cli_recv.decode()) #关闭
s.close()

最新文章

  1. EC笔记:第4部分:22、所有成员都应该是private的
  2. 打造TypeScript的Visual Studio Code开发环境
  3. 3.5电子书pc显示
  4. Ruby on Rails Tutorial 第二章 之 用户资源&MVC&REST
  5. Docker系列(四)Dockerfile
  6. FZU2138-久违的月赛之一
  7. python学习之list
  8. ssm工程集成mybatis分页插件pagehelper
  9. C语言中数组转化为字符串的方法
  10. Microsoft Windows Server 2012 Ad域搭建
  11. ext Table中CommandColumn用法
  12. java最简单实现Log打印和生成日志文件
  13. 在ASP.NET中使用KindEditor富文本编辑器
  14. JS 动态生成JSON对象
  15. 如何用Procmon.exe来监视SQLSERVER的logwrite大小
  16. 怎么设置Linux swap分区?方法教程
  17. Oracle学习笔记(二)——临时表
  18. tp查询范围
  19. LeetCode 167.两数之和(C++)
  20. angular解决压缩问题,和传送数据

热门文章

  1. python将列表按行写入csv
  2. "该公众号暂时无法提供服务,请稍后再试"的问题
  3. Spring — 循环依赖
  4. java语言基础(四)_面向对象_类_对象_封装_构造
  5. (五)ELK Logstash output
  6. Redis四大模式之主从配置
  7. 洛谷 P1640 SCOI2010 连续攻击游戏 并查集
  8. CSS让一个图片显示在另一个图片上面
  9. efcore 跨表查询,实现一个接口内查询两个不同数据库里各自的表数据
  10. Linux系统中虚拟设备文件的各种实用用法