知识点:之前讲的udp协议传输数据是不安全的,不可靠不稳定的,tcp协议传输数据安全可靠,因为它们的通讯机制是不一样的。udp是用户数据报传输,也就是直接丢一个数据包给另外一个程序,就好比寄信给别人,信丢了你也不知道,tcp传输需要先和服务端建立连接,当客户端与服务器连接时,服务器会给出应答,我俩连上了,而且数据传过来还会进行一个数据包数量验证,不一致会重新发送,还有其他种种验证,总之保证了数据传输安全可靠

 

这一章主要介绍使用套接字,编写一个tcp协议客户端和服务端。同样要用到上一章节提到小工具,网络调试助手作为客户端或服务端与编写的服务端或客户端进行通讯验证

1、客户端,详情看代码注解:

import socket

def client_main():
# 创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # SOCK_STREAM代表tcp协议 # 与服务端建立连接
server_ip = input('请输入ip地址:')
server_port = int(input('请输入端口号:'))
tcp_socket.connect((server_ip, server_port)) # 使用connect方法与服务器进行连接 # 发送数据
tcp_date = input('请输入要发送的数据:')
tcp_socket.send(tcp_date.encode('utf-8')) # 关闭套接字
# tcp_socket.close() if __name__ == '__main__':
client_main()

交互效果如下:

2、服务端开发,下面的代码是先把主流程写通,往下面再附上优化后的服务端代码

import socket

def server():
# 创建套接字
tcp_socket_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定地ip和端口
tcp_socket_server.bind(('',7785)) # 监听套接字,因为创建的套接字默认是主动给别人发消息,作为服务端,要随时监听别人发来的请求连接
tcp_socket_server.listen(128) # 当客户端发来与服务端连接成功后,使用accept方法解堵塞,accept返回一个有俩个值的元祖,需要拆包
# 拆包后,第一个值是新的套接字,也就是连接进来的的客户端,此时新的套接字开始于客户端进行通讯,第二个值是新的套接字这个客户端的ip和端口
new_socket_clien,new_socket_addres = tcp_socket_server.accept() # 接收客户端发来的消息
tcp_data = new_socket_clien.recv(1024)
print(tcp_data.decode('gbk')) # 关闭套接字,先关闭新的套接字,再关闭监听套接字
new_socket_clien.close()
tcp_socket_server.close() if __name__ == '__main__':
server()

交互效果如图:

 3、服务端代码优化,1、循环等待新的客户端到来 2、循环为一个客户端提供服务:

#!/usr/bin/env python
# coding=utf-8
# author:刘仲
# datetime:2018/7/20 9:25
# software: PyCharm import socket def server():
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 绑定ip和端口
# server_ip = input('请输入ip:')
# server_port = int(input('请输入端口号:'))
tcp_server_socket.bind(('192.168.1.110', 7598)) # 监听套接字
tcp_server_socket.listen(128) # listen里面的参数代表最多监听128个客户端,参数最大不能超过1024 # 循环等待新的客户端到来
while True:
# 等待客户端发消息
# 当客户端连接成功后,accept进行解堵塞,返回一个元祖,然后对元祖进行拆包,拆包后第一个值是客户端新的套接字,使用这个新的套接字
# 为这个客户端服务,第二个值是连进来这个客户端的地址
print('等待新的客户端到来......')
new_socket_server, new_socket_adress = tcp_server_socket.accept()
print('新的客户端来啦......')
while True:
tcp_data = new_socket_server.recv(1024) # 接收客户端消息
print('客户端发来的消息:%s' % tcp_data.decode('gbk'))
if tcp_data:
new_socket_server.send('已收到'.encode('utf-8')) # 服务器给个回应给客户端
elif not tcp_data:
break
new_socket_server.close() # 关闭新的套接字
tcp_server_socket.close() # 关闭监听套接字 if __name__ == '__main__':
server()

解释如下:

二、网络编程-socket之TCP协议开发客户端和服务端通信的更多相关文章

  1. Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令.

    Python进阶----SOCKET套接字基础, 客户端与服务端通信, 执行远端命令. 一丶socket套接字 什么是socket套接字: ​ ​  ​ 专业理解: socket是应用层与TCP/IP ...

  2. java网络编程socket\server\TCP笔记(转)

    java网络编程socket\server\TCP笔记(转) 2012-12-14 08:30:04|  分类: Socket |  标签:java  |举报|字号 订阅     1 TCP的开销 a ...

  3. 网络编程Socket之TCP之close/shutdown具体解释(续)

    接着上一篇网络编程Socket之TCP之close/shutdown具体解释 如今我们看看对于不同情况的close的返回情况和可能遇到的一些问题: 1.默认操作的close 说明:我们已经知道writ ...

  4. Java实现TCP之Echo客户端和服务端

    Java实现TCP之Echo客户端和服务端 代码内容 采用TCP协议编写服务器端代码(端口任意) 编写客户机的代码访问该端口 客户机按行输入 服务器将收到的字符流和接收到的时间输出在服务器consol ...

  5. Netty入门之客户端与服务端通信(二)

    Netty入门之客户端与服务端通信(二) 一.简介 在上一篇博文中笔者写了关于Netty入门级的Hello World程序.书接上回,本博文是关于客户端与服务端的通信,感觉也没什么好说的了,直接上代码 ...

  6. python 之 网络编程(基于TCP协议的套接字通信操作)

    第八章网络编程 8.1 基于TCP协议的套接字通信 服务端套接字函数 s.bind() 绑定(主机,端口号)到套接字 s.listen() 开始TCP监听 s.accept() 被动接受TCP客户的连 ...

  7. 网络编程Socket之TCP

            服务端: 1. 创建 ServerSocket 对象并监听一个端口 2. 调用accept()方法等待客户端的连接(阻塞式) 3. 输入流(记取客户端发送过来的数据) 4. 输出流(响 ...

  8. 网络编程之Socket的TCP协议实现客户端与客户端之间的通信

    我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...

  9. Python socket编程客户端与服务端通信

    [本文出自天外归云的博客园] 目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM ...

随机推荐

  1. Confluence 6 管理协同编辑 - 修改你的 Synchrony 配置

    你不能通过 Confluence UI 修改 Synchrony 的配置.配置的修改是通过系统属性进行修改的.在绝大部分情况下,你不需要对默认的配置进行修改.  修改 Synchrony 运行的端口. ...

  2. Confluence 6 配置 HTTP 超时设置

    当宏,例如 RSS Macro 进行 HTTP 请求的时候,有可能因为请求的时间比较长,而导致超时.你可以通过设置系统参数来避免这个问题. 配置 HTTP 超时设置: 在屏幕的右上角单击 控制台按钮  ...

  3. Confluence 6 MBeans

    你可以使用下面的 Confluence MBeans  来实时查看你 Confluence 实例运行的实时信息. CacheStatistics 这个 MBean 显示了 Confluence 有关的 ...

  4. poj1155 依赖背包

    /* 依赖背包 dp[i][j]表示i结点为根的树选择j个用户时的最大剩余费用 即背包容量是j,价值是最大费用 */ #include<iostream> #include<cstr ...

  5. 在lnmp环境下,将原来的PHP7.0升级到PHP7.2

    基础环境: 系统:centos6.8   环境:lnmp 停止PHP7.0的版本,在做如下操作: 1.下载php-7.2.6.tar.bz2软件包放在/opt 路径下 mkdir /usr/local ...

  6. 把tomcat服务器配置为windows服务的方法

    转自:http://ykyfendou.iteye.com/blog/2032916 使用tomcat开发的项目,我们把项目交付给客户的时候,客户都不希望在每次开机的时候都要启动一下tomcat服务器 ...

  7. JWT实战

    JWT实战 2018年03月02日 22:36:21 阅读数:129 JWT认证流程 先来回顾下JWT的流程,jwt是存储在客户端的,服务器不需要存储jwt;客户端每次发送请求时携带token,然后到 ...

  8. C++ Primer 笔记——标准库类型string

    1.如果使用等号初始化一个变量,实际上执行的是拷贝初始化,编译器吧等号右侧的初始值拷贝到新创建的对象中去:如果不使用等号则执行的是直接初始化. std::string str = "Test ...

  9. 该问题是需要导包!!!需要pom中添加依赖The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application

    <!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl --><depend ...

  10. Spark核心RDD、什么是RDD、RDD的属性、创建RDD、RDD的依赖以及缓存、

    1:什么是Spark的RDD??? RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变.可分区.里面的元素可并行 ...