python网络编程-socket

创建TCP套接字

import socket
# 创建tcp套接字    socket.SOCK_STREAM  TCP       socket.SOCK_DGRAM  UDP
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 关闭套接字
s.close()

创建UDP 套接字

import socket
# 创建tcp套接字    socket.SOCK_STREAM  TCP       socket.SOCK_DGRAM  UDP
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 关闭套接字
s.close()

UDP 发送数据

Servers 端

import socket
# 创建tcp套接字
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 准备接收方地址
dest_addr =('192.168.199.101',8080)
# 绑定本地信息    ip一般不写,表示本机的任何一个地址
local_addr = ('', 8888)

s.bind(local_addr)

send_date = input("请输入数据")

s.sendto(send_date.encode('utf-8'),dest_addr)
# 关闭套接字
s.close()

Cllient

# -*- coding: UTF-8 -*-
from socket import *

def main():
    # 创建套接字
    s = socket(AF_INET, SOCK_DGRAM)
    # 绑定本地信息    ip一般不写,表示本机的任何一个地址
    local_addr = ('', 8888)

    s.bind(local_addr)
    # 等待接收方发送数据  recvfrom 没有数据时会阻塞
    recv_data = s.recvfrom(1024)  # 1024表示本次接收的最大字节数
    # 显示接收到数据
    print(recv_data)  #   (b'数据', ('127.0.0.1 发送方IP', 8080 端口))
    # windows 接收数据使用 gbk解码    Linu下 使用发送方格式解码
    print(recv_data[0].decode("gbk"))
    # 关闭套接字
    s.close()


if __name__ == '__main__':
    main()

Tcp socket
Clinet

# -*- coding: UTF-8 -*-
from socket import *


def main():
    # 创建套接字
    tcp_cli_socket = socket(AF_INET, SOCK_STREAM)
    # 绑定本地信息
    server_ip = ('127.0.0.1', 8888)
    
    # 连接服务器
    tcp_cli_socket.connect(server_ip)
    # 发送数据
    send_data = input("请输入要发送的数据:")
    tcp_cli_socket.send(send_data.encode("gbk"))
    # 接收数据
    rescv_data = tcp_cli_socket.recv(1024)
    print(rescv_data.decode('gbk'))

    tcp_cli_socket.close()


if __name__ == '__main__':
    main()

Tcp service

# _*_encoding:utf-8 _*_
from socket import *


# tcp 服务器 流程  1. 创建socket 2.bind 绑定ip和端口 3. listen 使套接字变为被动链接
#                 4.accept 等待客户端接入  5.recv/send 接收发送数据
def main():
    # 创建套接字
    tcp_ser_socket = socket(AF_INET, SOCK_STREAM)

    # 本地信息
    local_addr = ("", 8808)

    # 绑定
    tcp_ser_socket.bind(local_addr)

    # 使用socket的套接字默认属性是主动的, 使用listen将其变为被动的, 这样就可以接收别人的连接

    tcp_ser_socket.listen(1024)
    # 如果新的客户端来链接服务器 ,那么就产生一个新的套接字,专门为这个用户服务
    #  client_socket 某个客户端服务
    client_socket, clientAddr = tcp_ser_socket.accept()
    print("---------------")
    print("client_socket:{} \n clientAddr:{}".format(client_socket, clientAddr))
    print("***************")

    # 接收对方发送的数据
    recv_data = client_socket.recv(1024)
    print("接收到数据:", recv_data.decode('gbk'))

    # 发送给客户端数据
    client_socket.send("test from server".encode('gbk'))
    # 关闭为这个客户端分配的套接字
    client_socket.close()
    tcp_ser_socket.close()

if __name__ == '__main__':
    main()

循环 为客户端服务

# _*_encoding:utf-8 _*_
from socket import *


# tcp 服务器 流程  1. 创建socket 2.bind 绑定ip和端口 3. listen 使套接字变为被动链接
#                 4.accept 等待客户端接入  5.recv/send 接收发送数据
def main():
    # 创建套接字
    tcp_ser_socket = socket(AF_INET, SOCK_STREAM)

    # 本地信息
    local_addr = ("", 8808)

    # 绑定
    tcp_ser_socket.bind(local_addr)

    # 使用socket的套接字默认属性是主动的, 使用listen将其变为被动的, 这样就可以接收别人的连接
    tcp_ser_socket.listen(1024)
    while True:
        # 如果新的客户端来链接服务器 ,那么就产生一个新的套接字,专门为这个用户服务
        #  client_socket 某个客户端服务
        client_socket, clientAddr = tcp_ser_socket.accept()
        print("---------------")
        print("client_socket:{} \n clientAddr:{}".format(client_socket, clientAddr))
        print("***************")
        while True:  # 为同一个客户端服务多次
            # 接收对方发送的数据
            recv_data = client_socket.recv(1024)
            print("接收到数据:", recv_data.decode('gbk'))

            if  recv_data:
                # 发送给客户端数据
                client_socket.send("test from server".encode('gbk'))
            else:
                # 关闭为这个客户端分配的套接字

                break
        client_socket.close()
        print("---over---")
    tcp_ser_socket.close()


if __name__ == '__main__':
    main()

python网络编程-socket_第1张图片
加入多线程socket

import socket
import  threading

def recv_data(udp_socket):
    while True:
        data = udp_socket.recvfrom(1024)[0].decode('gbk')
        print("\n接收数据:" + data)


def send_data(udp_socket):
    while True:
        s_data = input("请输入要发送的数据")
        udp_socket.sendto(s_data.encode('gbk'),("127.0.0.1",7890))

def main():
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(("", 7788))
    resv_thread = threading.Thread(target=recv_data, args=(udp_socket,))
    send_thread = threading.Thread(target=send_data, args=(udp_socket,))
    send_thread.start()
    resv_thread.start()


if __name__ == '__main__':
    main()

你可能感兴趣的:(#,python)