网络编程: 基于TCP协议的socket, 实现一对一, 一对多通讯

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

 

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

 

TCP协议编码流程:socket

服务器端:                  客户端tcp

实例化对象                  实例化对象ide

绑定IP地址和端口号         编码

监听spa

接收客户端的链接           链接服务器3d

收发                         收发code

关闭                         关闭对象

 

 

 

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

解决方法: 

#加入一条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()        #关闭服务器套接字(可选)
View Code

 

 

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

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

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

             c 客户端回复:能够链接

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

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

                  意思是: 我想和你断开链接,我没有数据要继续发送了,可是若是你有数据须要发送,我能够继续接收

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

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

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

 

 

 tcp实现的一个聊天室, 能够实现一对多,可是必须断掉别人的链接, 而后才能和下一我的聊,本质仍是一对一

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

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

 

 1 import socket
 2 
 3 
 4 sk = socket.socket()
 5 sk.bind(('127.0.0.1',8888))
 6 sk.listen()
 7 
 8 while 1:
 9 
10     conn,addr = sk.accept()
11 
12     msg_r = conn.recv(1024)
13     if msg_r.decode('utf-8') != 'q':
14         print(msg_r.decode('utf-8'))
15 
16     else:
17         break
18 
19     msg_s = input('>>>')
20     if msg_s != 'q':
21         conn.send(msg_s.encode('utf-8'))
22     else:
23         conn.send(msg_s.encode('utf-8'))
24         break
sever1
 1 import socket
 2 
 3 name = input('请输入你的名字:\n')
 4 
 5 sk = socket.socket()
 6 sk.connect(('127.0.0.1', 8888))
 7 
 8 
 9 while 1:
10 
11     msg_s = input('>>>')
12     if msg_s != 'q':
13         sk.send((name + msg_s).encode('utf-8'))
14     else:
15         sk.send(msg_s.encode('utf-8'))
16         break
17 
18     msg_r = sk.recv(1024)
19     if msg_r != 'q':
20         print(msg_r.decode('utf-8'))
21     else:
22         break
23 
24 sk.close()
client1
 1 import socket
 2 
 3 name = input('请输入你的名字:\n')
 4 
 5 sk = socket.socket()
 6 sk.connect(('127.0.0.1', 8888))
 7 
 8 while 1:
 9 
10     msg_s = input('>>>')
11     if msg_s != 'q':
12         sk.send((name + msg_s).encode('utf-8'))
13     else:
14         sk.send(msg_s.encode('utf-8'))
15         break
16 
17     msg_r = sk.recv(1024)
18     if msg_r != 'q':
19         print(msg_r.decode('utf-8'))
20     else:
21         break
22 
23 sk.close()
client2
相关文章
相关标签/搜索