1. ip地址由网络号和主机号组成,C类网络第一个区间是110开头,及192到208之间。私有地址192.168.0.0到192.168.255.255。端口是0-65535,不要使用0到1023之内有特殊指定的,我们在指定端口的时候,不需要使用。
2. Socket是传输层供给应用层的编程接口。TCP协议需要建立专门的虚拟连接,发送的可靠数据。UDP则不需要建立连接,直接一端发送就可以了。
'''
udp发送数据
'''
#导入模块
from socket import socket,AF_INET,SOCK_DGRAM
udp_socket = socket(AF_INET,SOCK_DGRAM)
#创建地址
addr=('192.168.237.1',8080)
#发送信息
sendinfo =input('发送的内容:')
#调用sendto方法进行发送
udp_socket.sendto(sendinfo.encode('gb2312'),addr)
#关闭socket接口
udp_socket.close()
'''
upd发送数据,接收数据
'''
from socket import *
udp_socket =socket(AF_INET,SOCK_DGRAM)
#对端地址
addr=('192.168.237.1',8080)
#接收信息则需要绑定地址
udp_socket.bind(('',8989))
#对端接收信息
data =input("请输入你要发送的内容:")
#使用sendto发送数据
udp_socket.sendto(data.encode('gb2312'),addr)
#接收信息的大小
reve_data=udp_socket.recvfrom(1024)
print('接收到%s的信息是:%s'%(reve_data[1],reve_data[0].decode('gb2312')))
#关闭socket
udp_socket.close()
3.TFTP,简单文件传输协议,实现客户端与服务器文件传输,tftp是69端口,基于udp协议。因为服务器一般都是可靠的,所以基于TFTP协议,那么实现编写的就是TFTP客户端。
'''
TFTP下载编程
'''
import struct
from socket import *
server_ip ='127.0.0.1'
file_name='1.jpg'
#封装读请求
send_data=struct.pack('!H%dsb5sb'%len(file_name),1,file_name.encode(),0,'octet'.encode(),0)
#建立套接字
udp_socket=socket(AF_INET,SOCK_DGRAM)
udp_socket.sendto(send_data,(server_ip,69))
#本地创建文件
file=open(file_name,'ab')
while True:
reve_date=udp_socket.recvfrom(1024)
#获取操作码和数据块编号
zaozuoma,datas=struct.unpack('!HH',reve_date[0][:4])
if zaozuoma == 5:
print('文本不存在!')
break
file.write(reve_date[0][4:])
if len(reve_date[0])<516:#表示读完
break
#发送确认包
ack_data=struct.pack('!HH',4,datas)
udp_socket.sendto(ack_data,(server_ip,reve_date[1][1]))
4.TCP是安全可靠的,是因为要建立3次握手,及双方都需要确认信息后,才能进行通讯。
编码1:
'''
tcp服务端编程
'''
from socket import *
#创建服务器套接字对象
socket_tcp=socket(AF_INET,SOCK_STREAM)
#绑定端口
socket_tcp.bind(('',9999))
#进行监听
socket_tcp.listen()
#接收客户端连接
client_socket,client_info=socket_tcp.accept()
#接收客户端发送的信息
reve_data=client_socket.recv(1024)
print('接收到来自%s的信息%s'%(client_info,reve_data.decode('gb2312')))
#关闭连接
client_socket.close()
socket_tcp.close()
'''
模拟客户端qq通讯
'''
from socket import *
#创建客户端socket
client_socket=socket(AF_INET,SOCK_STREAM)
#调用connect方法与服务器建立连接
client_socket.connect(('192.168.0.101',8899))
while True:
msg=input('客户端:')
client_socket.send(msg.encode('utf-8'))
if msg == 'bye':
break
client_date=client_socket.recv(1024)
print('服务器:',client_date.decode('utf-8'))
client_socket.close()
编码2:模拟qq进行多人通讯
'''
服务器端TCP
'''
from socket import *
from threading import Thread
sockets = []
def main():
# 创建服务器端socket
server_tcp = socket(AF_INET, SOCK_STREAM)
# 绑定地址
server_tcp.bind(('', 8999))
# 开启监听
server_tcp.listen()
while True:
client_tcp, client_info = server_tcp.accept()
sockets.append(client_tcp)
t1 = Thread(target=readToSend, args=(client_tcp,))
t1.start()
def readToSend(client_tcp):
while True:
client_data = client_tcp.recv(1024)
if client_data.decode('utf-8').endswith('bye'):
sockets.remove(client_tcp)
client_tcp.close()
break
if len(client_data)>0 :
for Onesocket in sockets:
if Onesocket != client_tcp:
Onesocket.send(client_data)
if __name__ == '__main__':
main()
'''
多线程客户端
'''
from socket import *
from threading import Thread
#创建客户端套接字
client_tcp=socket(AF_INET,SOCK_STREAM)
#创建连接对象
client_tcp.connect(('192.168.0.101',8999))
user_name=input("请输入用户名:")
flag=True
def writeInfo(client_tcp):
global flag
while flag:
mags=input('>')
mags=user_name+'说:'+mags
client_tcp.send(mags.encode('utf-8'))
if mags.endswith('bye'):
flag=False
def readInfo(client_tcp):
while flag:
client_data=client_tcp.recv(1024)
print('收到:',client_data.decode('utf-8'))
#创建读写线程
t1=Thread(target=readInfo,args=(client_tcp,))
t1.start()
t2=Thread(target=writeInfo,args=(client_tcp,))
t2.start()
t1.join()
t2.join()
client_tcp.close()