PythonSocket学习

学python ing 没怎么更ctf相关的blog

udp发送数据

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('hello'.encode('utf-8'),("192.168.253.1",9090))
s.close()

sendto有两个参数,data:要发送的二进制数据;address:参数为元组,元组里有两个元素:目标ip和端口号

udp接收数据

import socket

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
#绑定端口号的ip地址
s.bind(('192.168.253.1',9090))


data,addr=s.recvfrom(1024)
print(data.decode('utf-8'),"\n",addr[0],"\n",addr[1])
s.close()
# 接收到的数据打印结果
hello
 192.168.253.1 
 57398

综合一下

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('192.168.253.1',9001))
s.sendto('helloooo'.encode('gb18030'),("192.168.253.1",9000))

data,addr=s.recvfrom(1024)
print(data.decode('gb18030'),"\n",addr[0],"\n",addr[1])
s.close()

错误记录

一开始用的是utf-8编码,但是报错
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xce in position 1: invalid continuation byte

网上查了下,编码改成:gb18030 可以收中文了

bind端口号的意义

如果不进行bind的话,会发现每次发送数据的端口是不一样的
PythonSocket学习_第1张图片

TCP客户端建立

服务端如下:
PythonSocket学习_第2张图片
客户端发送消息:

import socket

#基于TCP协议的socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# udp直接使用sendto发送数据,tcp:connect,send
# tcp在发送数据之前,必须先和服务器建立连接
s.connect(('192.168.253.1',9000))
s.send('hello'.encode('utf8'))
s.close()

TCP服务端

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.253.1', 9000))
s.listen(128)  # 把socket变成一个被动监听的socket;128是队列长度
client_socket,client_addr=s.accept()
data=client_socket.recv(1024)
print('接收到了{}客户端{}端口号发送的数据,内容是{}'.format(client_addr[0],client_addr[1],data.decode('gb18030')))
s.close()

# 打印:接收到了192.168.253.1客户端16862端口号发送的数据,内容是你好,hello

9月周报回顾

就当socket的小练习了
PythonSocket学习_第3张图片

import socket
import hashlib
import re
HOST="49.235.47.62"
PORT=10000

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect((HOST,PORT))
data=" "
data3=" "
num=0
data=s.recv(512)
print("获取服务器信息:\n",data.decode("utf-8"))
for num in range(0,201):
    data3=s.recv(512)
    data2=data3.decode()
    data2= data2.replace('\n','')
    d2=data2.encode()
    print(d2)
    res= hashlib.sha256(d2).hexdigest()
    print("sha256加密结果:",res)
    data1=""
    for i in res:
        if i in "0123456789":
            data1=data1+i
    print("提取数字:",data1)
    num=num+1
    data1+='\n'
    s.sendall(data1.encode("utf-8"))
s.close

简易聊天

# udp版
import socket, threading

print("---欢迎来到简易聊天室---")
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
HOST = "192.168.253.1"
PORT = 9090
s.bind((HOST, PORT))


def send_msg():
    name = input("请输入本机昵称:")
    while True:
        mes = input(name+':')
        mes = name + ':' + mes + '\n'
        with open("demo.txt", 'a') as file: # demo.txt为聊天记录
            file.write(mes)
        s.sendto(mes.encode('gb18030'), (HOST, 9000))


def recv_msg():
    while True:
        data, addr = s.recvfrom(1024)
        with open("demo.txt", 'a') as file:
            file.write("来自ip{} 端口号{}的消息:{}\n".format(addr[0], addr[1], data.decode('gb18030')))
        # print("来自ip{} 端口号{}的消息:{}".format(addr[0],addr[1],data.decode('gb18030')))


t1 = threading.Thread(target=send_msg)
t2 = threading.Thread(target=recv_msg)
t1.start()
t2.start()

你可能感兴趣的:(Python)