Python网络编程

socket server

#-*- coding:utf-8 -*-

import socket

#ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#创建一个  IPv4 的tcp socket ss 对象
ip = '127.0.0.1'
port = 6789
ip_port = (ip,port)

ss = socket.socket(socket.AF_INET,socket.SOCK_STREAM)  #创建套接字
ss.bind(ip_port)                                       #绑定服务端口
ss.listen(5)                                           #监听连接请求
print('------------------------********------------------------------------')
print('启动 socket 服务, 等待连接....')
conn,address  = ss.accept()                     #等待连接,此处自动阻塞
#被动接受客户端连接,(阻塞式)等待连接的到来,并返回(conn,address)二元元组,其中conn是一个通信对象,可以用来接收和发送数据。address是连接客户端的地址。
# conn 是服务端 对应的套接字
print(conn)
print('------------------------********------------------------------------')
print(address)
print('------------------------********------------------------------------')

while True:
    client_data = conn.recv(1024).decode()   #接收数据包,并且用 decode() 进行解码,socket 通信通过  bytes 进行传输
    if client_data == 'exit':                # 判断是否退出连接
        exit('通信结束')
    print('来自地址: %s 的客户端发送了: %s' % (address, client_data))
    inp = input('回复的内容:').encode()
    conn.sendall(inp)     #响应信息 并进行编码

conn.close()                                 #关闭连接

socket client 

#-*- coding:utf-8 -*-

import socket

ip = '127.0.0.1'
port = 6789
ip_port = (ip,port)

cs = socket.socket(socket.AF_INET,socket.SOCK_STREAM)   #创建 套接字
cs.connect(ip_port)

while True:     # 通过一个死循环不断接收用户输入,并发送给服务器
    inp = input('请输入要发送的内容:  '.strip())   #strip 消除内容左右的空格
    if not inp:                                  #如果不为真
        continue
    cs.sendall(inp.encode())                    #发送数据,并且进行编码为 bytes

    if inp == 'exit':
        print('通信结束')
        break
    server_reply = cs.recv(1024).decode()      #接收服务的响应,并且解码
    print(server_reply)
cs.close()

多线程

# -*- coding:utf-8 -*-

import socket
import threading        # 导入线程模块


def link_handler(link, client):
    """
    该函数为线程需要执行的函数,负责具体的服务器和客户端之间的通信工作
    :param link: 当前线程处理的连接
    :param client: 客户端ip和端口信息,一个二元元组
    :return: None
    """
    print("服务器开始接收来自[%s:%s]的请求...." % (client[0], client[1]))
    while True:     # 利用一个死循环,保持和客户端的通信状态
        client_data = link.recv(1024).decode()
        if client_data == "exit":
            print("结束与[%s:%s]的通信..." % (client[0], client[1]))
            break
        print("来自[%s:%s]的客户端向你发来信息:%s" % (client[0], client[1], client_data))
        link.sendall('服务器已经收到你的信息'.encode())
    link.close()


ip_port = ('127.0.0.1', 9999)
sk = socket.socket()            # 创建套接字
sk.bind(ip_port)                # 绑定服务地址
sk.listen(5)                    # 监听连接请求

print('启动socket服务,等待客户端连接...')

while True:     # 一个死循环,不断的接受客户端发来的连接请求
    conn, address = sk.accept()  # 等待连接,此处自动阻塞
    # 每当有新的连接过来,自动创建一个新的线程,
    # 并将连接对象和访问者的ip信息作为参数传递给线程的执行函数
    t = threading.Thread(target=link_handler, args=(conn, address))
    t.start()

UDP

# 服务端
import socket
ip_port = ('127.0.0.1', 9999)
sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
sk.bind(ip_port)

while True:
    data = sk.recv(1024).strip().decode()
    print(data)
    if data == "exit":
        print("客户端主动断开连接!")
        break

sk.close()

# 客户端
import socket
ip_port = ('127.0.0.1', 9999)

sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
while True:
    inp = input('发送的消息:').strip()
    sk.sendto(inp.encode(), ip_port)
    if inp == 'exit':
        break

sk.close()
原文地址:https://www.cnblogs.com/zy09/p/11766231.html