Python-网络编程(socket简易聊天器)

版权声明:本文为博主原创文章,未经博主允许不得转载哦!!! https://blog.csdn.net/lph188/article/details/84770407

关于socket通信的定义和原理,我们再熟系不过了,这里就不在赘述,不了解的读者可以参考博客:

https://www.cnblogs.com/wangcq/p/3520400.html 

这里讲的很明白。

以前,使用C/C++、Java都实现过,最近学习Python,又实现了一遍;不得不说,Python的代码真的是十分简洁(在我心中完全取代了Java),也可以看出socket真的是网络编程的经典案例。话不多说,言归正传;下面,我将用UDP实现四种不同的通信方式。

第一种:一端只能发送信息,另一端只能接收信息;

第二种:自己发给自己(自发自收);

第三种:简易聊天器,你发给我一条信息,我收到后,再发给你一条信息,你接收后,再发给我一条信息……如此往复。

第四种: 简易聊天器,随意收发。(2019-1-6 补充)

一、客户端发送信息,服务端接收信息

客户端代码:

#coding:utf-8

import socket

def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    udp_socket.bind(("172.21.13.10",6060))
    while True:
        # 从键盘获取数据
        send_data = input("请输入要发送的数据:")
        # 可以使用套接字收发数据
        localaddr = ("172.21.13.10",8080)
        #udp_socket.bind(localaddr)
        udp_socket.sendto(send_data.encode("utf-8"),localaddr)
    # 关闭套接字
    udp_socket.close()

if __name__ == "__main__":
    main()

服务端代码:

#coding:utf-8

import socket

def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    # 绑定一个本地信息
    localaddr = ("172.21.13.10",8080)
    udp_socket.bind(localaddr)
    while True:
        # 接收数据
        receive_data = udp_socket.recvfrom(1024)
        # receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
        receive_msg = receive_data[0] # 存放接收的数据
        receive_addr = receive_data[1] # 存放发送方的地址
        print("%s:%s" % (str(receive_addr),receive_msg.decode("utf-8")))
    # 关闭套接字
    udp_socket.close()

if __name__ == "__main__":
    main()

二、自发自收信息

代码:

#coding:utf-8

import socket

def send_msg(udp_socket):
    """发送消息"""
    # 发送
    # 从键盘获取数据
    send_data = input("请输入要发送的数据:")
    # 可以使用套接字收发数据
    localaddr = ("172.21.13.10", 8088)
    udp_socket.sendto(send_data.encode("utf-8"), localaddr)

def receive_msg(udp_socket):
    """接收消息"""
    # 接收并显示
    receive_data = udp_socket.recvfrom(1024)
    # receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
    receive_msg = receive_data[0]  # 存放接收的数据
    receive_addr = receive_data[1]  # 存放发送方的地址
    print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))

def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定信息
    udp_socket.bind(("172.21.13.10", 8088))
    # 循环处理事情
    while True:
        # 发送
        send_msg(udp_socket)
        # 接收并显示
        receive_msg(udp_socket)

if __name__ == "__main__":
    main()

三、简易聊天器

先发端代码:

#coding:utf-8

import socket

def send_msg(udp_socket):
    """发送消息"""
    # 发送
    # 从键盘获取数据
    send_data = input("请输入要发送的数据:")
    # 可以使用套接字收发数据
    localaddr = ("172.21.13.10", 8088)
    udp_socket.sendto(send_data.encode("utf-8"), localaddr)

def receive_msg(udp_socket):
    """接收消息"""
    # 接收并显示
    receive_data = udp_socket.recvfrom(1024)
    # receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
    receive_msg = receive_data[0]  # 存放接收的数据
    receive_addr = receive_data[1]  # 存放发送方的地址
    print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))

def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定信息
    udp_socket.bind(("172.21.13.10", 8080))
    # 循环处理事情
    while True:
        # 发送
        send_msg(udp_socket)
        # 接收并显示
        receive_msg(udp_socket)

if __name__ == "__main__":
    main()

先收端代码:

#coding:utf-8

import socket

def send_msg(udp_socket):
    """发送消息"""
    # 发送
    # 从键盘获取数据
    send_data = input("请输入要发送的数据:")
    # 可以使用套接字收发数据
    localaddr = ("172.21.13.10", 8080)
    udp_socket.sendto(send_data.encode("utf-8"), localaddr)

def receive_msg(udp_socket):
    """接收消息"""
    # 接收并显示
    receive_data = udp_socket.recvfrom(1024)
    # receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
    receive_msg = receive_data[0]  # 存放接收的数据
    receive_addr = receive_data[1]  # 存放发送方的地址
    print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))

def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定信息
    udp_socket.bind(("172.21.13.10", 8088))
    # 循环处理事情
    while True:
        # 接收并显示
        receive_msg(udp_socket)
        # 发送
        send_msg(udp_socket)

if __name__ == "__main__":
    main()

四、 简易聊天器(随意收发)

A端:

#coding=utf-8
import socket
import threading

def send_msg(udp_socket):
    """发送消息"""
    while True:
        # 发送
        # 从键盘获取数据
        send_data = input("请输入要发送的数据:")
        # 可以使用套接字收发数据
        localaddr = ("172.21.13.10", 8080)
        udp_socket.sendto(send_data.encode("utf-8"), localaddr)

def receive_msg(udp_socket):
    """接收消息"""
    while True:
        # 接收并显示
        receive_data = udp_socket.recvfrom(1024)
        # receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
        receive_msg = receive_data[0]  # 存放接收的数据
        receive_addr = receive_data[1]  # 存放发送方的地址
        print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))

def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定信息
    udp_socket.bind(("172.21.13.10", 8088))
    # 创建两个线程
    t_recv = threading.Thread(target=receive_msg, args=(udp_socket,))
    t_send = threading.Thread(target=send_msg, args=(udp_socket,))
    t_send.start()
    t_recv.start()

if __name__ == "__main__":
    main()

B端: 

#coding=utf-8
import socket
import threading

def send_msg(udp_socket):
    """发送消息"""
    while True:
        # 发送
        # 从键盘获取数据
        send_data = input("请输入要发送的数据:")
        # 可以使用套接字收发数据
        localaddr = ("172.21.13.10", 8088)
        udp_socket.sendto(send_data.encode("utf-8"), localaddr)

def receive_msg(udp_socket):
    """接收消息"""
    while True:
        # 接收并显示
        receive_data = udp_socket.recvfrom(1024)
        # receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
        receive_msg = receive_data[0]  # 存放接收的数据
        receive_addr = receive_data[1]  # 存放发送方的地址
        print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))

def main():
    # 创建一个udp套接字
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    # 绑定信息
    udp_socket.bind(("172.21.13.10", 8080))
    # 创建两个线程
    t_recv = threading.Thread(target=receive_msg,args=(udp_socket,))
    t_send = threading.Thread(target=send_msg, args=(udp_socket,))
    t_recv.start()
    t_send.start()

if __name__ == "__main__":
    main()

五、补充(TCP)2019-1-4

客户端:

#coding:utf-8

import socket

def main():
    # 1.创建tcp的套接字
    tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 2.链接服务器
    server_ip = "172.21.13.10"
    server_port = 8080
    server_addr = (server_ip,server_port)
    tcp_socket.connect(server_addr)
    # 3.发送/接收数据
    send_data = input("请输入要发送的数据:")
    tcp_socket.send(send_data.encode("utf-8"))
    recv_data = tcp_socket.recv(1024)
    print(recv_data)
    # 4.关闭套接字
    tcp_socket.close()

if __name__ == "__main__":
    main()

服务器:

#coding:utf-8

import socket

def main():
    # 1.创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    # 2.绑定本地信息
    localaddr = ("172.21.13.10", 8080)
    tcp_server_socket.bind(localaddr)
    # 3.让默认的套接字由主动变为被动
    tcp_server_socket.listen(128)
    # 4.等待客户端链接
    client_socket,client_addr = tcp_server_socket.accept()
    print(client_addr)
    recv_data = client_socket.recv(1024)
    print(recv_data)
    # 回复信息
    client_socket.send("11111".encode("utf-8"))
    # 5. 关闭套接字
    client_socket.close()
    tcp_server_socket.close()

if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/lph188/article/details/84770407