# my-socket **Repository Path**: ZhongGang/my-socket ## Basic Information - **Project Name**: my-socket - **Description**: 一步步演示socket编程和socket api的进化 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 0 - **Created**: 2016-06-17 - **Last Updated**: 2021-02-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #在此项目里我将一步一步实验Java Socket网络编程,演示socket api的进化 #在此我将以一个简单的例子来进行演示,客户端向服务端发送字符串,服务端接收到字符串后将其中的字母做大写处理后再回传给客户端 #每进行一步我都将在Git上为此创建一个分支 #I/O总结 ##BIO:任意调用InputStream,OutputStream,Socket的close方法,意味关闭当前Socket的连接 ##BIO:客户端向服务端发送请求,如果当前客户端输出流不关闭,则服务端输入流读取客户端请求将一直处于阻塞状态 ##BIO:使用输出流输出\n换行符,则后续调用的write方法将不会将数据写入输出流 outputStreamWriter.write("I am Alex Zhong"); outputStreamWriter.write("\n"); outputStreamWriter.write("Nice to meet you"); ##BIO:客户端向输出流写入数据,只要输出流还未关闭,服务器在读取客户端请求数据时会一直处于阻塞状态 ##BIO:使用BufferedWriter向输出流写入数据后调用了flush方法,为什么另一端的读取仍然会处于阻塞状态呢? ##BIO:Answer: socket.getOutputStream()返回的实现类是SocketOutputStream,而该类因为没有覆写flush方法,所以会调用顶层的OutputStream的flush方法,而该方法是个空方法 ##BIO:通过调用flush方法来清空输出流缓存的方法来发送数据 ##NIO:Java nio有三个核心概念需要掌握,分别是Channel,Buffer,Selector ##1.0:最基础的Java Socket网络编程代码,该版本代码的缺陷在于一次只能处理一个连接,并且在连接请求还未处理完毕时,是无法接受下一个连接请求的 ##1.1:通过多线程的方式来处理请求,服务端每接收到一个连接请求时,就为这个请求开一个线程来处理它的I/O操作请求 ##1.2:在主线程中调用serverSocket.accept()方法会导致进程阻塞,后续的处理无法执行,所以单独开一个线程来监听来自客户端的连接请求 ##1.3:添加线程池,避免重复创建线程,浪费系统资源 ##2.0:使用Java nio api,SocketChannel,ServerSocketChannel,ByteBuffer等实现网络通信 ##2.1:使用Selector来注册Channel,监听Socket的发起连接,接受连接,读写事件,通过事件驱动的方式来完成网络通信