TCP协议  面向连接 可靠的 面向字节流形式的

tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端

TCP协议编码流程:

服务器端:                  客户端

实例化对象                  实例化对象

绑定IP地址和端口号

监听

接收客户端的连接           连接服务器

收发                         收发

关闭                         关闭

问题:有的同学在重启服务端时可能会遇到

解决方法:

#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字
sk.listen() #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024) #接收客户端信息
print(ret) #打印客户端信息
conn.send(b'hi') #向客户端发送信息
conn.close() #关闭客户端套接字
sk.close() #关闭服务器套接字(可选)

tcp三次握手: 一定是client先发起请求

a 客户端发起请求连接服务器

b 服务器返回:接收到请求,并要求连接客户端

c 客户端回复:可以连接

四次挥手:  谁先发起断开连接的请求都可以

a 客户端发起断开连接的请求:

意思是: 我想和你断开连接,我没有数据要继续发送了,但是如果你有数据需要发送,我可以继续接收

b  服务器回复 : 我接收到你的请求了

c  服务器发送 : 我已经准备好断开连接了

d  客户端回复 : 收到你的信息,断开连接

tcp实现的一个聊天室, 可以实现一对多,但是必须断掉别人的连接, 然后才能和下一个人聊,本质还是一对一

只是创建一个死循环,让服务器一直处于待机状态

while 1:
conn,addr = sk.accept()
 import socket

 sk = socket.socket()
sk.bind(('127.0.0.1',8888))
sk.listen() while 1: conn,addr = sk.accept() msg_r = conn.recv(1024)
if msg_r.decode('utf-8') != 'q':
print(msg_r.decode('utf-8')) else:
break msg_s = input('>>>')
if msg_s != 'q':
conn.send(msg_s.encode('utf-8'))
else:
conn.send(msg_s.encode('utf-8'))
break

sever1

 import socket

 name = input('请输入你的名字:\n')

 sk = socket.socket()
sk.connect(('127.0.0.1', 8888)) while 1: msg_s = input('>>>')
if msg_s != 'q':
sk.send((name + msg_s).encode('utf-8'))
else:
sk.send(msg_s.encode('utf-8'))
break msg_r = sk.recv(1024)
if msg_r != 'q':
print(msg_r.decode('utf-8'))
else:
break sk.close()

client1

 import socket

 name = input('请输入你的名字:\n')

 sk = socket.socket()
sk.connect(('127.0.0.1', 8888)) while 1: msg_s = input('>>>')
if msg_s != 'q':
sk.send((name + msg_s).encode('utf-8'))
else:
sk.send(msg_s.encode('utf-8'))
break msg_r = sk.recv(1024)
if msg_r != 'q':
print(msg_r.decode('utf-8'))
else:
break sk.close()

client2

网络编程: 基于TCP协议的socket, 实现一对一, 一对多通信的更多相关文章

  1. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  2. C# socket网络编程 基于TCP协议

    socket 服务器端: 1.创建socket Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ...

  3. 网络编程: 基于UDP协议的socket

    udp是无链接的,启动服务之后可以直接接受消息,不需要提前建立链接 UDP协议的通信优势: 允许一个服务器同时和多个客户端通信, TCP不行 服务端 import socket sk = socket ...

  4. C#网络编程之---TCP协议的同步通信(二)

    上一篇学习日记C#网络编程之--TCP协议(一)中以服务端接受客户端的请求连接结尾既然服务端已经与客户端建立了连接,那么沟通通道已经打通,载满数据的小火车就可以彼此传送和接收了.现在让我们来看看数据的 ...

  5. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  6. 基于TCP 协议的socket 简单通信

    DNS 服务器:域名解析 socket 套接字 : ​ socket 是处于应用层与传输层之间的抽象层,也是一组操作起来非常简单的接口(接受数据),此接口接受数据之后,交由操作系统 为什么存在 soc ...

  7. 基于TCP协议的socket套接字编程

    目录 一.什么是Scoket 二.套接字发展史及分类 2.1 基于文件类型的套接字家族 2.2 基于网络类型的套接字家族 三.套接字工作流程 3.1 服务端套接字函数 3.2 客户端套接字函数 3.3 ...

  8. JAVA基础知识之网络编程——-基于TCP通信的简单聊天室

    下面将基于TCP协议用JAVA写一个非常简单的聊天室程序, 聊天室具有以下功能, 在服务器端,可以接受客户端注册(用户名),可以显示注册成功的账户 在客户端,可以注册一个账号,并用这个账号发送信息 发 ...

  9. java 网络编程基础 UDP协议的Socket:DatagramSocket;广播Socket:MulticastSocket

    什么是UDP协议: UDP协议是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket 但这两个 Socket之间并没有虚拟链路,这两个Socket只是发送.接收数据报的对象.Java 提供了 ...

随机推荐

  1. (4)Oracle基础--操作表中数据

    · 添加数据 <1> INSERT 语句 ① 向表中所有字段添加值   语法: INSERT INTO table_name (column1,column2...) VALUES(val ...

  2. 这几天bug多,自我检讨一下

    这段时间(主要指4月底到5月初)写的bug超过以往总和,觉得很有必要停一下,找找原因.所谓前车之鉴后车之师,不能也不应该在同一地方跌倒N次吧: 为什么bug频出? 深究原因,并不是代码量大.功能多,反 ...

  3. 【JS深入学习】—— 一句话解释闭包

    闭包的定义: 闭包(closuer)是一个受到保护的变量空间,由内嵌函数构成.就是说闭包内的变量不能被外部函数访问,为什么会这样? 函数的作用域: JS具有函数级的作用域,这表明外部函数不能访问内部函 ...

  4. sublime text 内调试Javascript代码

    转自:sublime内调试Javascript代码 之前用webstorm, 可以直接调试js, 在浏览器中也可以调试js,最近换了sublime text, 在想它是否支持调试js代码,于是找到了这 ...

  5. python 实现视频的下载以及断点续传

    ---恢复内容开始--- 一般情况下我们使用爬虫更多的应该是爬数据或者图片吧,今天在这里和大家分享一下关于使用爬虫技术来进行视频下载的方法,不仅可以方便的下载一些体积小的视频,针对大容量的视频下载同样 ...

  6. MySQL密码修改(四)

    一.修改破解MySQL密码 1.1:修改密码 在知道原始密码的情况下 [root@web1 ~]# mysqladmin -uroot -p -S /home/mysql/3307/mysql.soc ...

  7. (转)mysql自增列导致主键重复问题分析

    mysql自增列导致主键重复问题分析...  原文:http://www.cnblogs.com/cchust/p/3914935.html 前几天开发童鞋反馈一个利用load data infile ...

  8. 前端必备:FastStoneCapture 和 Licecap &&& mingw c++ 编译执行

    端必备:FastStoneCapture 和 Licecap FastStoneCapture这个软件非常小,只有2M多,并且其功能很强大,包括截图,录制视频,量尺,取色等等,对于前端工程师绝对是必备 ...

  9. Servlet基础知识点

    一.web.xml 的加载顺序是: ServletContext-> context-param ->listener -> filter -> servlet,而同个类型之间 ...

  10. 【树】Construct Binary Tree from Preorder and Inorder Traversal

    题目: Given preorder and inorder traversal of a tree, construct the binary tree. 思路: 线序序列的第一个元素就是树根,然后 ...