以前一直不太重视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的基本知识整理到这里,下一个博客将着重整理下长连接以及短连接的问题!

												

java 的底层通信--Socket的更多相关文章

  1. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  2. Java和C#的socket通信相关(转)

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  3. java和C#之间SOCKET通信的问题

    转自:http://www.cdtarena.com/javapx/201307/9170.html java和C#之间SOCKET通信的问题 一.服务器端(使用java编写) /** * 监听客户端 ...

  4. Dubbo底层采用Socket进行通信详解

    由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下. n  通信理论 计算机与外界的信息交换称为通信.基本的通信方法有并行通信和串行通信两种. 1 ...

  5. Java进阶(四十七)Socket通信

    Java进阶(四十七)Socket通信   今天讲解一个 Hello Word 级别的 Java Socket 通信的例子.具体通讯过程如下: 先启动Server端,进入一个死循环以便一直监听某端口是 ...

  6. Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制

    Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制 JAVA 中原生的 socket 通信机制 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.co ...

  7. Java 下 SSL 通信原理及实例

    有关SSL的原理和介绍在网上已经有不少,对于Java下使用keytool生成证书,配置SSL通信的教程也非常多.但如果我们不能够亲自动手做一个SSL Sever和SSL Client,可能就永远也不能 ...

  8. Scala进阶之路-Spark底层通信小案例

    Scala进阶之路-Spark底层通信小案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Spark Master和worker通信过程简介 1>.Worker会向ma ...

  9. ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用!因此,ES transport client可以同步调用也可以异步(不过底层的socket必然是异步实现)

    ES transport client底层是netty实现,netty本质上是异步方式,但是netty自身可以使用sync或者await(future超时机制)来实现类似同步调用! 因此,ES tra ...

随机推荐

  1. 如何使用OpenGL中的扩展

    如果你在Windows平台下开发OpenGL程序,那么系统中自带的OpenGL库就是1.1的,如果想使用1.2或者更高版本的OpenGL库,那么只能使用OpenGL扩展,在网上关于如何使用OpenGL ...

  2. Mysql内置功能《四》存储过程

    存储过程 一 存储过程介绍 存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql 使用存储过程的优点: #1. 用于替代程序写的SQL语句,实 ...

  3. Mysql内置功能《三》视图

    一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...

  4. jxl读取excel

    String path=""; String path2=""; File file = new File(path); File file2 = new Fi ...

  5. CH2401 送礼物(双向dfs)

    CH2401 送礼物 描述 作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了.某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_- ...

  6. How to stop UITableView from clipping UITableViewCell contents in iOS 7

    It looks like the view hierarchy changed slightly in ios7 for table view cells. You can try setting ...

  7. 基础篇:3.2)规范化:3d零件建模

    本章目的:规范化零件建模,这是机械的基本功夫. 1.建模的总体原则和总体要求 1.1 建模总体原则 a)零件模型应能准确表达零件的设计信息:b)零件模型包含零件的几何要素.约束要素和工程要素:c)零件 ...

  8. vue中npm run dev 不能自动打开浏览器运行项目

    最近用vue2.0 + webpack搭建了环境创建新的项目.出现一个很蹩脚的问题: 在终端输入 npm run dev 的时候,不能自动打开浏览器运行项目. 这段话的意思是:你的应用程序运行地址是: ...

  9. .net core 的优点

    [1]为什么使用.net core 首先.net core 是一个跨平台的高性能开源框架用具生成基于云连接的Internet的新的应用程序,可以建造web应用程序和服务,lot应用和移动后端,可以在W ...

  10. 网络编程- 解决黏包现象方案二之struct模块(七)

    上面利用struct模块与方案一比较,减少一次发送和接收请求,因为方案一无法知道client端发送内容的长度到底有多长需要和接收OK.多一次请求防止黏包,减少网络延迟