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);
}
}