Python网络编程

网络编程分为。TCP和UDP,TCP为可靠连接,UDP为不可靠连接。仅用代码来展示。


TCP:

客户端:

import socket

import threading

    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    #元组第一个元素为客户端要连接的服务器的IP地址,第二个参数为服务器的端口号

    client.connect(("10.0.122.158", 8080))

# 创建接收线程

def run1(c):

    while True:

        data = c.recv(1024).decode("utf-8")

        print("服务器说:" + data)

th1 = threading.Thread(target=run1, args=(client,))

th1.start()

def run2(c):

    while True:

        #   456#你真坏

        data = input("请输入要发送给服务器的消息:")

        data = "talk#" + data

        c.send(data.encode("utf-8"))

th2 = threading.Thread(target=run2, args=(client,))

th2.start()

client.send("register#123#sunck".encode("utf-8"))

th1.join()

th2.join()

服务端:

import socket

import threading

from person import Person

usersDict = {}

# 1、创建socket

# AF_INET:表示使用IPv4

# SOCK_STREAM:表示TCP协议

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

#2、绑定

# 参数为一个元组,元组第一个元素为本机ip,第二元素为端口号,使用8000以上的值,最大使用到65535

server.bind(("10.0.122.158", 8080))

#3、监听,设置最多连接数

server.listen(50)

def run(clientSocket, clientAddr):

    while True:

        #   register#123#sunck

        #   talk#456#sunck nice

        data = clientSocket.recv(1024).decode("utf-8")

        #解析数据

        arr = data.split("#")

        if arr[0] == "register":

            per = Person(clientSocket, arr[1], arr[2])

            usersDict[arr[1]] = per

        elif arr[0] == "talk":

            #找到当前用户的用户名

            name = None

            for account, per in usersDict.items():

                if per.clientSocket is clientSocket:

                    name = per.name

                    break

            #找到好友

            per = usersDict.get(arr[1])

            friendScoket = per.clientSocket

            # 给好友发送消息

            #  sunck说:你真帅

            friendScoket.send((name+":"+arr[2]).encode("utf-8"))

#4、等待客户端的链接

while True:

    print("等待链接……")

    #客户端连接成功返回客户端的socket和客户端的IP地址

    clientSocket, clientAddr = server.accept()

    print(clientAddr, "客户链接成功")

    #创建线程交互

    th = threading.Thread(target=run, args=(clientSocket, clientAddr))

    th.start()

Person类:

class Person(object):

    def __init__(self, clientSocket, account, name):

        self.clientSocket = clientSocket

        self.account = account

        self.name = name

UDP:

客户端:

import socket

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

while True:

    data = input("输入要发送的信息:")

    client.sendto(data.encode("utf-8"), ("10.0.122.158", 8080))

以下方式不建议使用

client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

client.connect(("10.0.122.158", 8081))

while True:

data = input("输入要发送的信息:")

client.send(data.encode("utf-8"))

服务端:

# TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据。相对TCP,UDP则是面向无连接的协议

# 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发送数据包,但是能不能到达就不知道了

# 虽然UDP传输数据不可靠,但是它的优点是和TCP相比较,速度快,对于不要求可靠到达的数据,可以使用UDP,广播类型的软件经常使用

import socket

server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

server.bind(("10.0.122.158", 8081))

while True:

    data, addr = server.recvfrom(1024)

    print("来自", addr, "的消息:", data.decode("utf-8"))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值