tcp通讯的服务器和客户端解析

服务器端编程步骤,
1.创建Socket对象,下文中的socket都表示一个socket对象
2.绑定IP地址和端口,服务器的IP和端口
3.开始监听,将在指定的端口上监听,listen()
如果对方申请连接这个IP和端口,将被听到,这个过程
4.获取用于传输数据的Socket对象
socket.accept() ->(socket object,address info) 默认阻塞(线程不会停止但也不会执行后续程序)直到条件改变,
但是监听不会阻塞,外界仍可以查到这个端口正在监听
外边有客户端访问请求,获取到一个新的Socket对象和客户端地址的二元组.阻塞会解除,原来的socket的对象的监听不会停止,使用 socket.close()可以关闭监听,关闭监听就无法建立新的连接了
获取到一个新的Socket对象可以等待它发数据来接收或者发数据给它或者同时发数据并等待接收
要想对多个客户端通信需要再次设置socket.accept()(socket为原来监听的socket对象),每次要与一个客户端建立一次连接就需要设置一次socket.accept(),这样只能一次一次的建立连接,如果要同时建立多条连接的需要可以
把它的接收建立连接的请求设置在循环中,然后把与每条连接的会话放入一个线程中.这样就能在很短的时间建立多条连接了
5.使用新的Socket对象接收数据,和
data=socket.recv(1024)  要设定接收数据的大小.这个过程默认阻塞,对方申请连接后,并传递来信息,这句程序就能够执行,收到信息后这句话执行完毕,解除阻塞.
这句语句执行完毕后,客户端再有信息发送也不会收到,设置循环接收才可以不断接收数据. 这个过程中不断有阻塞等待,与会话本身无关的代码的执行手动阻碍,可以把会话放入一条线程,或者把其他操作放入线程,使得它们能够更快执行
除了接收也可以发送数据,socket.send(bytes) 发送字节型数据 ,发送数据不会有阻塞,所以没必要专门为它开辟线程
6.结束连接
结束监听,socket.close(),在不需要建立连接时就可以这么做了
结束与一个客户端的会话,对这个会话的Socket对象使用socket.close()立刻结束会话
在接收客户端的数据时,对方宕机等原因结束了会话,在data=socket.recv(1024)会报错,一般需要捕获这个可能的错误,然后关闭会话
程序结束,socket对象没有全部关闭,可能会代来一定的问题
tcp客户端编程步骤
1.创建Socket对象
2.不需绑定己方IP和端口,己方IP和端口由系统分配
3.连接服务器方的IP和端口socket.connect((‘127.0.0.1’,9999)),如果此时服务器和端口端没有listen(),就会报错
可以设置捕获错误. 如果服务器端触发了.accept(),就可以数据传输了
4.数据传输,使用Socket对象socket.send()发送数据和接收数据socket.recv(1024),这里接收数据是默认阻塞的,开辟线程执行别的程序或执行接收数据可以缓解等待.
收到信息后,这句话执行完毕,解除阻塞. 接收数据时对方宕机会接收数据时报错,需要设置捕获错误的代码
一般需要主动连接后,才能接收数据,不过
5.关闭连接
使用socket对象.close()就关闭了,不在能接收和发送数据
服务器依然可以发送数据,只是没有接收,所以一般要通过发送语句通知服务器端断开连接
tcp服务器端和客户端通讯的相同与区别
两者发送和接收对方的信息的方法相同
客户端需要connect才能发送信息,服务器端不需要连接就能发送信息(能指的是发出信息而不报错)
群聊实现分析:客户端发送信息到服务器,服务器返回相同信息到所有与它相连的客户端,这就实现了群聊

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90706

(4)
daishitongdaishitong
上一篇 2018-01-01 18:17
下一篇 2018-01-01 19:36

相关推荐

  • N25-第十一周

    1、详细描述一次加密通讯的过程,结合图示最佳。 发送者: 1.使用单项加密算法提取生成数据的特征码 2.使用自己的私钥加密特征码附加在数据后面 3.生成用于对称加密的临时密钥 4.用此临时密钥加密数据和已经使用私钥加密后的特征码 5.使用接收方的公钥加密此临时密钥,附加在对称后的数据后方 接收方: 1.使用自己的私钥解密的临时秘钥;从而获得对方的对称密钥 2…

    2017-06-05
  • MySQL主从复制: MHA

                    MySQL主从复制: MHA 前言 MHA的架构 环境部署 实验步骤 总结 前言 上篇文章我们实现了MySQL的主从复制, 但是我们之前就说过, 主从复制是有很多问题的…

    Linux干货 2016-04-28
  • 一次完整的HTTP事务是怎样一个过程?

    声明:本文章中的说法仅是个人理解总结,不一定完全正确,但是可以有助于理解。 关于HTTP协议可以参考以下: HTTP协议漫谈 http://kb.cnblogs.com/page/140611/ HTTP协议概览 http://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html 了解HTTP Heade…

    Linux干货 2015-03-10
  • mysql5.5.32多实例配置

    操作系统:CentOS release 6.7 (Final) 内核版本:2.6.32-573.el6.x86_64 mysql版本号:mysql-5.5.32 1)安装mysql所需的依赖包 # adduser mysql -s /sbin/nologin -M # mkdir -p&n…

    Linux干货 2016-12-05
  • btr文件系统与网络基础

    btrfs文件系统技术预览版Btrfs (B-tree, Butter FS, Better FS), GPL, Oracle, 2007, CoW核心特性:多物理卷支持:btrfs可由多个底层物理卷组成;支持RAID,以及联机“添加”、“移除”,“修改”写时复制更新机制(CoW):复制、更新及替换指针,而非“就地”更新数据及元数据校验码:checksum子…

    Linux干货 2016-09-02
  • 高可用keepalived+haproxy实现动静分离

    高可用keepalived+haproxy: 实验环境: clientIP为:172.18.254.149 VIRROUTEIP为:172.18.61.5 keepalived+haproxy机器1IP为172.18.61.1 keepalived+haproxy机器2IP为172.18.61.2 server1IP为172.18.61.3 server2I…

    2017-05-17