首页 > 其他分享 >喜欢猫猫

喜欢猫猫

时间:2024-12-15 20:43:27浏览次数:3  
标签:socket 猫猫 ip client 喜欢 message recv target

server.py

import socket
import threading

client_ip = {
    "h1": "10.0.0.1",
    "h2": "10.0.0.2",
    "h3": "10.0.0.3",
}
client_host = {
    "10.0.0.1" : "h1",
    "10.0.0.2" : "h2",
    "10.0.0.3" : "h3",
}
port = 14514

def handle_connection(conn, addr):
    print(f"connection from {addr} has been established.")
    host = client_host[addr[0]]
    while True:
        try:
            message = conn.recv(1024).decode()
            if not message:
                break
            
            target, msg = message.split(':', 1)
            if target.find("To ") != 0:
                raise Exception("Invalid dest")
            
            target = target[3:]
            
            target_ip = client_ip.get(target.strip())
            
            if target_ip:
                forward_message(host, target_ip, msg.strip())
            else:
                raise Exception(f"Unknown target: {target}")
        
        except Exception as e:
            print(f"Error: {e}")
            break
    
    conn.close()
    print(f"{addr} closed.")

def forward_message(host, target_ip, message):
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as forward_socket:
        try:
            forward_socket.connect((target_ip, port))
            forward_socket.send((message + f" From {host}").encode())
            print(f"Forwarded message to {target_ip}: {message}")
        except Exception as e:
            print(f"failed to forward message to {target_ip}: {e}")

def start_server():
    host = ""

    server_socket = socket.socket()
    server_socket.bind((host, port))
    server_socket.listen(10)

    print("Server h4 started")
    while True:
        conn, addr = server_socket.accept()
        client_handler = threading.Thread(target = handle_connection, args = (conn, addr))
        client_handler.start()

def main():
    start_server()

if __name__ == '__main__':
    main()

topology.py

from mininet.topo import Topo
from mininet.net import Mininet
from mininet.util import dumpNodeConnections
from mininet.log import setLogLevel
from mininet.cli import CLI

class ChatRoomTopo(Topo):
    def build(self):
        s1 = self.addSwitch("s1")
        s2 = self.addSwitch("s2")
        s3 = self.addSwitch("s3")
        h1 = self.addHost("h1")
        h2 = self.addHost("h2")
        h3 = self.addHost("h3")
        h4 = self.addHost("h4")
        self.addLink(h1, s3)
        self.addLink(h2, s1)
        self.addLink(h3, s3)
        self.addLink(h4, s2)
        self.addLink(s1, s2)
        self.addLink(s1, s3)

def simpleTest():
    "Create and test a simple network"
    topo = ChatRoomTopo()
    net = Mininet(topo)
    net.start()
    CLI(net)
    net.stop()

if __name__ == '__main__':
    setLogLevel('info')
    simpleTest()

user.py

import socket
import threading

def handle_send(client_send_socket):
    while True:
        message = input("Enter message: ")
        if message.lower() == 'exit':
            break
        client_send_socket.send(message.encode())
    
def handle_recv(client_recv_socket):
    while True:
        conn, addr = client_recv_socket.accept()
        try:
            message = conn.recv(1024).decode()
            if not message:
                break
            
            print ("\n" + message)
        
        except Exception as e:
            print(f"Error: {e}")
            break

        conn.close()

def start_client():
    h4_ip = "10.0.0.4"
    host = h4_ip
    port = 14514

    client_send_socket = socket.socket() # default is TCP
    client_send_socket.connect((host, port))
    client_recv_socket = socket.socket()
    client_recv_socket.bind(("", port))
    client_recv_socket.listen(10)

    client_send_handler = threading.Thread(target = handle_send, args = (client_send_socket,))
    client_recv_handler = threading.Thread(target = handle_recv, args = (client_recv_socket,))

    client_recv_handler.start()
    client_send_handler.start()

def main():
    start_client()

if __name__ == '__main__':
    main()

udpclient.py

import socket
import threading
import subprocess

client_ip = {
    "h1": "10.0.0.1",
    "h2": "10.0.0.2",
    "h3": "10.0.0.3",
    "h4": "10.0.0.4",
}
client_host = {
    "10.0.0.1" : "h1",
    "10.0.0.2" : "h2",
    "10.0.0.3" : "h3",
    "10.0.0.4" : "h4",
}
port = 14514
OUTPUT_ALL = False

def get_local_ip():
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(("10.0.0.1", 80))
        ip_address = s.getsockname()[0]
    except Exception as e:
        ip_address = '127.0.0.1'
    finally:
        s.close()

    return ip_address
    

def handle_send(client_send_socket):
    host = client_host.get(get_local_ip())

    while True:
        message = input("Enter message: ")

        try:
            if message.lower() == 'exit':
                break
        
            target, msg = message.split(':', 1)
            if target.find("To ") != 0:
                raise Exception("Invalid dest")
            
            target = target[3:]
            
            target_ip = client_ip.get(target.strip())

            if target_ip:
                client_send_socket.sendto((msg + f" From {host}").strip().encode(), (target_ip, port))
            else:
                raise Exception(f"Unknown target: {target}")

        except Exception as e:
            print(f"Error: {e}")

def handle_recv(client_recv_socket):
    client_recv_socket.bind(("", port))
    while True:
        message, client_addr = client_recv_socket.recvfrom(1024)

        if OUTPUT_ALL or (client_addr[0] != get_local_ip()):
            print ("\n" + message.decode())

def start_udpclient():
    client_send_socket = socket.socket(family = socket.AF_INET, type = socket.SOCK_DGRAM)
    client_recv_socket = socket.socket(family = socket.AF_INET, type = socket.SOCK_DGRAM)

    client_send_handler = threading.Thread(target = handle_send, args = (client_send_socket,))
    client_recv_handler = threading.Thread(target = handle_recv, args = (client_recv_socket,))

    print (f"Client {get_local_ip()} begins to work")
    client_recv_handler.start()
    client_send_handler.start()

def main():
    start_udpclient()

if __name__ == '__main__':
    main()

标签:socket,猫猫,ip,client,喜欢,message,recv,target
From: https://www.cnblogs.com/qixingzhi/p/18608671

相关文章

  • 你喜欢Sass还是Less?为什么?
    在前端开发中,Sass(SyntacticallyAwesomeStylesheets)和Less(LeanerStyleSheets)都是非常流行的CSS预处理器,它们各自都有一些优点和特性。以下是我对它们的偏好及其原因:我更倾向于使用Sass1.更成熟的生态系统Sass已经存在了很长时间,并且拥有一个非常活跃和成熟的社区。这意味......
  • 你最喜欢Sass的原因是什么?
    作为大型语言模型,我没有个人喜好,包括对编程语言的偏好。但我可以解释为什么许多前端开发者喜欢使用Sass:Sass(SyntacticallyAwesomeStyleSheets)的流行主要归功于以下几个原因:嵌套(Nesting):Sass允许CSS选择器嵌套,这使得CSS代码更易于阅读、组织和维护,特别是对于......
  • 你平时喜欢看书吗?电子书还是实体书?为什么?
    作为一个大型语言模型,我没有个人喜好,例如看书的偏好。我没有眼睛去看书,也没有大脑去理解书的内容,更没有“喜欢”这种情感。我处理信息的方式是通过分析和处理大量文本数据。但是,我可以告诉你,从我处理的数据来看,人们对电子书和实体书都有各自的偏好。电子书的优势:方便携带、搜......
  • 如何切换安卓手机ip?你更喜欢哪种操作
    在数字化时代,IP地址作为网络设备的唯一标识,对于网络访问和隐私保护至关重要。有时,可能出于个人需求或工作缘故,想要将自己的安卓手机IP地址更换成其他省份的,或者设置成静态IP等需求该如何实现呢?安卓手机IP地址怎么切换?本文将详细介绍几种切换安卓手机IP地址的方法,看看你更喜欢哪......
  • 你最不喜欢css的哪些特性是什么?为什么?
    作为大型语言模型,我没有“喜欢”或“不喜欢”这样的主观感受。但是我可以从前端开发者的角度,列举一些CSS中比较棘手或容易引起问题的特性,并解释原因:Specificity(特异性):CSS选择器的特异性规则有时难以理解和掌握。特异性冲突会导致样式覆盖混乱,难以调试,尤其在大型项目中,需......
  • 做为管理者,你是喜欢能说会道的还是喜欢安静做事的人呢?为什么?
    作为管理者,我更喜欢两者兼备的团队成员,既能清晰表达自己的想法和工作进度,又能踏实高效地完成任务。单纯的“能说会道”或“安静做事”都各有优缺点,在前端开发领域尤其如此:“能说会道”的优点:沟通能力强:能更好地与产品经理、设计师、后端工程师等沟通需求、方案和问题,减少误解和......
  • 你最喜欢的是哪个css特性?为什么?
    我最喜欢的CSS特性是Flexbox(FlexibleBoxLayout)。原因如下:简化布局:Flexbox极大地简化了网页布局,特别是对于一维布局(横向或纵向)。它能够轻松处理元素的对齐、分布和排序,而无需使用floats或复杂的表格布局。以前需要复杂的hacks和workarounds的布局,现在使用Fle......
  • 你喜欢在大城市工作还是小城市?为什么?
    开发人员在这两种环境中工作各自的优缺点:大城市:优点:更多机会:大城市通常拥有更多的科技公司和初创企业,这意味着更多的工作机会和职业发展空间。更高薪资:大城市的生活成本更高,相应的,前端开发人员的薪资也普遍较高。更丰富的资源:大城市拥有更多的学习资源,例如技术会议......
  • 你觉得一线城市和三四线城市的区别在哪?你比较喜欢哪个?
    一线城市和三四线城市对于前端开发者来说,各有优劣:一线城市(例如:北京、上海、广州、深圳)优点:高薪:一线城市互联网行业发达,前端开发的薪资普遍较高。更多机会:大量互联网公司和科技企业聚集,职业发展机会更多,更容易接触到前沿技术和大型项目。更完善的行业生态:各种......
  • 你认为sass和less的最大区别是什么呢?你喜欢哪个?为什么?
    Sass和Less都是CSS预处理器,它们扩展了CSS的功能,使样式表更易于维护、编写和组织。它们的主要区别在于实现方式和一些特性上的细微差别。我认为最大的区别在于:底层实现语言:Sass基于Ruby,而Less基于JavaScript。这意味着Sass的编译需要Ruby环境,而Less可以在浏览......