🔥🔥Java开发者的Python快速进修指南:网络编程及并发编程

今天我们将对网络编程和多线程技术进行讲解,这两者的原理大家都已经了解了,因此我们主要关注的是它们的写法区别。虽然这些区别并不是非常明显,但我们之所以将网络编程和多线程一起讲解,是因为在学习Java的socket知识时,我们通常会将它们结合使用,以实现服务器对多个客户端连接的阻塞IO的处理。虽然我是这样解释的,但是Python在控制连接数方面更加友好,相对于Java来说更加便捷。好了,废话不多说,让我们开始今天的讲解吧。

socket及线程

这里我将给大家举一个例子,同时也会指出一些需要注意的问题,以帮助Java同学们避免再次遇到这些坑。

python 复制代码
import socket
import multiprocessing
import time

# 创建互斥锁
lock = multiprocessing.Lock()


# 处理客户端请求的函数
def handle_client(conn, addr):
    print(f"Connected to {addr}")
    time.sleep(100)



# 创建服务器
def create_server():
    # 创建socket对象
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

    # 绑定地址和端口
    server_addr = ("localhost", 8000)
    server_socket.bind(server_addr)

    # 监听连接
    server_socket.listen(1)
    print("Server started. Listening for connections...")

    while True:
        # 接受客户端连接
        conn, addr = server_socket.accept()
        handle_client(conn, addr)
        # 创建进程处理客户端请求
        process = multiprocessing.Process(target=handle_client, args=(conn, addr))
        process.start()

if __name__ == '__main__':
    # 启动服务器
    print("启动服务器")
    create_server()

以下是客户端的代码:

python 复制代码
import socket
import time
client = socket.socket() #创建socket对象
host = '127.0.0.1' #服务端ip
port = 8000 #服务端ip端口
client.connect((host, port)) #根据服务端地址,建立连接
print('client对象:', client) #查看socket对象属性
time.sleep(100)

#client.close() #关闭与服务端的连接

上面的例子已经涵盖了我今天要讲的内容,所以没有太多需要补充的了。不过,我可以谈一下与Java的一些区别。

首先,Python使用multiprocessing来创建多线程,当然还有其他的包可以实现相同的功能,这里就不一一赘述了。另外,还有一个需要注意的地方是,在Python中使用if __name__ == '__main__':语句时,你必须将其写在主函数中,而不要写在你定义的子函数中。为什么要这样写呢?原因是,当调用process.start()后,Python会重新执行当前文件,也就是说如果你将if __name__ == '__main__':这句话写在非主函数中,create_server()它将会被再次调用。而使用if __name__ == '__main__':语句可以判断是否是主函数执行,如果不是,则会过滤掉这部分代码。虽然这个机制可能有些令人困惑,但是去深入了解其执行原理并不是必要的,所以大家要记住这个要点。这张图显示的是再次被调用是的名字:

第二:在Python官网中指出,通过调用server_socket.listen(1)可以启动一个服务器,用于接受连接并将未接受的客户端连接放入等待队列中。需要注意的是,等待队列的大小由listen(n)中的参数n+1指定,并不代表实际监听到的客户端连接。如果超过队列大小的连接尝试进入,服务器将直接报错。

总结

今天我们学习了网络编程和多线程技术的写法区别。我们主要关注了在Java中使用socket和多线程结合实现服务器处理多个客户端连接的阻塞IO的方法,以及在Python中使用multiprocessing模块创建多线程的方式。通过一个实例来说明了这些概念,并指出了需要注意的问题。其实了解了这些基本用法后,我们还能够自己实现许多其他功能,例如了解了线程之后,就知道会有队列的概念,然后可以尝试自己实现一个生产者消费者队列。这与学习Java的路线非常相似,并且我们拥有丰富的开发经验,因此我们只需要关注语法方面的学习即可~~

相关推荐
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 分钟前
如何将一个本地的jar包安装到 Maven 仓库中
java·maven·jar
N维世界9 分钟前
Mybatis-XML映射文件
xml·java·mybatis
码出极致12 分钟前
Redisson 分布式锁自动续期机制解析
后端
小塵12 分钟前
【DeepSeek 聊天】五分钟部署本地 DeepSeek
人工智能·后端·deepseek
土拨鼠的旅程15 分钟前
Go map 源码详解【2】—— map 插入
后端
泊浮目18 分钟前
生产级Rust代码品鉴(一)RisingWave一条SQL到运行的流程
大数据·后端·rust
弹简特32 分钟前
【Java SE】Arrays工具类
java·开发语言
Touper.32 分钟前
JavaSE -- Lambda表达式
java·开发语言
estarlee36 分钟前
通用图片搜索-搜狗源免费API接口使用指南
后端
陈敬雷-充电了么-CEO兼CTO37 分钟前
主流大模型Agent框架 AutoGPT详解
人工智能·python·gpt·ai·chatgpt·nlp·aigc