首页 > 编程语言 >Java开发者的Python快速进修指南:网络编程及并发编程

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

时间:2023-11-27 09:45:27浏览次数:28  
标签:__ Java socket Python 编程 server client

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

socket及线程

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

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()

以下是客户端的代码:

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__':语句可以判断是否是主函数执行,如果不是,则会过滤掉这部分代码。虽然这个机制可能有些令人困惑,但是去深入了解其执行原理并不是必要的,所以大家要记住这个要点。这张图显示的是再次被调用是的名字:

image

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

image

总结

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

标签:__,Java,socket,Python,编程,server,client
From: https://www.cnblogs.com/guoxiaoyu/p/17845120.html

相关文章

  • java基础学习:赋值运算符
    扩展的赋值运算符隐含了强制类型转换  packagecom.itheima.operator;publicclassQperator3{publicstaticvoidmain(String[]args){//目标:掌握扩展赋值运算符的使用//+=//需求类似于收红包doublea=9.5;dou......
  • 【Python】base64模块对图片进行base64编码和解码
    图片的base64编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址。这样做有什么意义呢?我们知道,我们所看到的网页上的每一个图片,都是需要消耗一个http请求下载而来的。没错,不管如何,图片的下载始终都要向服务器发出请求,要是图片的下载不用向服务器发出请求,而可......
  • 观察者模式--Java实现
    相关类图具体代码//Observer.javapackageorg.example.test019;publicinterfaceObserver{publicvoidbuy();publicvoidcry();}//Subject.javapackageorg.example.test019;importjava.util.ArrayList;publicabstractclassSubject{protect......
  • 状态模式--Java实现
    具体代码//Account.javapackageorg.example.test020;publicclassAccount{publicAccountStategetAccountState(){returnaccountState;}publicvoidsetAccountState(AccountStateaccountState){this.accountState=accountState;......
  • 策略模式--Java实现
    具体代码//Travel.javapackageorg.example.test021;publicinterfaceTravel{publicvoidtravel();}//Person.javapackageorg.example.test021;publicclassPerson{publicTravelgetTravel(){returntravel;}publicvoidsetTrav......
  • C++ 服务端与 Java 客户端的简单连接
    记录一下如何用两种语言简单通信,(其实也大差不差的,应该把。。。)//C++服务端#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<unistd.h>#include<iostream>#include<cstring>usingstd::cout;usingstd::endl;usingst......
  • extern "C":实现C++和C的混合编程
    原文:https://c.biancheng.net/view/8064.html通过《C语言和C++到底有什么关系?》一节的学习,读者已经了解了C++和C语言之间的关系。简单的理解,C++就是在C语言的基础上增加了一些新特性,从大的方面讲,C++不仅支持面向过程编程,还支持面向对象编程和泛型编程;从小的方面讲,C++还......
  • Java开发者的Python快速进修指南:自定义模块及常用模块
    好的,按照我们平常的惯例,我先来讲一下今天这节课的内容,以及Java和Python在某些方面的相似之处。Python使用import语句来导入包,而Java也是如此。然而,两者之间的区别在于Python没有类路径的概念,它直接使用.py文件的文件名作为导入路径,并将其余的工作交给Python解释器来扫描和处理。另......
  • docker构建打包java项目
    docker构建打包java项目简介本项目用于研究和实践docker的工作流部署发布查看github源码技术栈spring-web(RESTAPI请求交互)redis(用于实验多容器通信)mavendocker常用命令docker--help可查看帮助指令查看镜像列表dockerimagels查看容器列表docker......
  • 透析Java本质的36个话题02运算符与表达式
    1.莫衷一是——i+++j该如何计算?三个加号​ 在java中默认前面结合也就是(i++)+jinti=25;intj=2;intresult=i+++j;System.out.println(i);System.out.println(j);/*262*/贪心规则编译器的贪心规则,分析符号......