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

    }


}

  

原文地址:https://www.cnblogs.com/aDiot/p/5288199.html