java socket客户端代码(java客户端和服务端的socket编程)
- 数据库
- 2023-08-25
- 103
很多朋友对于java socket客户端代码和java客户端和服务端的socket编程不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!有两个概念...
很多朋友对于java socket客户端代码和java客户端和服务端的socket编程不太懂,今天就由小编来为大家分享,希望可以帮助到大家,下面一起来看看吧!
有两个概念需要解释一下API和socket,平时说的端口是指api还是socket
API(ApplicationProgrammingInterface,应用编程接口)其实就是操作系统留给应用程序的一个调用接口,应用程序通过调用操作系统的API而使操作系统去执行应用程序的命令(动作)。
WindowsAPI
API函数包含在Windows系统目录下的动态连接库文件中。WindowsAPI是一套用来控制Windows的各个部件的外观和行为的预先定义的Windows函数。用户的每个动作都会引发一个或几个函数的运行以告诉Windows发生了什么。
操作系统的用户接口
这在某种程度上很像Windows的天然代码。而其他的语言只是提供一种能自动而且更容易的访问API的方法。当你点击窗体上的一个按钮时,Windows会发送一个消息给窗体,VB获取这个调用并经过分析后生成一个特定事件。
socket的英文原义是“孔”或“插座”。作为BSDUNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节目。客户软件将插头插到不同编号的插座,就可以得到不同的服务。
WebSocket是什么原理为什么可以实现持久连接
首先需要明白:基于TCP的应用层协议,只要设计者愿意,都是可以实现持久连接的。
你问的方式,大概是在和HTTP做比较。
HTTPhttp协议是请求应答式的文本协议,协议设计就是Client-Server模式,出发点是服务端为客户端提供资源。http服务端只能监听和响应来自客户端的请求,http客户端只能发起请求接受响应,这个是HTTP协议本身的设计,双向通信不在设计的考虑之内。
关于Http协议,额外说点:
HTTP1.0/0.9
不支持keep-alive,要完成一次HTTP请求,需要建立一个新的TCP连接,然后发送http请求,待接收响应后关闭连接。
HTTP1.1
默认使用keep-alive,一次HTTP请求完成后不会关闭TCP连接,会继续为下一个HTTP请求服务(可以类比数据库连接池和线程池的设计),减小建立和关闭TCP连接的开销(三次握手四次挥手)。当然闲置超时后也会关闭。并非楼下所说的“把多个HTTP请求合并为一个”。
HTTP协议的设计无法实现对TCP通道的分用和复用。因为HTTP协议没有请求的唯一标记(仅仅是URL是不行的,原因大家想)用来从同一TCP通道分离不同的HTTP消息,所以一个完整的HTTP请求在发送请求到响应回来之间是独占一个TCP通道的!是不是觉得HTTP对TCP的利用率太低了?而关于pipeline模式,不管在服务端还是客户端排队,HTTP响应依然要通过进入服务端队列的顺序返回,这样才能和客户端HTTP请求队列用顺序做对应!所以pipeline模式某个请求被服务端因为某些原因阻塞了的情况下,后续请求都会阻塞,会引起很大的问题,实际上很少用。
浏览器或者一般HTTP客户端组件为某一个服务器端点(域名+端口)保留4-6条活跃TCP连接。你可以F12观察浏览器,看看同时是几个请求阻塞了就知道你的浏览器设置的多少。比较大的门户网站,比如京东,首页请求非常多,但是大量都需要排队等TCP空闲。限制客户端的连接数量的出发点主要是性能,否则会占用服务器太多Socket资源(考虑socket预留的读写缓冲区,windows的内核对象或者linux的文件句柄)或者变相地造成DoS攻击。
Tips:HTTP客户端组件一般会提供诸如ConnectionLimit的选项让你控制最大TCP连接数。如果你是桌面客户端,或者请求远程服务,不宜设置过大。如果你是内部服务之间调用,可以根据需求合理设置以增加并发性能。
HTTP2.0
针对以上的问题(主要是性能)做了很多改进,这个也会提高很多人在后端不同服务器之间做通信时选择HTTP(我在HTTP2.0出来之前就是自己设计RPC方案)。详细的HTTP2.0的东西,这里不展开了,详细参考官方文档。
HTTP相关知识推荐《HTTP权威指南》以及相关的RFC文档,尽量少去看博客上面支离破碎的小知识,体系化的认知结构对你帮助更大。
WebSocketWebSocket的出现,就是为了解决http协议不支持双向通信的缺口。所以WebSocket的握手协议就是使用的HTTP消息来Upgrade。
现代的Web场景,服务端推送的需求非常大,这个发展过程中使用的Ajax轮询,Comet等都只是临时解决方案,从设计上看,只为满足需求,一点都不优雅。
Html5规范将WebSocket纳入后,得到了现代几乎所有浏览器的支持,当然IE(10+才支持)仍然是一个巨坑,在乎用户覆盖面的产品依然要通过浏览器是否支持ws来做出降级处理(轮询、长连接)。
websocket协议实现独占一条tcp通道,它负责从tcp流确定消息边界,解析出每个独立的消息包。可进行全双工的双向通信。题主所谓的WebSocket可以实现持久连接,只是的一个服务端WebSocket会话和对应的客户端WebSocket会话在使用一个固定的保持连接的TCP通信而已。一般需要将服务端WebSocket会话和某位用户关联起来(客户单连接后,可以再单独发送凭证验证),实现给某个用户推送消息,只需根据关联找到对应的WebSocket会话调用发送API即可。
应用使用单独实现websocket协议的服务\客户端组件,可以更加轻松地实现自定义协议:在websocket的二进制或者文本消息体内或者直接使用websocket的自协议定义机制封装自己定义的协议。
推荐大家如果有些需要自建IM服务器,推送服务器的场合尝试先用WebSocket来实现。负载高(协议头消耗小),协议简洁,几乎所有客户端(减少了大量的工作)都有对应的开源项目可用,同时还是唯一可以在浏览器上用的双向通信协议(flash和silverlight等插件方式除外)。
如果你要用websocket实现请求应答式的子协议,要点是你要设计唯一的请求标志,响应也将请求标志带回来,然后你就可以从客户端的请求队列中查找响应对应的请求将响应交给上层处理!
特别注意:
关于webcket持久连接,本质上是下层tcp连接的保持,核心问题同样是如何保活。需要考虑Nat失效(基站最突出,一般有效期只有3分钟)或者其它网络原因导致大量半连接存在。解决方案就是合理的心跳时间,一般我设置为2分50秒的样子。
其它不论是否从事网络编程,都应该花时间学习下TCP/IP协议簇方面的知识,着重理解分层原理,各层的功能和为上层提供了哪些功能。就像这个问题,如果不对TCP有所了解,回答的内容就没多大意义了。阅读一个你比较熟悉的语言的的一种协议(比如http)实现项目的源码,帮助应该很大。
和网络IO密切相关的就是线程,要设计高可用的TCP服务器,必须要熟悉多线程。网络IO和多线程是我认为最重要的两个核心知识点。
关于协议的设计,你可以多学习其他优秀的基于TCP实现的应用层协议,简单的就有Redis的通信协议,里面有阻塞式的消费者队列,那个就需要一条单独的tcp通道。协议设计是很有意思的一件事情,就是mysql和mongodb的通信协议我也不会放过,去看看,会给自己设计协议带来不少的参考价值。
如果时间允许,有标准的协议最好看看RFC文档,现在Chrome的翻译已经很好了,如果英文不太好,问题也不大。
关于TCP/IP相关的书籍《计算机网络:自顶向下方法》和谢希仁的《计算机网络》都是不错的入门书籍。
《TCP/IP详解》是经典,虽然出版已久,内容是没过时的。
网络应用脱离不了操作系统,所以可以再看看操作系统关于网络IO这一块的设计。
实际开发更多和Socket以及多线程打交道,Windows下面可以看看《Windows核心编程》。
其它的就是开源项目:Nginx,netty等大量优秀的项目都在等你。
还是要感谢大家对我写的东西有那么一点感兴趣,能对大家有所帮助就更好了。
Java官方没有实现Servlet类,那在服务器运行过程中,Servlet类的代码是怎么起作用的
谢邀。
首先问题主一个问题,如果Servlet被实现了,那应该怎么实现?实现什么逻辑?你的业务代码又该写到哪里?
其次对于Servlet的执行,这里不直接给出答案,只从表象来引导思考,由题主自行去找到答案:
Servlet刚出来的时候是需要通过web.xml进行配置的,3.0开始支持基于注解的方式配置。这里需要的知识点有Java读取xml,Java注解(注解的执行原理,不是使用)。无论配置web.xml还是注解,都配置了url。作用是什么?通过url找到Servlet,怎么去执行,也就是题主关心的问题。涉及知识点:Java如何动态的执行一个类?下面给个完整的大致流程(题主看之前最好先自己思考下):
你访问服务地址,浏览器发送HTTP请求服务端接收到请求后,解析HTTP消息,根据web.xml的配置,或注解上面的配置找到URL对应的Servlet通过反射来执行Servlet结果组装为HTTP响应返回浏览器渲染响应,你看到了结果请问Socket、Servlet、Tomcat是如何通信的
socket是java实现tcp/ip协议组的抽象,也就是说在java环境中,你要通过网络传输数据,进行数据交互就不得不使用socket套接字,位于最底层。servlet是j2ee标准用于加速web快发,提供了javaweb开发的高度抽象。tomcat就是对servlet抽象的具体实现,它屏蔽了复杂的网络交互,提供了对http协议的封装,具体的网络交互都由tomcat替程序员做了,程序员只需要按照servlet的标准写一些业务代码就行。那么试着想想,如果没有servlet和tomcat我们需要实现从一个普通的页面中的某一个form表单,点击提交请求到后端某个接口。大概会做那些事?1.对于服务端来说肯定需要创建一个socket,然后绑定ip和port,阻塞等待客户端进行请求。2.页面上是不是也得通过socket进行对服务端的连接?3.连接成功后开始传输数据,是不是得将普通的字符串,文件啥的转化成byte进行传输.....还有很多限制,就不一一列举了。这才仅仅是一个普通的接口,一个普通的form表单,一个项目中成千上万个接口都来这么搞,肯定不行的。所以出现了servlet规范,它列举了关于javaweb开发的一切相关的东西,我们只需要按照它的标准来,继承一个servlet就行,然后重写它的service方法,通过配置在web.xml中就可以直接进行交互。参数,数据都放在request里面,要啥就去里面取...tomcat就是把servlet的所有标准都实现的容器,做类比servlet可以看成一个普通的javainterface,那么tomcat就是它的一个具体的实现类。面向接口编程,是面向的servlet,具体怎么做我们不用关心都交给tomcat就行。说了这么多,水平有限也不知道你能不能理解。仅代表个人观点,如有不严谨的地方,还望大家多多包涵。
tcp连接服务器和客户端的端口
在TCP连接中,客户端和服务器之间的端口是由客户端在发起连接请求前确定的。客户端会随机生成一个16位的端口号,然后用这个端口号去和服务器端进行握手建立连接。
如果您想要知道客户端和服务器之间的端口号,可以在客户端代码中使用以下代码获取:
```java
intlocalPort=serverSocket.getLocalPort();
intremotePort=serverSocket.getRemotePort();
```
关于java socket客户端代码的内容到此结束,希望对大家有所帮助。
本文链接:http://www.xinin56.com/su/10963.html