JAVA NIO 原理探秘 --- Socket
JAVA NIO 原理探秘 --- Socket
一、ServerSocket 和 Socket
对于Java Socket编程而言,有两个概念,一个是ServerSocket,一个是Socket。服务端和客户端之间通过Socket建立连接,之后它们就可以进行通信了。首先ServerSocket将在服务端监听某个端口,当发现客户端有Socket来试图连接它时,它会accept该Socket的连接请求,同时在服务端建立一个对应的Socket与之进行通信。这样就有两个Socket了,客户端和服务端各一个。
对于Socket之间的通信其实很简单,服务端往Socket的输出流里面写东西,客户端就可以通过Socket的输入流读取对应的内容。Socket与Socket之间是双向连通的,所以客户端也可以往对应的Socket输出流里面写东西,然后服务端对应的Socket的输入流就可以读出对应的内容。下面来看服务端与客户端通信的例子:
服务端代码
package net.qh.test.socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.Charset; /** * Created by Administrator on 2016/03/17. */ public class MySocketServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(1101); while(true){ /** * serverSocket.accept()方法是监听链接的建立: 如果发现有一个Socket尝试连接,ServerSocket会接收这个链接,返回一个socket实例。 * 该方法是会一直阻塞,直到接收到一个连接。 * */ Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); OutputStream outputStream = socket.getOutputStream(); outputStream.write("连接已经建立...".getBytes(Charset.forName("utf-8"))); outputStream.flush(); byte[] bytes = new byte[1024]; inputStream.read(bytes,0,bytes.length); String msg = new String(bytes,"utf-8"); System.out.print("msg:"+msg); } } }
客户端代码
package net.qh.test.socket; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; /** * Created by Administrator on 2016/03/17. */ public class MySocketClient { public static void main(String[] args) throws IOException, InterruptedException { Socket socket = new Socket("127.0.0.1",1101); OutputStream outputStream = socket.getOutputStream(); InputStream inputStream = socket.getInputStream(); /** * inputStream.read()从输入流中读取字节,保存在缓冲区中。 * 该方法将会阻塞,直到读取到数据、读取到文件结尾、发生异常 * */ byte[] bytes = new byte[1024]; String recMsg = ""; inputStream.read(bytes,0,bytes.length); recMsg += new String(bytes,"utf-8"); System.out.println("recMsg:" + recMsg); String msg = "你好 ......"; outputStream.write(msg.getBytes("utf-8")); Thread.sleep(5000); } }