网络编程,IP地址、端口、tcp、socket、TCP客户端,服务端和TCP多任务版服务端程序

1. IP地址的概念
IP地址就是标识网络中设备的一个地址,
查看IP地址:
win: ipconfig
Linux 和 mac OS:ifconfig

检查网络是否正常
ping命令
ping www.baidu.com

2.端口和端口号

端口
端口是传输数据的通道
每一个端口都有一个对应的端口号,

端口号的分类:
知名端口号:0-1023
动态端口号:1024-65535
开发应用程序使用的端口号一般是动态端口号

3.TCP
tcp:传输控制协议,是一种面向连接的,可靠的,基于字节流的传输层通信协议

4.socket

进程之间网络数据的传输可以通过socket 来完成,socket 就是进程间网络数据通信的工具

5.tcp客户端程序开发流程

1.创建客户端套接字对象 socket
2.和服务端套接字建立联系 connect
3.发送数据 send
4.接受数据 recv
5.关闭客户端套接字 close

6.tcp服务端程序开发流程

1.创建服务端套接字对象 socket
2.绑定端口号 bind
3.设置监听 listent
4.等待接受客户端的连接请求 accept
5.接收数据 recv
6.发送数据 send
7.关闭套接字 close

7.开发tcp客户端代码

a.导入 socket 模块
import socket

b.创建客户端 socket 对象
socket.socket(AddressFamily, Type)

c.参数说明:

1. AddressFamily 表示IP地址类型, 分为IPv4和IPv6
2. Type 表示传输协议类型

d.方法说明:

1. connect((host, port)) 表示和服务端套接字建立连接, host是服务器ip地址,port是应用程序的端口号
2. send(data) 表示发送数据,data是二进制数据
3. recv(buffersize) 表示接收数据, buffersize是每次接收数据的长度
导入socket模块
import socket
创建入口
if __name__ == '__main__':
创建socket客户端套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
和服务端应用程序建立联接
tcp_socket.connect(("192.168.131.62",8080))
准备发送的数据
send_data = input("请输入客户端要输入的信息:").encode("gbk")
发送数据
tcp_socket.send(send_data)
这次接收数据最大的字节是1024
recv_data = tcp_scoket.recv(1024)
对接收的数据进行解码
recv_content = recv_data.decode("gbk")
输出接收到的数据
print("接收服务端的信息为:",recv_content)
关闭套接字
tcp_socket.close

1.导入socket模块
2.创建TCP套接字‘socket’
参数1: ‘AF_INET’, 表示IPv4地址类型
参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
3.发送数据‘send’
参数1: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
4.接收数据‘recv’
参数1: 表示每次接收数据的大小,单位是字节
5.关闭套接字‘socket’表示通信完成

8. tcp 服务端开发代码

a.导入 socket 模块
import socket

b. 创建服务端 socket 对象
socket.socket(AddressFamily, Type)

c. 参数说明:

1. AddressFamily 表示IP地址类型, 分为IPv4和IPv6
2. Type 表示传输协议类型

d. 方法说明:

1. bind((host, port)) 表示绑定端口号, host 是 ip 地址,port 是端口号,ip 地址一般不指定,表示本机的任何一个ip地址都可以。
2. listen (backlog) 表示设置监听,backlog参数表示最大等待建立连接的个数。
3. accept() 表示等待接受客户端的连接请求
4. send(data) 表示发送数据,data 是二进制数据
5. recv(buffersize) 表示接收数据, buffersize 是每次接收数据的长度
导入socket模块
import socket
创建入口
if __name__ == '__main__':
 创建tcp服务端套接字
server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  设置端口复用,让程序退出端口号立即释放
server.socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,Ture)
 给程序绑定端口号
server_socket.bind(("",8090))
 设置监听
 # listen后的这个套接字只负责接收客户端连接请求,不能收发消息,收发消息使用返回的这个新套接字来完成
server_socket.listen(128)
等待客户端建立联系
new_server_socket, ip_port = tcp_server_socket.accept()
 输入客户端的IP和端口号
print("客户端的IP地址和端口号:",ip_port)
 接受哦客户端发送的数据,这次接受的数据最大字节是1024
recv_data = new_server_socket.recv(1024)
获取数据长度
# recv_data_length = len(recv_data)
# print("接受数据的长度为:'recv_data_length)
 对二进制数据进行解码
recv_content = recv_data.decode("gbk")
 
print("接收客户端的数据为:",recv_content)
 准备发送数据
send_data = "ok,问题正在处理中..."encode("gbk")
 发送数据给客户端
new_server_socket.send(send_data)
关闭服务与客户端的套接字,终止和客户端通信服务
new_server_socket.close()
 关闭服务端的套接字,终止和客户提供建立连接请求的服务
server_socket.close()
1.导入socket模块
2.创建TCP套接字‘socket’
    参数1: ‘AF_INET’, 表示IPv4地址类型
    参数2: ‘SOCK_STREAM’, 表示TCP传输协议类型
3.绑定端口号‘bind’
    参数: 元组, 比如:(ip地址, 端口号)
4.设置监听‘listen’
    参数: 最大等待建立连接的个数
5.等待接受客户端的连接请求‘accept’
6.发送数据‘send’
    参数: 要发送的二进制数据, 注意: 字符串需要使用encode()方法进行编码
7.接收数据‘recv’
    参数: 表示每次接收数据的大小,单位是字节,注意: 解码成字符串使用decode()方法
8.关闭套接字‘socket’表示通信完成

9. tcp网络应用程序的注意点

1.tcp网络应用程序的注意点介绍

1. 当 TCP 客户端程序想要和 TCP 服务端程序进行通信的时候必须要先建立连接
2. TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
3. TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
4. listen 后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
5. 当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
6. 关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。
7. 关闭 listen 后的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信。
8. 当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已经下线,
    反之服务端关闭套接字,客户端的 recv 也会解阻塞,返回的数据长度也为0。

10.多任务版tcp服务端开发

导入socket模块
import socket
导入threading线程模块
import threading/multiprocesing
处理客户端的请求操作
def handle_client_request(service_client_socket, ip_port)
循环接收客户端发送的数据
	while True:
	接收客户端发送的数据
	    recv_data = service_client.recv(1024)
	    if recv_data:
		print(recv_data.decode("gbk"),ip_port)
		回复
		service_client_socket.send("ok,问题正在处理中...".encode("gbk"))
	    else:
	           print("客户端下线了:",ip_port)
	           break
	 终止和客户端进行通信
	service_client_socket.close()

if __name__ == "__main__":
   # 创建tcp服务端套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置端口号复用,让程序退出端口号立即释放
    tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    # 绑定端口号
    tcp_server_socket.bind(("",9090))
    设置监听,listen后的套接字是被动套接字,只负责接收客户端的连接请求
    tcp_server_socket.listen(128)
    循环等待接收客户端的连接请求
    while True:
    等待接受客户端的连接请求
	service_client_socket, ip_port = tcp_server_socket.accept
	
	print("连接成功:"ip_port)
	当客户端和服务端建立连接成功以后,需要创建一个子线程,不同子线程负责接收不同客户端的消息
	sub_thread = threading.Thread(target=handle_client_request,args=(service_client_socket,ip_port))
	设置守护主线程
	sub_thread.setDaemon(True)
	启动子线程
	sun_thread.start()

11.socket之send和recv原理剖析

  1. 认识TCP socket的发送和接收缓冲区

当创建一个TCP socket对象的时候会有一个发送缓冲区和一个接收缓冲区,这个发送和接收缓冲区指的就是内存中的一片空间。
2. send原理剖析

send是不是直接把数据发给服务端?

不是,要想发数据,必须得通过网卡发送数据,应用程序是无法直接通过网卡发送数据的,它需要调用操作系统接口,
也就是说,应用程序把发送的数据先写入到发送缓冲区(内存中的一片空间),再由操作系统控制网卡把发送缓冲区的数据发送给服务端网卡 。
3. recv原理剖析

recv是不是直接从客户端接收数据?

不是,应用软件是无法直接通过网卡接收数据的,它需要调用操作系统接口,由操作系统通过网卡接收数据,
把接收的数据写入到接收缓冲区(内存中的一片空间),应用程序再从接收缓存区获取客户端发送的数据。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值