1.java8timeԴ?源码?
2.Java日期时间API系列13-----Jdk8时间类转换,LocalDateTime转Date等
3.java初学者用什么软件比较好?
4.为什么我的源码java源代码是乱码?
5.javaç¨åºåç¨ä»ä¹è½¯ä»¶å代ç ï¼
6.javapythonï¼
java8timeԴ??
同事反馈一个问题:Mybatis插入数据库的时间是昨天的,是源码不是因为生成Mybatis逆向工程生成的代码有问题?大家都知道,对于这类Bug本人是源码很感兴趣的。直觉告诉我,源码应该不是源码秒赞挂机源码Mybatis的Bug,很可能是源码时区的问题。
很好,源码今天又可以带大家一起来排查Bug了,源码看看从这次的源码Bug排查中你能Get什么技能。
这次研究的源码问题有点深奥,但结论很重要。源码Let's go!
问题猜想同事反馈问题的源码时候,带了自己的源码猜想:是不是数据库字段设置为datetime导致?是不是Mybatis逆向工程生成的代码中类型不一致导致的?
同事还要把datetime改为varchar……马上被我制止了,说:先排查问题,源码再说解决方案,下午我也抽时间看看。
问题核查第一步,检查数据库字段类型,是datetime的,没问题。
第二步,检查实体类中类型,是java.util.Date类型,没问题。
第三步,Bug复现。
在Bug复现这一步,用到了单元测试。话说之前还跟朋友讨论过单元测试的魅力,现在本人是越来越喜欢单元测试了。
项目基于Spring Boot的,单元测试如下(代码已脱敏):
@SpringBootTestclassDateTimeTests{ @ResourceprivateUserMapperuserMapper;@TestpublicvoidtestDate(){ Useruser=newUser();//省略其他字段user.setCreateDate(newDate());userMapper.insertSelective(user);}}执行单元测试,查看数据库中插入的数据。Bug复现,时间的确是前一天的,与当前时间相差个小时。
经过上面三步的排查,核实了数据库字段和代码中类型没问题。单元测试也复现了问题,同事没有欺骗我,总要眼见为实,哈哈~
于是基本确定是时区问题。
时区排查检查服务器时间登录测试服务器,执行date命令,检查服务器时间和时区:
[root@xxx~]#date年月日星期四::CST[root@xxx~]#date-RThu,Nov::+显示时间是当前时间,采用CST时间,最后的+,即东8区,unitywebrequest源码没问题。
检查数据库时区连接数据库,执行show命令:
showvariableslike'%time_zone%';+----------------------------+|Variable|Value|+----------------------------+|system_time_zone|CST||time_zone|SYSTEM|system_time_zone:全局参数,系统时区,在MySQL启动时会检查当前系统的时区并根据系统时区设置全局参数system_time_zone的值。值为CST,与系统时间的时区一致。
time_zone:全局参数,设置每个连接会话的时区,默认为SYSTEM,使用全局参数system_time_zone的值。
检查代码中时区在单元测试的方法内再添加打印时区的代码:
@TestpublicvoidtestDate(){ System.out.println(System.getProperty("user.timezone"));Useruser=newUser();//省略其他字段user.setCreateDate(newDate());userMapper.insertSelective(user);}打印的时区为:
Asia/Shanghai也就是说Java中使用的是UTC时区进行业务逻辑处理的,也是东八区的时间。
那么问题到底出在哪里呢?
问题基本呈现经过上述排查,基本上确定是时区的问题。这里,再补充一下上述相关的时区知识点。
UTC时间UTC时间:世界协调时间(UTC)是世界上不同国家用来调节时钟和时间的主要时间标准,也就是零时区的时间。
UTC, Coordinated Universal Time是一个标准,而不是一个时区。UTC 是一个全球通用的时间标准。全球各地都同意将各自的时间进行同步协调 (coordinated),这也是UTC名字的来源:Universal Coordinated Time。
CST时间CST时间:中央标准时间。
CST可以代表如下4个不同的时区:
Central Standard Time (USA) UT-6:,美国
Central Standard Time (Australia) UT+9:,澳大利亚
China Standard Time UT+8:,中国
Cuba Standard Time UT-4:,古巴
再次分析很显然,这里与UTC时间无关,它只是时间标准。目前Mysql中的system_time_zone是CST,而CST可以代表4个不同的时区,那么,Mysql把它当做哪个时区进行处理了呢?
简单推算一下,中国时间是UT+8:,美国是 UT-6:,当传入中国时间,直接转换为美国时间(未考虑时区问题),时间便慢了个小时。
既然知道了问题,那么解决方案也就有了。
解决方案针对上述问题可通过数据库层面和代码层面进行解决。
方案一:修改数据库时区既然是Mysql理解错了CST指定的时区,那么就将其设置为正确的。
连接Mysql数据库,设置正确的strlcat源码时区:
[root@xxxxx~]#mysql-uroot-pmysql>setglobaltime_zone='+8:';mysql>settime_zone='+8:'mysql>flushprivileges;再次执行show命令:
showvariableslike'%time_zone%';+----------------------------+|Variable|Value|+----------------------------+|system_time_zone|CST||time_zone|+:|可以看到时区已经成为东八区的时间了。再次执行单元测试,问题得到解决。
此种方案也可以直接修改MySQL的my.cnf文件进行指定时区。
方案二:修改数据库连接参数在代码连接数据库时,通过参数指定所使用的时区。
在配置数据库连接的URL后面添加上指定的时区serverTimezone=Asia/Shanghai:
url:jdbc:MySQL://xx.xx.xx.xx:/db_name?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=Asia/Shanghai再次执行单元测试,问题同样可以得到解决。
问题完了?经过上述分析与操作,时区的问题已经解决了。问题就这么完事了吗?为什么是这样呢?
为了验证时区问题,在时区错误的数据库中,创建了一个字段,该字段类型为datetime,默认值为CURRENT_TIMESTAMP。
那么,此时插入一条记录,让Mysql自动生成该字段的时间,你猜该字段的时间是什么?中国时间。
神奇不?为什么同样是CST时区,系统自动生成的时间是正确的,而代码插入的时间就有时差问题呢?
到底是Mysql将CST时区理解为美国时间了,还是Mybatis、连接池或驱动程序将其理解为美国时间了?
重头戏开始为了追查到底是代码中哪里出了问题,先开启Mybatis的debug日志,看看insert时是什么值:
--::.[||]DEBUG---[scheduling-1]c.h.s.m.H.listByCondition:==>Parameters:--::(String),0(Integer),1(Integer),2(Integer),3(Integer),4(Integer)上面是insert时的参数,也就是说在Mybatis层面时间是没问题的。排除一个。
那是不是连接池或驱动程序的问题?连接池本身来讲跟数据库连接的具体操作关系不大,就直接来排查驱动程序。
Mybatis是xml中定义日期字段类型为TIMESTAMP,扒了一下mysql-connector-Java-8.0.x的源码,发现SqlTimestampValueFactory是用来处理TIMESTAMP类型的。
在SqlTimestampValueFactory的构造方法上打上断点,执行单元测试:
可以明确的看到,Calendar将时区设置为Locale.US,也就是美国时间,时区为CST,offset为-。-单位为毫秒,转化为小时,恰好是“-6:”,这与北京时间“GMT+:”恰好相差个小时。
于是一路往上最终追溯调用链路,该TimeZone来自NativeServerSession的serverTimeZone,而serverTimeZone的值是由NativeProtocol类的configureTimezone方法设置的。
publicvoidconfigureTimezone(){ StringconfiguredTimeZoneOnServer=this.serverSession.getServerVariable("time_zone");if("SYSTEM".equalsIgnoreCase(configuredTimeZoneOnServer)){ configuredTimeZoneOnServer=this.serverSession.getServerVariable("system_time_zone");}StringcanonicalTimezone=getPropertySet().getStringProperty(PropertyKey.serverTimezone).getValue();if(configuredTimeZoneOnServer!=null){ //usercanoverridethiswithdriverproperties,sodon'tdetectifthat'sthecaseif(canonicalTimezone==null||StringUtils.isEmptyOrWhitespaceOnly(canonicalTimezone)){ try{ canonicalTimezone=TimeUtil.getCanonicalTimezone(configuredTimeZoneOnServer,getExceptionInterceptor());}catch(IllegalArgumentExceptioniae){ throwExceptionFactory.createException(WrongArgumentException.class,iae.getMessage(),getExceptionInterceptor());}}}if(canonicalTimezone!=null&&canonicalTimezone.length()>0){ //此处设置TimeZonethis.serverSession.setServerTimeZone(TimeZone.getTimeZone(canonicalTimezone));if(!canonicalTimezone.equalsIgnoreCase("GMT")&&this.serverSession.getServerTimeZone().getID().equals("GMT")){ throwExceptionFactory.createException(WrongArgumentException.class,Messages.getString("Connection.9",newObject[]{ canonicalTimezone}),getExceptionInterceptor());}}}debug跟踪一下上述代码,显示信息如下:
至此,通过canonicalTimezone值的牛 源码获取,可以看出URL后面配置serverTimezone=Asia/Shanghai的作用了。其中,上面第一个代码块获取time_zone的值,第二个代码块中获取system_time_zone的值。这与查询数据库获得的值一致。
因为出问题时并未在url中添加参数serverTimezone=Asia/Shanghai,所以走canonicalTimezone为null的情况。随后逻辑中调用了TimeUtil.getCanonicalTimezone方法:
[root@xxx~]#date年月日星期四::CST[root@xxx~]#date-RThu,Nov::+上述代码中最终走到了loadTimeZoneMappings(exceptionInterceptor);方法:
[root@xxx~]#date年月日星期四::CST[root@xxx~]#date-RThu,Nov::+该方法加载了配置文件"/com/mysql/cj/util/TimeZoneMapping.properties"里面的值,经过转换,timeZoneMappings中,对应CST的为"CST"。
最终得到canonicalTimezone为“CST”,而TimeZone获得是通过TimeZone.getTimeZone(canonicalTimezone)方法获得的。
也就是说TimeZone.getTimeZone("CST")的值为美国时间。写个单元测试验证一下:
[root@xxx~]#date年月日星期四::CST[root@xxx~]#date-RThu,Nov::+打印结果:
[root@xxx~]#date年月日星期四::CST[root@xxx~]#date-RThu,Nov::+很显然,该方法传入CST之后,默认是美国时间。
至此,问题原因基本明朗:
Mysql中设置的server_time_zone为CST,time_zone为SYSTEM。
Mysql驱动查询到time_zone为SYSTEM,于是使用server_time_zone的值,为”CST“ 。
JDK中TimeZone.getTimeZone("CST")获得的值为美国时区;
以美国时区构造的Calendar类;
SqlTimestampValueFactory使用上述Calendar来格式化系统获取的中国时间,时差问题便出现了;
最终反映在数据库数据上就是错误的时间。
serverVariables变量再延伸一下,其中server_time_zone和time_zone都来自于NativeServerSession的serverVariables变量,该变量在NativeSession的loadServerVariables方法中进行初始化,关键代码:
[root@xxx~]#date年月日星期四::CST[root@xxx~]#date-RThu,Nov::+在上述StringBuilder的append操作中,有"@@time_zone AS time_zone"和"@@system_time_zone AS system_time_zone"两个值,然后查询数据库,从数据库获得值之后,put到serverVariables中。
再来debug一下:
可以看出system_time_zone的值为CST。
同样time_zone的值为“SYSTEM”。
根据代码中的提示,拼接与代码一样的SQL查询一下数据库:
[root@xxx~]#date年月日星期四::CST[root@xxx~]#date-RThu,Nov::+值的确是“SYSTEM”。此时,我们又得出另外一个查询Mysql当前时区的方法。
至此,该问题的排查完美收官。大出一口气~~~
小结在上述问题排查的过程中,多次用到单元测试,这也是单元测试的魅力所在,用最简单的代码,最轻量的逻辑,最节省时间的方式来验证和追踪错误。
再回顾一下上述Bug排查中用到和学到的fbx源码知识点:
Linux日期查看,时区查看及衍生如何配置时区;
Mysql时区查看;
Spring Boot单元测试;
Java时区获取;
UTC时间和CST时间;
两种解决时区问题的方案;
阅读、debug Mysql驱动源代码;
TimeZone.getTimeZone("CST")默认时区为美国时区;
Mysql驱动中处理时区问题基本流程逻辑;
Mybatis debug日志相关打印;
其他相关知识。
通过本篇Bug查找的文章,你学到了什么?如果有那么一点启发,不要吝啬,给点个赞吧!
博主简介:《SpringBoot技术内幕》技术图书作者,酷爱钻研技术,写技术干货文章。
公众号:「程序新视界」,博主的公众号,欢迎关注~
技术交流:请联系博主微信号:zhuan2quan
Java日期时间API系列-----Jdk8时间类转换,LocalDateTime转Date等
在Jdk8的Java.time包中,新日期时间API的灵活性和易用性得到了显著提升,尽管Date类型仍然广泛使用,但转换操作必不可少。本文将详细介绍LocalDateTime与Date,以及与其他时间类如Instant、LocalDate、LocalTime和ZonedDateTime之间的转换。以下是一个实用的工具类,供参考:
1. LocalDateTime到Date的转换
2. LocalDate到Date的转换
3. LocalTime到Date的转换
4. Instant到Date的转换,以及epochMilli毫秒到Date的转换
5. ZonedDateTime到Date的转换
6. 从Date反向转换至LocalDateTime
7. LocalDate到LocalDateTime的转换
8. LocalTime到LocalDateTime的转换
9. Instant到LocalDateTime的转换,以及epochMilli毫秒到LocalDateTime的转换
. Temporal到LocalDateTime的转换
. ZonedDateTime到LocalDateTime的转换
同样,Date到其他时间类的转换也包括:
- Date到LocalDate
- LocalDateTime到LocalDate
- Instant到LocalDate
- Temporal到LocalDate
- ZonedDateTime到LocalDate
- Date到LocalTime
- LocalDateTime到LocalTime
- Instant到LocalTime
- Temporal到LocalTime
- ZonedDateTime到LocalTime
- Date到Instant
- LocalDateTime到Instant
- LocalDate到Instant
- LocalTime到Instant
- epochMilli毫秒到Instant
- Temporal到Instant
- ZonedDateTime到Instant
要查看详细的测试代码和源码,请查看相关链接。
以上就是关于Java日期时间API中LocalDateTime与Date转换以及其他时间类之间转换的全面指南。
java初学者用什么软件比较好?
java软件开发可以用哪些软件?
JBuilder环境开发程序方便,它是纯的Java开发环境,适合企业的J2EE开发;缺点是往往一开始人们难于把握整个程序各部分之间的关系,对机器的硬件要求较高,比较吃内存,这时运行速度显得较慢。
开发工具:有ibm开源的eclipse及衍生的myeclipse,sun的netbeans、或者收费的好用的IntelliJIDEA等等。
MyEclipse:MyEclipse是Eclipse的升级版,也是一款功能强大的J2EE集成开发环境,由Genuitec公司发布,提供免费版和收费版。被誉为最好用的JavaIDE之一。
IDEADEA是业内被认为最好的Java开发工具之一。作为一款综合的Java编程环境,IDEA提供了一系列具有实用性的工具组合,可支持Ant、GIT、JUnit、J2EE、SVN等集成,还可以实现智能编码辅助、自动控制。
学的话,如果你做web相关的myeclipse方便些,其他么eclipse就可以了。
学习java需要下载什么软件?学习java的软件有如下:IntellijIDEAIntellijIDEA是当前Java开发人员呼声很高的一款IDE,具有美观,高效等众多特点,小编还是非常喜欢的,所以以往我都是在自己电脑安装这款软件的。
安装JDK,到官网上去下载JDK6,不需要使用最新的8,很多软件为了兼容性都还在6上跑着。学习好基础之后,再使用集成开发环境的开发工具(IDE),推荐使用InteliJ(付费的),功能很强大,智能。
java初学者就可以用myeclipse或者eclipse,还有记事本。随着学习的深入,相信慢慢都会了解到也会从中找到最适合自己的那款开发工具。java初学者用什么软件java初学者用myeclipse或者eclipse,记事本都可以。
数控编程现在用的多的还是Mastercam、UG、Cimtron、PowerMILL等软件。国内也有Caxa(北航研制)、NPU(西北工业大学研制)等功能也很强大,适合大型专用工件的加工编程。
学习java要什么软件?java编程软件哪个好?昌平北大青鸟java培训小编为你详细解JDK(JavaDevelopmentKit)JDK是整个Java的核心,包括了Java运行环境(JavaRuntimeEnvirnment),一堆Java工具和Java基础的类库(rt.jar)。
IDEA与eclipse哪个更适合Java初学者?
1、专业性:idea应该是更专业的,有更高的代码更新机制和代码提示功能。但是eclipse涉及的范围更广,除了java和可以编辑其他语言的项目。
2、并且在IntelliJIDEA之前,Eclipse是企业中用的最多的Java开发工具,现在慢慢的被idea取代,但是对于新手来说,还是够用的。
3、认为这不仅仅是个人喜好的问题,有客观的原因能表明:IntellijIDEA肯定比Eclipse更好。不会去大量比较两者细微不同,例如插件与快捷键之类的。因为有一系列的blog是关于这些的,例如:[part1][part2][part3]。
Java编程工具有哪些比较好用?1、JcreatorJcreator是专注于Java程序设计的集成式开发环境。具有小巧、易用、美观等优点,是适合Java初学者的IDE。不仅可以支持JSP、Ant、CVS,还可以进行无限撤销、自动类库方法提示、代码缩进等功能。
2、EditplusEditPlus是功能很全面的文本、HTML、程序源代码编辑器。默认的支持HTML、ASP、Perl、C/C++、CSS、PHP、Java、java和VB的语法着色。通过定制语法文件还可以扩展到其他程序语言。
3、用elipsebean,我都用过,都很好,喜欢中文介面的话,bean好点java开发工具,对于初学者用哪个比较好?对于初学者,为了减少学习难度,还是建议选一个好用的IDE,如eclipse、bean。
4、IntelliJIDEAIntelliJIDEA,是java编程语言开发的集成环境。
5、MongoDBMongoDB是使用非常广泛的工具,具有跨平台和面向文档数据库等优势,是现在使用最多的一种数据库。在使用过程中,有灵活的文档模型、高可用复制集、可扩展分片集群,还能进行实时监控等相关操作。
6、现在java编程一般使用什么软件IntelliJIDEA使用者较多。相对来说比eclipse等软件更好用,功能更强,集成度更高。
初学java一般用什么开发工具?JcreatorJcreator是专注于Java程序设计的集成式开发环境。具有小巧、易用、美观等优点,是适合Java初学者的IDE。不仅可以支持JSP、Ant、CVS,还可以进行无限撤销、自动类库方法提示、代码缩进等功能。
java初学者就可以用myeclipse或者eclipse,还有记事本。随着学习的深入,相信慢慢都会了解到也会从中找到最适合自己的那款开发工具。java初学者用什么软件java初学者用myeclipse或者eclipse,记事本都可以。
要想编写程序,需要一个能编写源代码的编辑工具。例如:Notepad++;要想测试程序,需要一个编译、执行工具。例如:JDK;要想单独测试一个单元,需要一个单元测试工具。
SQLDeveloper:作用是针对数据库管理员的免费工具,能够使用它链接数据库和SQL语句。虽然功能没有Toadbut多,但对Java开发者足够用了。SQLDeveloper唯一的缺点就是使用时要有JDK。Jad:用于反编译Java类。
初学者的话不建议上来就用IDE开发工具比如说Eclipse、MyEclipse、IntelliJIDEA、netbean。但是也可以使用这些,不建议的原因不便于你了解JavaAPI,及相关的编译原理,编译过程之类的。主要是就是熟悉基础。
Java的初学者应该用什么编程软件?1、IntelliJIDEA:IntelliJIDEA是一款综合的Java编程环境,被许多开发人员和行业专家誉为市场上最好用的IDE之一,与MyEclipse齐名。
2、数控编程现在用的多的还是Mastercam、UG、Cimtron、PowerMILL等软件。国内也有Caxa(北航研制)、NPU(西北工业大学研制)等功能也很强大,适合大型专用工件的加工编程。
3、Jcreator是一个用于Java程序设计的集成开发环境,具有编辑、调试、运行Java程序的功能。这个软件比较小巧,对硬件要求不是很高,完全用C++写的,速度快、效率高。
4、用myeclipse或者eclipse,记事本都可以。初学者的话不建议上来就用IDE开发工具比如说Eclipse、MyEclipse、IntelliJIDEA、netbean。但是也可以使用这些,不建议的原因不便于你了解JavaAPI,及相关的编译原理,编译过程之类的。
5、学习java要什么软件?java编程软件哪个好?昌平北大青鸟java培训小编为你详细解JDK(JavaDevelopmentKit)JDK是整个Java的核心,包括了Java运行环境(JavaRuntimeEnvirnment),一堆Java工具和Java基础的类库(rt.jar)。
6、JAVA编程常用的软件:IntellijIDEAIntellijIDEA是当前Java开发人员呼声很高的一款IDE,具有美观,高效等众多特点,小编还是非常喜欢的,所以以往我都是在自己电脑安装这款软件的。
为什么我的java源代码是乱码?
这是Java文件的编码导致的问题,通常使用javacFirstSample.java编译UTF-8编码的.java源文件。没有指定编码参数encoding的情况下,默认使用的是GBK编码当编译器用GBK编码来编译UTF-8文件时,就会把UTF-8编码文件的3个字节的文件头,按照GBK中汉字占2字节、英文占1字节的特性解码成了“乱码”的两个汉字。这个源文件应该是用记事本另存为UTF-8编码造成的。
解决方法:
对于非GBK及其子集编码(GB)的源文件,编译方式为javac-encodingUTF-8FirstSample.java。但还是会出现错误,提示非法字节。
这是因为.java只识别不带BOM的UTF-8编码。所以应该用EmEditor、Editplus、ULtraEdit或notepad++之类的工具另存为UTF-8(无BOM)。然后就可以用javac.java编译.java文件了。
/iknow-pic.cdn.bcebos.com/7e3ecdcffcf5dcdbaabba"target="_blank"title=""class="ikqb_img_alink">/iknow-pic.cdn.bcebos.com/7e3ecdcffcf5dcdbaabba?x-bce-process=image%2Fresize%2Cm_lfit%2Cw_%2Ch_%2Climit_1%2Fquality%2Cq_%2Fformat%2Cf_auto"esrc="/7e3ecdcffcf5dcdbaabba"/>
扩展资料:
语言特点:
1.简单性
Java看起来设计得很像C++,但是为了使语言小和容易熟悉,设计者们把C++语言中许多可用的特征去掉了,这些特征是一般程序员很少使用的。例如,Java不支持goto语句,代之以提供break和continue语句以及异常处理。
2.面向对象
Java是一个面向对象的语言。对程序员来说,这意味着要注意应中的数据和操纵数据的方法(method),而不是严格地用过程来思考。Java还包括一个类的扩展集合,分别组成各种程序包(Package),用户可以在自己的程序中使用。
3.分布性
Java设计成支持在网络上应用,它是分布式语言。Java既支持各种层次的网络连接,又以Socket类支持可靠的流(stream)网络连接,所以用户可以产生分布式的客户机和服务器。
4.编译和解释性
Java编译程序生成字节码(byte-code),而不是通常的机器码。Java字节码提供对体系结构中性的目标文件格式,代码设计成可有效地传送程序到多个平台。Java程序可以在任何实现了Java解释程序和运行系统(run-timesystem)的系统上运行。
5.稳健性
Java原来是用作编写消费类家用电子产品软件的语言,所以它是被设计成写高可靠和稳健软件的。Java消除了某些编程错误,使得用它写可靠软件相当容易。
参考资料:
/blog.csdn.net/shengzhu1/article/details/"target="_blank"title="CSDN:Java解释执行">CSDN:Java解释执行
javaç¨åºåç¨ä»ä¹è½¯ä»¶å代ç ï¼
JAVAç¼ç¨åå¦,ç¨ä»ä¹è½¯ä»¶?
1ãæ°æ§ç¼ç¨ç°å¨ç¨çå¤çè¿æ¯MastercamãUGãCimtronãPowerMILLç软件ãå½å ä¹æCaxaï¼åèªç å¶ï¼ãNPUï¼è¥¿åå·¥ä¸å¤§å¦ç å¶ï¼çåè½ä¹å¾å¼ºå¤§ï¼éå大åä¸ç¨å·¥ä»¶çå å·¥ç¼ç¨ã
2ãJDK(JavaDevelopmentKit)JDKæ¯æ´ä¸ªJavaçæ ¸å¿ï¼å æ¬äºJavaè¿è¡ç¯å¢(JavaRuntimeEnvirnment)ï¼ä¸å Javaå·¥å ·åJavaåºç¡çç±»åº(rt.jar)ãä¸è®ºä»ä¹Javaåºç¨æå¡å¨å®è´¨é½æ¯å ç½®äºæ个çæ¬çJDKã
3ãä½æ¯ç°å¨é½ä½¿ç¨MyEclipseï¼å®å æ¬äºeclipseï¼è¿å æ¬äºå ¶å®æ¡æ¶ï¼æ¯å¦ï¼Strutsï¼Springï¼Hibernateçï¼æä»¥å»ºè®®ä½ ç¨MyEclipse6ï¼å¨ç½ä¸å°±å¯ä»¥å è´¹ä¸è½½ãæä½æ¹ä¾¿ï¼é常好ç¨ï¼å¼ºçæ¨èã
4ãjavaç¨IntelliJIDEAãNetBeans软件ç¼ç¨æ好ãIntelliJIDEAIntelliJIDEAï¼æ¯javaç¼ç¨è¯è¨å¼åçéæç¯å¢ã
Javaç¨åºåå¿ å¤çå¼åå·¥å ·æåªäº
MongoDBMongoDBæ¯ä½¿ç¨é常广æ³çå·¥å ·ï¼å ·æ跨平å°åé¢åææ¡£æ°æ®åºçä¼å¿ï¼æ¯ç°å¨ä½¿ç¨æå¤çä¸ç§æ°æ®åºãå¨ä½¿ç¨è¿ç¨ä¸ï¼æçµæ´»çæ档模åãé«å¯ç¨å¤å¶éãå¯æ©å±åçé群ï¼è¿è½è¿è¡å®æ¶çæ§çç¸å ³æä½ã
ServiceLoader-å è½½æå¡Javaå¼å人åé常å¸æåºå使ç¨ä»ä¹åå建ä»ä¹ï¼åé¾è§java课ç¨å¹è®æºæåç°é常æ¯éè¿å建ä¸ä¸ªæè¿°ç»ä»¶æä½çæ¥å£å使ç¨æç§ä¸ä»å建ç»ä»¶å®ä¾ã
ApacheCommonsLangApacheCommonsLangæ¯ApacheæèåçJAVAåºï¼å®æ¯å¯¹java.langçå¾å¥½æ©å±ï¼å å«äºå¤§éé常å®ç¨çå·¥å ·ç±»ï¼å ¶ä¸ç¨çæå¤çæStringUtilsï¼DateUtilsï¼NumberUtilsçã
Groovyæ们使ç¨Groovyæ¥åJavaæµè¯ã为ä»ä¹ï¼å 为å®æä¾äºä¸é¢è¿äºè½åï¼å®½æ¾çJavaè¯æ³ï¼è¿æ¯Javaè¯æ³ï¼ä½æäºå ¶ä»è§åï¼æ¯å¦åå·ï¼åéç±»åï¼è®¿é®ä¿®é¥°ç¬¦é½æ¯å¯éçã
ä½ å¥½ï¼ç®åjava主æµå¸¸ç¨çå¼åå·¥å ·æï¼Notepadï¼MyEclipseï¼IntllijIDEAã使ç¨é¾åº¦ä¾æ¬¡éæ¸éå¢ï¼å½ç¶è½å¤å®ç°çåè½ä¹è¶æ¥è¶å¤æåå¤æ ·ã
常ç¨çå·¥å ·æï¼Eclipseæ®æ°æ®æ¾ç¤ºå¾å¤Javaå¼å人åçJavaå¼åå·¥å ·ä¾¿æ¯Eclipseï¼è¿ä¸»è¦å¾çäºEclipseæ¯ä¸ä¸ªå¼æºçãå¯ä»¥åºäºJavaçå¯æ©å±å¼åå¹³å°ã
Javaç¨åºå常ç¨çå¼åå·¥å ·æåªäº?1ãSublimeTextæ¯ç±ç¨åºåJonSkinneräºå¹´1æ份æå¼ååºæ¥ï¼å®æå被设计为ä¸ä¸ªå ·æ丰å¯æ©å±åè½çVimãå®æ¯ä¸æ¬¾æ¶è´¹è½¯ä»¶ï¼ä½æ¯å¯ä»¥æ éæè¯ç¨ï¼å®æ¯ä¸ä¸ªè·¨å¹³å°çç¼è¾å¨ï¼åæ¶æ¯æWindowsãLinuxãMacOSXçæä½ç³»ç»ã
2ãjavaå¼åå·¥å ·JavaWorkshopSunMicroSystemså ¬å¸äºæ¨åºäºJavaWorkShop0ï¼è¿æ¯ä¸çåºç°ç第ä¸ä¸ªä¾Internetç½ä½¿ç¨çå¤å¹³å°å¼åå·¥å ·ï¼å®å¯ä»¥æ»¡è¶³åå ¬å¸å¼åInternetåIntranetç½åºç¨è½¯ä»¶çéè¦ã
3ãNetBasesæ¯javaå¼åæ¡é¢åºç¨ç¨åºç¨çãJBuilderæ¯å¼åWebåºç¨ç¨åºçï¼å å¹´åæ¯è¾æµè¡ï¼ä½æ¯JBuilderå¨javaç¼ç¨å·¥å ·ä¸ç»æ²»äºå¤§çº¦å¹´å·¦å³åï¼å®çå°ä½è¢«Eclipseæ¢èµ°äºãç°å¨ææµè¡çjavaå¼åå·¥å ·å°±æ¯Eclipseäºã
4ãGroovyæ们使ç¨Groovyæ¥åJavaæµè¯ã为ä»ä¹ï¼å 为å®æä¾äºä¸é¢è¿äºè½åï¼å®½æ¾çJavaè¯æ³ï¼è¿æ¯Javaè¯æ³ï¼ä½æäºå ¶ä»è§åï¼æ¯å¦åå·ï¼åéç±»åï¼è®¿é®ä¿®é¥°ç¬¦é½æ¯å¯éçã
5ã常ç¨çå·¥å ·æï¼Eclipseæ®æ°æ®æ¾ç¤ºå¾å¤Javaå¼å人åçJavaå¼åå·¥å ·ä¾¿æ¯Eclipseï¼è¿ä¸»è¦å¾çäºEclipseæ¯ä¸ä¸ªå¼æºçãå¯ä»¥åºäºJavaçå¯æ©å±å¼åå¹³å°ã
6ãç¨Javaå¼åç软件å¦ä¸ï¼Notepad++Notepad++æ¯Windowsæä½ç³»ç»ä¸çä¸å¥ææ¬ç¼è¾å¨ï¼æå®æ´çä¸æåæ¥å£åæ¯æå¤å½è¯è¨ç¼åçåè½ï¼UTF8ææ¯ï¼ã
javaç¨ä»ä¹è½¯ä»¶ç¼åJAVAç¼ç¨å¸¸ç¨ç软件ï¼IntellijIDEAIntellijIDEAæ¯å½åJavaå¼å人åå¼å£°å¾é«çä¸æ¬¾IDEï¼å ·æç¾è§ï¼é«æçä¼å¤ç¹ç¹ï¼å°ç¼è¿æ¯é常å欢çï¼æ以以å¾æé½æ¯å¨èªå·±çµèå®è£ è¿æ¬¾è½¯ä»¶çã
IntelliJIDEAï¼IntelliJIDEAæ¯ä¸æ¬¾ç»¼åçJavaç¼ç¨ç¯å¢ï¼è¢«è®¸å¤å¼å人ååè¡ä¸ä¸å®¶èªä¸ºå¸åºä¸æ好ç¨çIDEä¹ä¸ï¼ä¸MyEclipseé½åã
åå¦Javaä¹åï¼å¾å¤äººé½ä¸æ¸ æ¥éè¦ç¨å°åªäºè½¯ä»¶ï¼å¦ä¹ javaé¦å éè¦å¦ä¹ JDKï¼JDKæ¯ä¸ä¸ªç¼åJavaçAppletå°ç¨åºååºç¨ç¨åºçç¨åºå¼åç¯å¢ãJDKæ¯æ´ä¸ªJavaçæ ¸å¿ï¼å æ¬äºJavaè¿è¡ç¯å¢ï¼ä¸äºJavaå·¥å ·åJavaçæ ¸å¿ç±»åºã
ç¨myeclipseæè eclipseï¼è®°äºæ¬é½å¯ä»¥ãåå¦è çè¯ä¸å»ºè®®ä¸æ¥å°±ç¨IDEå¼åå·¥å ·æ¯å¦è¯´EclipseãMyEclipseãIntelliJIDEAãnetbeanãä½æ¯ä¹å¯ä»¥ä½¿ç¨è¿äºï¼ä¸å»ºè®®çåå ä¸ä¾¿äºä½ äºè§£JavaAPIï¼åç¸å ³çç¼è¯åçï¼ç¼è¯è¿ç¨ä¹ç±»çã
javaç¨IntelliJIDEAãNetBeans软件ç¼ç¨æ好ãIntelliJIDEAIntelliJIDEAï¼æ¯javaç¼ç¨è¯è¨å¼åçéæç¯å¢ã
Hadoopæ¯è¿è¡Javaç¼åç软件æ¡æ¶ï¼ä¸»è¦ä½¿ç¨å¨åå¸å¼åå¨ã对äºé常大çæ°æ®ï¼ç¨æ·å¯ä»¥å¨ä¸ç¥éåå¸å¼åºç¡çæ åµä¸è¿è¡å¼ååå¸å¼ç¨åºï¼å¹¶ä¸è½å¤ä½¿ç¨é群å®ç°é«é计ç®ååå¨ã
æä»ä¹java软件å¯ä»¥ç¼åjava?1ãIDEAä¹ä¸éï¼æ两个çæ¬ï¼å è´¹ççå¯ä»¥åJavaå¼åï¼å°±æ¯åé£ç§è·èµ·æ¥æ¯é»æ¡æ¡çJavaç¨åºï¼ä¹å¯ä»¥åAndroidå¼å(åAndroidæ´å¥½çéæ©å»googleä¸è½½AndroidStudio)ï¼ä»è´¹ççè¿å¯ä»¥åJ2EEå¼åã
2ãJavaDevelopmentKitï¼JDKï¼ï¼JDKæ¯Javaç¼åæå¿ éç软件å ãå®å æ¬Javaç¼è¯å¨ãJavaè¿è¡æ¶ç¯å¢åå ¶ä»å·¥å ·ï¼å¦JavaDocåJConsoleãJDKæä¾äºJavaAPIåå ¶ä»å¼åå·¥å ·ï¼ä½¿Javaç¼åæ´å 容æã
3ãIntellijIDEAIntellijIDEAæ¯å½åJavaå¼å人åå¼å£°å¾é«çä¸æ¬¾IDEï¼å ·æç¾è§ï¼é«æçä¼å¤ç¹ç¹ï¼å°ç¼è¿æ¯é常å欢çï¼æ以以å¾æé½æ¯å¨èªå·±çµèå®è£ è¿æ¬¾è½¯ä»¶çã
4ãJAVAç¼ç¨å¸¸ç¨ç软件ï¼Eclipseï¼Eclipseæ¯ä¸ä¸ªå¼æ¾æºä»£ç çãåºäºJavaçå¯æ©å±å¼åå¹³å°ãå°±å ¶æ¬èº«èè¨ï¼å®åªæ¯ä¸ä¸ªæ¡æ¶åä¸ç»æå¡ï¼ç¨äºéè¿æ件ç»ä»¶æ建å¼åç¯å¢ã
5ãjavaç¨IntelliJIDEAãNetBeans软件ç¼ç¨æ好ãIntelliJIDEAIntelliJIDEAï¼æ¯javaç¼ç¨è¯è¨å¼åçéæç¯å¢ã
6ã\x0d\NetBeans-SUNå ¬å¸èªå·±å¼åçJavaå¼åç¯å¢ï¼åè½æºå¤çã\x0d\è¿æä¸äºè¶ å欢æå·¥ç¼åJava代ç çç人å欢使ç¨å¸¦è¯æ³çè²åè½ç纯ææ¬ç¼è¾å¨ç¼åJavaç¨åºï¼ä»£ç åå®åå¨å½ä»¤æ示符ä¸ç¼è¯è¿è¡ã
javapythonï¼
javaåpythonçåºå«
javaåpythonçåºå«ï¼
1ãæ ¸å¿ä¸åï¼Pythonçæ ¸å¿æ¯å¯ä»¥ä½¿ç¨Cè¯è¨æC++åºï¼Javaèææºæ¯javaæ ¸å¿ã
2ãç¹ç¹ä¸åï¼Pythonæ¯å ¨å¨ææ§ï¼è¿è¡æ¶å¯ä»¥ä¿®æ¹ä»£ç ï¼èJavaåªè½éè¿åéå®ç°ã
3ã设计æ¹æ³ä¸åï¼Pythonæ¯é¢åè¿ç¨è®¾è®¡æ¹æ³ï¼Javaæ¯éç¨é¢å对象ç设计æ¹æ³ã
4ãä¼å¿æ§ä¸åï¼Pythonç强大å¨äºåºï¼Java没æå¼æºåºï¼å°±æ¯ä¸ä¸ªjarå ã
5ãç¨éä¸åï¼Pythonå¯ä»¥å¾å¤èææºå®ç°ï¼éåç¨äºä¸å¡è¯è¨æè æ件ãé¢åè¯è¨ï¼Javaèææºå·¨å¤§ï¼å¾å°ç¨äºæ件è¯è¨ï¼ä¹ä¸æ¹ä¾¿ãPythonç¨éæ¯è¾å¤çæ¯èæ¬ï¼Javaæ¯è¾å¤ç¨äºwebã
6ãå¤ææ§ä¸åï¼ç±äºç¼ç æ¯Javaå¤æï¼ç¼ç æ¯Pythonå°ï¼æ以ç产çè¾ä½ï¼ç±äºç¼ç æ¯Pythonç®åãç®çï¼ç¼ç æ¯Javaå¤æï¼ç产çè¾é«ï¼ç产æçä¸æ使ç¨ä»£ç Pythonæäºä½¿ç¨ãç±äºç¼ç å¤æãè¾ççç¼ç 使Pythonreadabilityä¸æ读åã
以ä¸å 容åè?ç¾åº¦ç¾ç§-Java
javaåpythonåªä¸ªå¥½åæä¼å¿ã
javaï¼ä¼ç¾ï¼ä¸¥è°¨ï¼å¥å£®ï¼ä¸æåºéã
pythonï¼è¯æ³ç®åï¼æµ·é第ä¸æ¹åºã
对æ¯ï¼
第ä¸ï¼å ¥é¨é¾åº¦ã
Pythonå°äºJavaï¼Pythonçè¯æ³ç®æ´æ¸ æ°ï¼è¯æ³æ¥è¿è±è¯ï¼Pythonç®åçè¯æ³åå°å°å¯ä»¥å¿½ç¥ä¸è®¡çè¯æ³ç³å¯ä»¥è®©åå¦è ä¸æ³¨äºæèè¦åçäºæ ï¼èä¸éè¦å¨è¿ç¨ä¸å¤§è´¹å¨ç« ãå¼åç¯å¢ç®åï¼è½æåå°±è½å代ç ï¼éåæ°æå ¥é¨å¦ä¹ ã
Javaè¯æ³éè¦è¾å¥½çé»è¾æç»´è½åï¼Javaåºç¡è¯æ³éè¦å¦ä¹ çä¸è¥¿ä¹æ¯è¾å¤ï¼å¦ï¼å ³é®åãæ è¯ç¬¦ã注éã常éä¸åéãè¿ç®ç¬¦ãè¯å¥ãå½æ°ãæ°ç»ççï¼å ¥é¨æ¯Pythonè¦é¾äºã
第äºï¼æµè¡ç¨åº¦ã
èªå¹´èµ·ï¼åå¹´ä¸çç¼ç¨è¯è¨æè¡æ¦ââTIOBEæè¡æ¦ï¼Java常年ä½å± ä¸ç第ä¸ãPythonåå¨å¹´æå¨ç¬¬äºä½ï¼
å¨æ¬§ç¾å½å®¶ï¼è¾ä¸ºæµè¡Pythonï¼èå½å ä¾æ§è¿æ¯Javaä¸PHPç天ä¸ãä½å½å å·²æ许å¤å ¬å¸éç¨Pythonï¼ä¸éç人工æºè½ç计ç®çåå±ï¼Python大æèµ¶è¶ javaçè¶å¿ã
第ä¸ï¼å½å ç¨éã
ç®åå½å Java主è¦ç¨äºå¼åï¼å¤§åä¼ä¸çº§åºç¨ãçµåæ¿å¡ï¼æ¿åºé¨é¨ä¿¡æ¯åç³»ç»ãåµå ¥å¼è®¾å¤åãæ¶è´¹ç±»è®¾å¤ã大åç½ç«ï¼ç¹å«æ¯æ·å®ãé¿éå·´å·´ççµåç½ç«ï¼ãAndroidç³»ç»ï¼APPï¼æ¸¸æçãèPython主è¦ç¨æ¥æ人工æºè½æºå¨åè¿ç»´å端æ¹åã
缺ç¹
pythonï¼
1ãç¬ç¹çè¯æ³ï¼è¿ä¹è®¸ä¸åºè¯¥è¢«ç§°ä¸ºå±éï¼ä½æ¯å®ç¨ç¼©è¿æ¥åºåè¯å¥å ³ç³»çæ¹å¼è¿æ¯ç»å¾å¤åå¦è 带æ¥äºå°æãå³ä¾¿æ¯å¾æç»éªçPythonç¨åºåï¼ä¹å¯è½é·å ¥é·é±å½ä¸ã
2ãè¿è¡éåº¦æ ¢ï¼è¿éæ¯æä¸CåC++ç¸æ¯ã
javaï¼
1ãè¿è¡javaç¨åºéè¦è£ javaèææºã
2ãjavaç¨åºçè¿è¡ææ¬æ¯è¾é«ãæºå¨é ç½®ä¸å¤é«çæ¶åï¼javaæ¾å¾å¾æ ¢ç°ãéçjavaæ¬èº«ççæ¬å级åçµèæ§è½ç强åè¿æ¡åºæ¬å·²ç»ä¸æ¯é®é¢äºã
javaåpythonæ¯ä»ä¹ï¼javaåpythoné½æ¯ä¸ç§é¢å对象çè¯è¨ã
Javaæ¯ä¸ç§é¢å对象çè¯è¨ï¼æçåC/C++è¿ä¼¼çè¯æ³ãå®æ¯å¨æé¾æ¥ï¼å 许æ°ç代ç å¨è¿è¡æ¶å è½½ä¸è¿è¡ï¼èä¸æ¯å¨æç±»åçãJavaçæ¼åç¸å¯¹è¾æ ¢ï¼æè¿æå并äºä¸äºåè½ç¨ä»¥æ¯æå½æ°å¼ç¼ç¨ãç¸å¯¹çè¿ç§è¯è¨åVMçå²å¦é½æ¯å°ååå ¼å®¹ä½ä¸ºé¦è¦æ令ã
Pythonæ¯å®å ¨é¢å对象çè¯è¨ãå½æ°ã模åãæ°åãå符串é½æ¯å¯¹è±¡ãèä¸å®å ¨æ¯æ继æ¿ãéè½½ãæ´¾çãå¤ç»§æ¿ï¼æçäºå¢å¼ºæºä»£ç çå¤ç¨æ§ãPythonæ¯å»ºç«ä¸ä¸ªå¯æ©å±ç对象模åç常ç¨è¯è¨ãç¨äºé¢å对象ç设计并ä¸æå³çå¼åè ç¨Pythonå代ç æ¶æ常ç¨çé£æ ¼å°±æ¯é¢å对象çé£æ ¼ï¼å®åæ ·æ¯æè¿ç¨å¼ç¼ç¨ï¼æ¨¡ååç¼ç¨åæäºæ¹é¢çå½æ°å¼ç¼ç¨ã
æ³äºè§£æ´å¤æå ³JavaåPythonç详æ ï¼æ¨èå¨è¯¢è¾¾å æè²ãè¾¾å æè²æ¥æ1v1ç£å¦è·è¸ªå¼å¦ä¹ æçé®éæ¶æ²éï¼ä¼ä¸çº§é¡¹ç®ï¼è¯¾ç¨ç©¿æ大åçå®é¡¹ç®è®²è§£ï¼å¯¹æ ä¼ä¸äººææ åå¶å®ä¸ä¸å¦ä¹ 计åï¼åæ¬ä¸»æµçç¹ææ¯ï¼ç论ç¥è¯+å¦ä¹ æç»´+å®ææä½ï¼æé å®æ´å¦ä¹ éç¯ãè¾¾å æè²å®æ讲å¸ãç»éªä¸°å¯ãå¤ç§çåä¾å¦åéæ©ãç¬åTTS8.0æå¦ç³»ç»ï¼æ»¡è¶³å¦çå¤æ ·åå¦ä¹ éæ±ãæå ´è¶£çè¯ç¹å»æ¤å¤ï¼å è´¹å¦ä¹ ä¸ä¸
javaè°pythonå¾å¤æåé½æ³ç¥éjavaæä¹è°pythonï¼ä¸é¢å°±ä¸èµ·æ¥äºè§£ä¸ä¸å§~
javaè°python主è¦æ两ç§æ¹æ³ï¼1.使ç¨Runtime.getRuntime()æ§è¡èæ¬æ件ï¼2.å°pythonèæ¬åæè¿ç¨ä¸ºjavaæä¾æå¡ï¼ä¸é¢æ¯å ·ä½çæ¹æ³ä»ç»ï¼
第ä¸ç§ï¼ä½¿ç¨Runtime.getRuntime()æ§è¡èæ¬æ件
å 建ç«pythonèæ¬æ件demo.py
import?numpy?as?npa?=?np.arange().reshape(3,4)print(a)
javaè°ç¨pythonç¨åºå¹¶è¾åºè¯¥ç»æ
import?java.io.BufferedReader;import?java.io.IOException;import?java.io.InputStreamReader;public?class?Demo?{ public?static?void?main(String[]?args)?{ //?TODO?Auto-generated?method?stubProcess?proc;try?{ proc?=?Runtime.getRuntime().exec("python?D:\\demo.py");//?æ§è¡pyæ件//ç¨è¾å ¥è¾åºæµæ¥æªåç»æBufferedReader?in?=?new?BufferedReader(new?InputStreamReader(proc.getInputStream()));String?line?=?null;while?((line?=?in.readLine())?!=?null)?{ System.out.println(line);}in.close();proc.waitFor();}?catch?(IOException?e)?{ e.printStackTrace();}?catch?(InterruptedException?e)?{ e.printStackTrace();}?}}
å¦è¥åpythonç¨åºä¸å½æ°ä¼ éåæ°å¹¶æ§è¡åºç»æï¼ä¸é¢å°±ä¸¾ä¸ä¾æ¥è¯´æä¸ä¸ã
åæ ·å»ºç«pythonèæ¬æ件demo2.py
import?sysdef?func(a,b):return?(a+b)if?__name__?==?'__main__':a?=?[]for?i?in?range(1,?len(sys.argv)):a.append((int(sys.argv[i])))print(func(a[0],a[1]))
å ¶ä¸sys.argvç¨äºè·ååæ°url1ï¼url2çãèsys.argv[0]代表pythonç¨åºåï¼æ以å表ä»1å¼å§è¯»ååæ°ã
以ä¸ä»£ç å®ç°ä¸ä¸ªä¸¤ä¸ªæ°åå æ³çç¨åºï¼ä¸é¢ççå¨javaä¸æä¹ä¼ éå½æ°åæ°ï¼ä»£ç å¦ä¸ï¼
int?a?=?;int?b?=?;try?{ String[]?args?=?new?String[]?{ ?"python",?"D:\\demo2.py",?String.valueOf(a),?String.valueOf(b)?};Process?proc?=?Runtime.getRuntime().exec(args);//?æ§è¡pyæ件BufferedReader?in?=?new?BufferedReader(new?InputStreamReader(proc.getInputStream()));String?line?=?null;while?((line?=?in.readLine())?!=?null)?{ System.out.println(line);}in.close();proc.waitFor();}?catch?(IOException?e)?{ e.printStackTrace();}?catch?(InterruptedException?e)?{ e.printStackTrace();}
å ¶ä¸argsæ¯String[]{ âpythonâ,path,url1,url2};ï¼pathæ¯pythonç¨åºæå¨çè·¯å¾ï¼url1æ¯åæ°1ï¼url2æ¯åæ°2ï¼ä»¥æ¤ç±»æ¨ã
2.å°pythonèæ¬åæè¿ç¨ä¸ºjavaæä¾æå¡
pythonèæ¬æ件å¦ä¸ï¼
import?socketimport?sysimport?threadingimport?numpy?as?npfrom?PIL?import?Imagedef?main():#?å建æå¡å¨å¥æ¥åserversocket?=?socket.socket(socket.AF_INET,socket.SOCK_STREAM)#?è·åæ¬å°ä¸»æºå称host?=?socket.gethostname()#?设置ä¸ä¸ªç«¯å£port?=?#?å°å¥æ¥åä¸æ¬å°ä¸»æºå端å£ç»å®serversocket.bind((host,port))#?设置çå¬æ大è¿æ¥æ°serversocket.listen(5)#?è·åæ¬å°æå¡å¨çè¿æ¥ä¿¡æ¯myaddr?=?serversocket.getsockname()print("æå¡å¨å°å:%s"%str(myaddr))#?循ç¯çå¾ æ¥å客æ·ç«¯ä¿¡æ¯while?True:#?è·åä¸ä¸ªå®¢æ·ç«¯è¿æ¥clientsocket,addr?=?serversocket.accept()print("è¿æ¥å°å:%s"?%?str(addr))try:t?=?ServerThreading(clientsocket)#为æ¯ä¸ä¸ªè¯·æ±å¼å¯ä¸ä¸ªå¤ç线ç¨t.start()passexcept?Exception?as?identifier:print(identifier)passpassserversocket.close()passclass?ServerThreading(threading.Thread):#?words?=?text2vec.load_lexicon()def?__init__(self,clientsocket,recvsize=*,encoding="utf-8"):threading.Thread.__init__(self)self._socket?=?clientsocketself._recvsize?=?recvsizeself._encoding?=?encodingpassdef?run(self):print("å¼å¯çº¿ç¨.....")try:#æ¥åæ°æ®msg?=?''while?True:#?读årecvsize个åèrec?=?self._socket.recv(self._recvsize)#?解ç msg?+=?rec.decode(self._encoding)#?ææ¬æ¥åæ¯å¦å®æ¯ï¼å 为python?socketä¸è½èªå·±å¤ææ¥æ¶æ°æ®æ¯å¦å®æ¯ï¼#?æ以éè¦èªå®ä¹åè®®æ å¿æ°æ®æ¥åå®æ¯if?msg.strip().endswith('over'):msg=msg[:-4]breaksendmsg?=?Image.open(msg)#?åéæ°æ®self._socket.send(("%s"%sendmsg).encode(self._encoding))passexcept?Exception?as?identifier:self._socket.send("".encode(self._encoding))print(identifier)passfinally:self._socket.close()?print("ä»»å¡ç»æ.....")passdef?__del__(self):passif?__name__?==?"__main__":main()
å¨java代ç ä¸è®¿é®pythonè¿ç¨ç代ç ï¼package?hello;import?java.lang.System;import?java.io.BufferedReader;import?java.io.IOException;import?java.io.InputStreamReader;import?java.net.InetAddress;import?java.net.Socket;import?java.io.OutputStream;import?java.io.PrintStream;import?java.io.InputStream;public?class?hello?{ public?static?void?main(String[]?args){ //System.out.println("Hello?World!");//?TODO?Auto-generated?method?stubtry?{ InetAddress?addr?=?InetAddress.getLocalHost();String?host=addr.getHostName();//String?ip=addr.getHostAddress().toString();?//è·åæ¬æºip//log.info("è°ç¨è¿ç¨æ¥å£:host="+ip+",port="+);//?åå§åå¥æ¥åï¼è®¾ç½®è®¿é®æå¡ç主æºåè¿ç¨ç«¯å£å·ï¼HOSTæ¯è®¿é®pythonè¿ç¨ç主æºå称ï¼å¯ä»¥æ¯IPå°åæè ååï¼PORTæ¯pythonè¿ç¨ç»å®ç端å£å·Socket?socket?=?new?Socket(host,);//?è·åè¾åºæµå¯¹è±¡OutputStream?os?=?socket.getOutputStream();PrintStream?out?=?new?PrintStream(os);//?åéå 容out.print(?"F:\\xxx\\.jpg");//?åè¯æå¡è¿ç¨ï¼å 容åéå®æ¯ï¼å¯ä»¥å¼å§å¤çout.print("over");//?è·åæå¡è¿ç¨çè¾å ¥æµInputStream?is?=?socket.getInputStream();BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(is,"utf-8"));String?tmp?=?null;StringBuilder?sb?=?new?StringBuilder();//?读åå 容while((tmp=br.readLine())!=null)sb.append(tmp).append('\n');System.out.print(sb);//?解æç»æ//JSONArray?res?=?JSON.parseArray(sb.toString());}?catch?(IOException?e)?{ e.printStackTrace();}finally?{ try?{ if(socket!=null)?socket.close();}?catch?(IOException?e)?{ }System.out.print("è¿ç¨æ¥å£è°ç¨ç»æ.");}?}}
å¦Java好è¿æ¯Python好ï¼
对äºæ°ææ¥è¯´Pythonæ´å®¹æä¸æä¸äºï¼ä½æ¯ç¸å¯¹èè¨javaçåå±æ æ¯æ´å¥½ãåéæè²æ线ä¸å è´¹Java线ä¸å ¬å¼è¯¾ãå 为Javaæ¯ä¸ç§ä¸¥æ ¼çç±»åè¯è¨ï¼è¿æå³çå¿ é¡»æ¾å¼å£°æåéåãç¸æ¯ä¹ä¸ï¼å¨æç±»åçPythonåä¸éè¦å£°æåéãå¨ç¼ç¨è¯è¨ä¸æ许å¤å ³äºå¨æåéæç±»åçäºè®ºï¼ä½æä¸ç¹åºè¯¥æ³¨æï¼Pythonæ¯ä¸ç§è¯æ³ç®åçåè½å¼ºå¤§çè¯è¨ï¼è½å¤éè¿ç¼åèæ¬å°±æä¾ä¼ç§ç解å³æ¹æ¡ï¼å¹¶è½å¤å¿«æ·å°é¨ç½²å¨å个é¢åãJavaå¯ä»¥å建跨平å°çåºç¨ç¨åºï¼èPythonå ä¹å ¼å®¹å½åæææä½ç³»ç»ã对æ°ææ¥è®²ï¼Pythonæ¯Javaæ´å®¹æä¸æï¼èä¸ä»£ç æ读æ§å¼ºï¼ä½æ¯å¦æä½ æ³ä½ ç代ç å¯ä»¥å¨ä»»ä½å°æ¹é½è½æ§è¡çè¯ï¼é£ä¹è¿æ¯éæ©Javaå§ãä¸è¿Javaçå¯ç§»æ¤æ§ä¹æ¯æ代价çï¼ä½¿ç¨Javaä½ éè¦è´ä¹°æ´å¤§çæºå¨ï¼æ¶èæ´å¤çå åï¼å¹¶ä¸ç¨åºæ´å é¾ä»¥å¼åãä½æ¯javaåæçåå±åæ¯ä¼æ´å¥½ãå¦ææ³äºè§£æ´å¤ç¸å ³ç¥è¯ï¼å»ºè®®å°åéæè²äºè§£ä¸ä¸ãåéæè²ç®åå¨ä¸ªåå¸æ¥æä¸ªæ ¡åºï¼å¹´å¹å »ä¼è´¨äººæä½äººï¼ä¸å½å ä½å®¶ä¼ä¸å»ºç«äººæè¾éåä½å ³ç³»ï¼é¢æ ¡åä½è¶ æã