TCP编程
Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。
客户端
大多数连接都是可靠的TCP连接。创建TCP连接时,主动发起连接的叫客户端,被动响应连接的叫服务器。
举个例子,当我们在浏览器中访问新浪时,我们自己的计算机就是客户端,浏览器会主动向新浪的服务器发起连接。如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。
所以,我们要创建一个基于TCP连接的Socket,可以这样做:
客服端基本思路是:
1.创建套接字;
2.建立连接;
3.发送数据;
4.接收数据;
5.关闭连接。
实例:
'''客户端'''
import socket
# # 1、套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、创建链接
tcp_socket.connect(('172.27.35.1',8080))
# 3、发送信息
tcp_socket.send('你好'.encode('gbk'))
# 4、接收数据
ret = tcp_socket.recv(1024)
print(ret.decode('gbk'))
#5.关闭连接
tcp_socket.close()
服务端:
基本思路为:
1、创建socke套接字;
2、需要使用bind来绑定端口;
3、listen监听模式,等待接收用户的链接,使得套接字变成被动状态;
4、accept处理用户链接
示例:
import threading
import socket
def recv_data(service_client_socket):
'''这个函数主要创建接收客户端的消息'''
# 收消息
try:
while True:
data = service_client_socket.recv(1024)
if data:
print(data.decode('gbk'))
else:
service_client_socket.close()
break
except Exception as e:
print(e)
if __name__ == '__main__':
# 1、套接字
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2、需要使用bind来绑定端口
server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)
server_socket.bind(("",8080))
# 3、listen监听模式,等待接收用户的链接,使得套接字变成被动状态
server_socket.listen()
while True:
# 主程序里面只是实现创建新的服务套接字
service_client_socket,client_addressinfo = server_socket.accept()
print(service_client_socket)
print(client_addressinfo)
# 服务套接字服务的过程扔给多线程取处理,此时并不影响主程序床架服务套接字
recv_thread = threading.Thread(target=recv_data,args=(service_client_socket,))
recv_thread.start()
TCP注意点:
1、 TCP服务器一般情况下,需要绑定,不绑定客户端找不到;
2、 TCP的客户端不需要绑定,主动链接服务器,这个时候,只需要知道服务器的IP和端口;
3、 TCP服务端通过Listen ()这个函数变主动为被动;
4、 客户端必须通过connect之后才能与服务端通信;
5、 accept()这个函数会创建一个新的套接字,这个套接字用来服务对应的客户端;
6、 关闭新的套接字(人工客服),说明服务已经完成;
7、 一般情况下,服务器的套接字不用关闭;
8、 server_ocket在关闭之后,新的客户端不能进行链接,但是已经链接的客户端正常通信|