java实现socket编程(三步学会javasocket编程)
- 数据库
- 2023-08-29
- 62
大家好,感谢邀请,今天来为大家分享一下java实现socket编程的问题,以及和三步学会javasocket编程的一些困惑,大家要是还不太明白的话,也没有关系,因为接下...
大家好,感谢邀请,今天来为大家分享一下java实现socket编程的问题,以及和三步学会javasocket编程的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
请问javasocket里面的bind做什么用
socket.bind(SocketAddressbindpoint)英文:Bindsthesockettoalocaladdress;Iftheaddressisnull,thenthesystemwillpickupanephemeralportandavalidlocaladdresstobindthesocket翻译:将socket绑定到本地地址;如果地址为空,系统会指定一个暂时的端口和合法的本地地址去绑定socket
如何使用Socket在客户端实现长连接
长连接貌似是一个很高深莫测的知识,但是只要你做直播、IM、游戏、弹幕里面的任何一种,或者是你的app想要实时的接收某些消息,你就会要接触到长连接技术。本文主要教你如何在客户端如何使用Socket实现长连接。
Socket背景知识
要做长连接的话,是不能用http协议来做的,因为http协议已经是应用层协议了,并且http协议是无状态的,而我们要做长连接,肯定是需要在应用层封装自己的业务,所以就需要基于TCP协议来做,而基于TCP协议的话,就要用到Socket了。
Socket是java针对tcp层通信封装的一套网络方案
TCP协议我们知道,是基于ip(或者域名)和端口对指定机器进行的点对点访问,他的连接成功有两个条件,就是对方ip可以到达和端口是开放的
Socket能帮完成TCP三次握手,而应用层的头部信息需要自己去解析,也就是说,自己要制定好协议,并且要去解析byte
http也有长连接。在http1.0的时候,使用的是短连接,也就是说,每次请求一次数据,都要重新建立连接。但是从http1.1之后,我们看到头部会有一个
Connection:keep-alive
这个表示tcp连接建立之后不会马上销毁,而是保存一段时间,在这段时间内如果需要请求改网站的其他数据,都是使用这个连接来完成传输的。
Socket使用方式
Socket看上去不是很好用,因为他是基于java.io来实现的,你要直接跟InputStream和OutputStream打交道,也就是直接跟byte[]打交道,所以用起来并不是这么友好。
下面通过一个简单的例子,往一台服务器发\01\00\00\00\00这一串字节,服务器也返回相同的字节流,上代码:
@Test
publicvoidtestSocket()throwsException{
logger.debug("start");
Socketsocket=newSocket();
socket.connect(address);
byte[]output=newbyte[]{(byte)1,(byte)0,(byte)0,(byte)0,(byte)0};
socket.getOutputStream().write(output);
byte[]input=newbyte[64];
intreadByte=socket.getInputStream().read(input);
logger.debug("readByte"+readByte);
for(inti=0;i<readByte;i++){
logger.debug("read["+i+"]:"+input[i]);
}
socket.close();
}
输出:
11:40:40.326[main]DEBUGcom.roy.test.SocketTest-start
11:40:40.345[main]DEBUGcom.roy.test.SocketTest-readByte5
11:40:40.345[main]DEBUGcom.roy.test.SocketTest-read1
11:40:40.345[main]DEBUGcom.roy.test.SocketTest-read0
11:40:40.345[main]DEBUGcom.roy.test.SocketTest-read0
11:40:40.345[main]DEBUGcom.roy.test.SocketTest-read0
11:40:40.345[main]DEBUGcom.roy.test.SocketTest-read0
看出来写起来还是比较麻烦的,主要就是InputStream,OutputStream和byte[]使用起来太不方便了。
SocketChannelblocking
Socket为了优化自己的封装和并发性能,推出了nio包下面的SocketChannel,这个相比于Socket的好处就是并发性能的提高和封装的优化了。
SocketChannel有两种方式——阻塞和非阻塞的,阻塞的用法和Socket差不多,都是在read和write的时候会阻塞线程,下面用一段代码来实现相同的功能。
@Test
publicvoidtestSocketChannelBlock()throwsException{
finalSocketChannelchannel=SocketChannel.open(address);
ByteBufferoutput=ByteBuffer.allocate(5);
output.put((byte)1);
output.putInt(0);
output.flip();
channel.write(output);
logger.debug("writecomplete,startread");
ByteBufferinput=ByteBuffer.allocate(5);
intreadByte=channel.read(input);
logger.debug("readByte"+readByte);
input.flip();
if(readByte==-1){
logger.debug("readByte==-1,return!");
return;
}
for(inti=0;i<readByte;i++){
logger.debug("read["+i+"]:"+input.get());
}
}
log输出:
23:24:34.684[main]DEBUGcom.dz.test.SocketTest-writecomplete,startread
23:24:34.901[main]DEBUGcom.dz.test.SocketTest-readByte5
23:24:34.901[main]DEBUGcom.dz.test.SocketTest-read[0]:1
23:24:34.901[main]DEBUGcom.dz.test.SocketTest-read[1]:0
23:24:34.901[main]DEBUGcom.dz.test.SocketTest-read[2]:0
23:24:34.901[main]DEBUGcom.dz.test.SocketTest-read[3]:0
23:24:34.901[main]DEBUGcom.dz.test.SocketTest-read[4]:0
从上面的。封装优化主要体现在ByteBuffer,IntBuffer这一系列类的封装——因为是网络相关的,所以这里用到的主要是ByteBuffer。
ByteBuffer和byte[]最大的区别,就是ByteBuffer可以很方便的读取int,long等数据类型,他提供了getInt(),getInt(intoffset)这样的方法,这种方法主要用在识别头部数据部分,因为头部数据一般都是由多种数据类型组成,比方说表示数据格式的contentType:String,表示长度的length:int等等,这些就是getInt()这样的方法主要的应用场景,而byte[]如果要取int,String相对来说就要复杂一些了,这是java.nio相比于java.io优势的一点。
这里需要说明一个比较坑的点,就是ByteBuffer.flip()这个方法,这个方法的作用主要是重置索引,在write()之前和read()之后调用,否则会因为索引不对,导致你的数据写不进去,读不出来。
ByteBuffer是一个功能强大的类,因为本文主要是讲Socket和SocketChannel,所以在这里就不做过多描述。具体ByteBuffer的详细介绍,可以参考:JavaNIO系列教程(三)Buffer
而nio相比于io最大的优势还是在于并发性能,因为nio里面的n代表的就是non-blocking的意思,上面那个读取数据的代码也相对老旧,一般我们如果要用SocketChannel,都是用non-blocking的方式来实现的,而如果要用non-blocking模式,首先要介绍的就是Selector。
Selector
我们知道,传统io是阻塞的,也就是说,一个线程只能处理一个io流,也就是一个Socket。有了Selector之后,一个线程就能处理多个SocketChannel。
Selector的原
Java中SocketAddress与InetAddress有什么区别
关键就是InetSocketAddress不基于任何协议,一般用于socket编程中。表面看InetSocketAddress多了一个端口号,端口的作用:一台拥有IP地址的主机可以提供许多服务,比如Web服务、FTP服务、SMTP服务等,这些服务完全可以通过1个IP地址来实现。那么,主机是怎样区分不同的网络服务呢?显然不能只靠IP地址,因为IP地址与网络服务的关系是一对多的关系。实际上是通过“IP地址+端口号”来区分不同的服务的。
socket是什么语言
socket是属于JAVA语言。Java的socket封了一层,一些底层功能可能不是完全可用,不过应付通常的需求倒是足够了,而Python的socket基本就是原生接口,操作系统支持的基本都支持,甚至可以用rawsocket抓底层包。如果只是普通的C/S结构现在很少直接使用socket了,自定协议实现起来很麻烦,新手也处理不好协议设计的问题,比如说消息如何分片、如何匹配、如何解析,如何实现未来协议上的可扩展和多版本兼容等等。一般都是使用通用的协议,最常见的是HTTP,有非常多的好处,一来Web后端极其成熟,二来各种语言的HTTP包使用都很方便,还很容易拓展到B/S结构上使用AJAX实现Web版的应用。对于需要两个方向的推送的可以使用WebSocket。除此以外,JSON-RPC也是非常简单的RPC协议。除了这些通用协议之外,常见的MySQL、Redis等协议也都有相应的软件包可以使用。现在自己调用socket接口,一般都是有特别的需要,或者需要实现一个没有现成的软件包的协议。
java接私活
一个一个问题来解决。兼职我说一下我怎么兼职的,前景我给出我的想法,实战项目我给你资源,你学会了,能好好利用了,项目就是你的了。
一、接私活长期接私活的人过来了,光一项爬虫,做好开发抓一些新闻证券的信息基本上月入就3-5k了。渠道自己可以去淘宝上找,或者兼职app啥的,但要注意别被坑了。另外,既然会java了,建议学个python或者其他的,工作最起码也要会两三种语言吧。
个人总结经验如下:
1.如果你从来没接过私活,那么第一单可以不讲究对象,不讲究项目金额,开张就是胜利,必定会给你不一样的体会;
2.开张后再接单,就应该选择对象,选择项目,这是本着对自己负责任的态度,因为有很多项目几乎是无利可图的;
3.首选人品好有实力的对象,次选资金量高的项目,再次选有前景的方向;
4.接单就必须完成,这是做人的原则问题,无论遇到什么技术难题,反正现在网络资源也非常丰富,技术无难题;
5.能用熟悉技术开发,不选择其他新技术,因为新技术意味着很多未知的问题,这些问题必定拖延开发进度;
6.私活项目开发人多,不一定能加快进度,最好是自己一个人做,最多2-3人开发;
7.在接单之前,一定要有充足的思想准备,因为这是体力活,身体好是前提。
可以做什么:1.爬虫
web开发和爬虫。但是这两项想要赚钱的话,就必须知道开发什么爬什么数据才能赚钱。如果你都不知道的话问题也不大的,可以开个网店,或者做服务外包。这里呢,还是需要找到好的项目,举个舒服的例子就是:帮一些证券大佬抓取一些财经新闻或者是舆情相关的数据,开发玩了之后每个月要保证爬虫不挂的话基本上可以收入3-5k。自己买个云主机的话,一个月要两三百的成本,自己还能做别的事情。2.量化交易
要追求稳定的收益的话,可以去考虑各种虚拟币交易市场搬砖,编程能力较弱的朋友可以考虑一下bots,统计逃离虽然也能稳定盈利但显然不合适个人了,一般需要HFT支持。3.代写程序或者是外包
某宝上有不少的代写程序的,物美价廉,几百块就能搞定一套基于LAMP的xx管理系统,看看买家评论就会知道,绝大部分都是学生的大作业或者是毕设。这些能转多少钱呢?首先是不要帮别人写论文,这是吃力不讨好的事情,基本上后期你就会处于一直改稿的阶段。一般本科毕设都是偏工程研发的,这类门槛低,通用的代码很多,基本上找到开源的改一改就能完成任务。硕士毕业的有很多偏机器学习的,实现一个overfitting的算法实现,基本上也就是1-2天的功夫,前者1-2K,后者2-3k。4.白帽
只要爬虫公里足够强的话,刷个阅读排名点赞都是可以的。毕竟说透了都是模拟请求,只不过是有些简单HTTPGet请求。有些是通过Ajax提交的Post请求,还有就是写Socket请求,然后顺一下时间中不同请求的时间和依赖关系。最主要的就是项目接私活。
最好是朋友或熟人推荐,这样双方都比较放心,项目也好拿一些,一般也不会欠款。如果是陌生人就不好说了,即使签合同也没用。还有就是接项目时,一定要了解对方是否有技术背景。如果有技术背景,一般的项目费用会比较合适,不会太高也不会太低,关键是需求定义会比较清楚,后期维护修改量不大。如果对方没有技术背景,就不好办了,即使能蒙对方要个比较高的价格,后期也会被无休止的需求变更累死的。还有谈项目时一定要看对方的人品,夸夸其谈的人要敬而远之。还有很多就不列举了。
二、前景迷茫,自己不会规划。相信我,大部分人都是迷茫的,你不是特例,在迷茫时期最重要的就是找到你想进步的大的方向,然后不断学习就行。如果实在找不到,那就跟随时代潮流学吧,不然也会被淘汰的。我就拿工作前两年该做的事吧,你可以参照进行看看。
0-1
当你学会了Java的基础知识以后,你还不足以参加工作,你还需要继续深造。你必需要学会Java开发框架。公司里为了提高开发的效率,会使用一些JavaWeb框架。目前比较主流的是SSM框架,即spring、springmvc、mybatis。你需要学会这三个框架的搭建,并用它们做出一个简单的增删改查的Web项目。你可以不理解那些配置都是什么含义,以及为什么要这么做,这些留着后面你去了解。
但你一定要可以快速的利用它们三个搭建出一个Web框架,你可以记录下你第一次搭建的过程,在搭建的过程中,也可以顺便了解一下maven的知识。在你目前这个阶段,你只需要在网络上了解一下maven基本的使用方法即可,一些高端的用法随着你工作经验的增加,会逐渐接触到的。
然后在和一年你要看过别人做项目,知道大概流程,方便以后能够参与进去。
1-2
这部分时间段的同学,已经对Java有了一个更加深入的了解。这一年,你必须对于设计模式了如指掌,此外,设计模式并不是你这一年唯一的任务,你还需要看一些关于代码编写优化的书。总而言之,这个阶段,你的核心任务就是提高你的代码能力,要能写出一手优雅的代码。
另外,你肯定或多或少接触过并发。这个时候,你应该去更加深入的了解并发相关的知识,与此同时,这个阶段你要做的事情还远不止如此。这个时候,你应该对于你所使用的框架应该有了更深入的了解,对于Java的类库也有了更深入的了解。因此,你需要去看一些JDK中的类的源码,也包括你所使用的框架的源码。总而言之,这个阶段,你需要做的是深入了解Java底层和Java类库,也就是JVM和JDK的相关内容。而且还要更深入的去了解你所使用的框架,方式比较推荐看源码或者看官方文档。
同时,在这一时期你可以参与到大项目中担当一个小兵的角色了,没错,工作一到两年才是小兵,提升代码能力同时,也要主动你的逻辑协调能力,别整天就知道敲代码,你要知道他们为什么要你敲这些,实现了有什么用呢。多想想。
第三、实战项目需求这个就在这放不了链接了,关注私聊我回复“java项目实战”我给你下面这些资源吧。
黑马商城(javaEE电商项目)
基于Java的拼图游戏(3天完整)vide
2小时使用MUI快速实现自己的“微信App
新巴巴运动网
医药集中采购系统
宅急送BOS物流项目
淘淘商城
遇到java.net.SocketTimeoutException:Readtimedout怎么办
连接超时,确保网络通畅后重连,若还连不上是他们服务器的问题这样可以么?
关于java实现socket编程到此分享完毕,希望能帮助到您。
本文链接:http://xinin56.com/su/11516.html