网络编程之udp和tcp
1.window查看 网卡信息
2.IP地址的分类
一.udp相关知识
3.端口
4.进程
5.socket:(套接字)
创建一个socket
udp发送数据:
#具有退出循环功能的发送数据
import socket
def main():
#创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
#可以使用套接字发送数据
#udp_socket.sendto("hahhaha",对方的Ip以及port(接口号))
send_data = input("请输入你想要发送的信息....")
if send_data =="exit":
break
udp_socket.sendto(send_data.encode("utf-8"),("192.168.33.53",8080))
#关闭套接字
udp_socket.close()
if __name__ == "__main__":
main(
重点:接受udp数据
重点 接口绑定的问题
注:1:发送信息端口可以是随机的,不一定要绑本地信息,但是接受数据的话就要绑定本地信息。
2.同一个端口不能在同一时刻被用两次。
输入对方的IP,port,全双工,半双工,单工等
socket是属于全双工
二.TCP相关知识(重点)
特点:
1.面向连接
2.可靠传输
a tcp采用发送应答机制
b 超时重传
c 错误检验
d 流量控制和阻塞管理
TCP客户端
import socket
def main():
#1.创建套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2连接服务器
#tcp_socket.connect("192.168.33.11",7890)
server_ip = input("请输入来连接的服务器的IP:")
server_port = int(input("请输入要连接的服务器的port:"))
server_addr = (server_ip,server_port)
tcp_socket.connect(server_addr)
# 3发送数据/接受数据
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("utf-8"))
# 4关闭套接字
tcp_socket.close()
# 4关闭套接字
if __name__ =="__main__"():
main()
TCP服务器:(重点)
# -*- coding: utf-
import socket
def main():
# 1.买个手机(创建套接字 socket)
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.插入手机卡(绑定本地信息 bind)
tcp_server_socket.bind("",7890)
# 3. 将手机设置为正常的响铃模式(让默认的他套接字洋由主动变为被动 lisen)
tcp_server_socket.listen(128)
print("-----------")
# 4. 等待别人的电话到来(等待客户端i链接 accept)
new_client_socket,client_addr = tcp_server_socket.accept()
print(client_addr)
# 接受客户端发送过来的请求
recv_data = new_client_socket.recv(1024)
print(recv_data)
# 服务器给客户端发送消息
new_client_socket.send("hahhahah我收到你发的消息啦".encode("utf-8"))
#关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ =="__main__":
main()
循环为多个客户端服务:
# -*- coding: utf-8 -*-
# -*- coding: utf-
import socket
def main():
# 1.买个手机(创建套接字 socket)
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.插入手机卡(绑定本地信息 bind)
tcp_server_socket.bind("",7890)
# 3. 将手机设置为正常的响铃模式(让默认的他套接字洋由主动变为被动 lisen)
tcp_server_socket.listen(128)
#循环目的:调用多次accpet,从而为多个客户端服务
while True:
print("等待一个新的客户的到来...")
# 4. 等待别人的电话到来(等待客户端i链接 accept)
new_client_socket, client_addr = tcp_server_socket.accept()
print("一个新的客户端已经到来%s" %str(client_addr))
# 循环的目的为多个客户端服务多次
while True:
# 接受客户端发送过来的请求
recv_data = new_client_socket.recv(1024)
print("客户端送过来的请求是:%s"%recv_data.decode("utf-8"))
# 如果recv解堵塞,那么有两种方式
# 1.客户端发送过来的数据
# 2.客户端调用的close导致
if recv_data:
# 服务器会送给客户端发送消息
new_client_socket.send("hahhahah我收到你发的消息啦".encode("utf-8"))
else:
break
#关闭套接字
new_client_socket.close()
tcp_server_socket.close()
if __name__ =="__main__":
main()
udp是不面向数据的通信,而tcp是
udp: socket bind (收数据的话要绑定,发数据的话不用绑定) sendto/recvfrom close
tcp客户端: socket contect( ) send/recv close (一般不用绑定)
tcp服务器: socket bind listen accpet ( ) recv/send close