当前位置: 首页 > news >正文

java 的底层通信--Socket

以前一直不太重视java 基础的整理,感觉在实际开发中好像java 基础用处不大,感觉不理解一些底层的东西对开发工作影响也不大。不过,后来我发现,很多东西都是相互联系的,如果底层的东西你不理解,后面的很多与之有联系的工具、框架等用起来会糊里糊涂的,出错之后也不能高效地准确定位,所以,接下来打算好好整理下java SE部分的基础知识,今天首先整理下Socket通讯方面的基础知识。

 

一、Socket是什么

  1、客户与服务器

  在接触Socket之前,请先看下面的丑图:

  一般来说,现在很多应用都是这样的服务方式:客户端安装在客户的终端那里,而核心业务服务则是在服务器完成,这两者之间的连接依靠网络完成,而抽象出来就是依靠对应的流机制来完成。

  但是,在java中,一般不会直接操作网络流来进行通讯,一般通过一个叫做嵌套字的东西进行通讯(可以理解为一部电话),这个类就是Socket,通过操作Socket进行网络通讯,这其实便是用java实现的web容器的底层原理。

 

  2、Socket:个人理解就是一个可以操作网络流的类。

  3、ServerSocket:对应服务端的服务器,不过服务器内部也是通过ServerSocket生成对应某个客户的Socket,然后相互操作流进行必要的通信的。

 

二、Socket的使用方法

  1、构造方法的用法(对应连接服务器),看以下简单例子

//Socket创建方法一
	public Socket setSocket() throws UnknownHostException, IOException{
		String ip = "127.0.0.1";
		int port = 8080;
		Socket socket = new Socket(ip, port);//这里会阻塞
		return socket;
	}

  显然,访问一个服务器必须知道它的ip以及端口号,这个就体现在Socket的构造函数上面了。不过这种构造方法是不推荐的,原因是:

new Socket(ip, port)这个构造方法会一直阻塞的,如果网络不好没有响应,则会空等待。所以一般推荐以下的这个方法进行Socket的构造:
public Socket setSocket() throws IOException{
		socket = new Socket();
		//设置最长等待时间
		socket.setSoTimeout(timeout);
		//进行连接请求
		socket.connect(new InetSocketAddress(ip, port));
		return socket;
	}

  这里有个设置等待时间,这样,如果网络不好就可以即时响应用户避免过长时间的等待。

 

  2、利用socket进行操作输入输出流

  Socket类封装了java对网络流的操作,所以使用起来比较简单,直接使用相应的方法获取对应的流操作即可,请看代码:

//Socket获取网络输入以及输出流
	//获取输输入
	public InputStream getInputStream(Socket socket) throws IOException{
		return socket.getInputStream();
	}
	//获取输出流
	public OutputStream getOutputStream(Socket socket) throws IOException{
		return socket.getOutputStream();
	}

  然后,获取流之后,所有通讯通过流进行就行啦,是不是炒鸡简单!

 

三、ServerSocket的使用方法

  1、核心方法:SocketServer.accept(),具体用法请先看代码例子:

//服务端监听方法
	public void listener() throws IOException{
		Socket socket = null;
		int i = 0;
		while(true){
			i++;
			socket = server.accept();//这也是个阻塞的方法来的
			System.out.println("有" + i + "个用户连接了服务器");
			new Thread(new ServerDoThread(socket)).start();
		}
	}

  accept也是个阻塞的方法来的,它不停地监听着对应端口有没有请求进来,如果有,则进行相应操作。一般来说,如果服务器是多用户的话,有用户请求进来便会调用线程进行处理(这里是直接新建一个线程)

  2、ServerSocket与客户端具体的通讯流程:

  请先看丑图

 

  显然,服务端进行通讯的话,同样需要获取Socket,然后重复二中的步骤进行响应。

  所以,是不是很简单呢!所以,其实web服务器的基本工作流程和Socket 以及ServerSocket的工作流程差不多,只是多了复杂的处理内部并发问题的优化代码罢了,所以,学了Sokcet 以及ServerSocket,你就可以勇敢的说:我也可以写个Tomcat啦!

Ok,Socket 和ServerSocket的基本知识整理到这里,下一个博客将着重整理下长连接以及短连接的问题!

 

 
 

 

转载于:https://www.cnblogs.com/lcplcpjava/p/6580955.html

相关文章:

  • java.util.concurrent.CountDownLatch用方法
  • PSI分析
  • Hibernate JPA中@Transient、@JsonIgnoreProperties、@JsonIgnore、@JsonFormat、@JsonSerialize等注解解释...
  • maven的基本原理和使用
  • cocos2d-x -Lua 字符串
  • [系统资源攻略]IO第一篇-磁盘IO,内核IO概念
  • 深入理解CSS中的margin
  • 有哪些話让你看了一遍就再也没有忘记?
  • 搭建nlp_server服务器
  • 修身
  • android classloader双亲委托模式
  • 手机号中间四位加星号
  • UISearchBar使用及修改样式
  • 关于api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
  • Android 高德地图入门详解
  • @angular/forms 源码解析之双向绑定
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 2019.2.20 c++ 知识梳理
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • es6(二):字符串的扩展
  • go append函数以及写入
  • JavaScript函数式编程(一)
  • java小心机(3)| 浅析finalize()
  • js对象的深浅拷贝
  • JS学习笔记——闭包
  • k8s如何管理Pod
  • leetcode-27. Remove Element
  • leetcode讲解--894. All Possible Full Binary Trees
  • Linux快速复制或删除大量小文件
  • magento 货币换算
  • Map集合、散列表、红黑树介绍
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Python_网络编程
  • Python利用正则抓取网页内容保存到本地
  • Redis 中的布隆过滤器
  • 测试开发系类之接口自动化测试
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 好的网址,关于.net 4.0 ,vs 2010
  • 基于 Babel 的 npm 包最小化设置
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序 setData 学问多
  • 阿里云服务器如何修改远程端口?
  • 移动端高清、多屏适配方案
  • #14vue3生成表单并跳转到外部地址的方式
  • $$$$GB2312-80区位编码表$$$$
  • (06)Hive——正则表达式
  • (Ruby)Ubuntu12.04安装Rails环境
  • (WSI分类)WSI分类文献小综述 2024
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (全注解开发)学习Spring-MVC的第三天
  • (五)MySQL的备份及恢复