html5中文学习网

您的位置: 首页 > 网络编程 > java教程 » 正文

深入理解Java Socket通信_java_

[ ] 已经帮助:人解决问题

简述avGHTML5中文学习网 - HTML5先行者学习网

Java中Socket分为普通Socket和NioSocket两种,这里介绍Socket。avGHTML5中文学习网 - HTML5先行者学习网

我们可以把Socket比作两个城市间的交通工具,有了它可以在两城之间来回穿梭,交通工具有很多种,每种交通工具也有相应的交通规则。Socket也一样,也有多种。大多情况下使用的是TCP/IP的流套接字,它是一种稳定的通信协议。(TCP/IP与UDP的对比)avGHTML5中文学习网 - HTML5先行者学习网

Java中的网络通信是通过Socket实现的,Socket分为ServerSocket和Socket两大类,ServerSocket用于服务端,通过accept方法监听请求,监听到请求后返回Socket,Socket用于具体完成数据传输,客户端直接使用Socket发起请求并传输数据。avGHTML5中文学习网 - HTML5先行者学习网

ServerSocket的使用可以分为三步:avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

1.创建ServerSocket。ServerSocket的构造方法一共有5个,通常用的是ServerSocket(int port),只需要端口号(port)即可。avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

2.调用创建出来的ServerSocket的accept方法进行监听。accept方法时阻塞方法,也就是说调用accept方法后程序会停下来等待连接请求,在接收到请求之前程序将不会往下走。当接收到请求后accept方法会返回一个Socket。avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

3.使用accept方法返回的Socket与客户端进行通信。avGHTML5中文学习网 - HTML5先行者学习网

栗子avGHTML5中文学习网 - HTML5先行者学习网

Client:avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

package IO;import java.io.*;import java.net.Socket;import java.util.Date;/** * Created by zhengbin06 on 2017/2/2. */public class Client {  public static void main(String[] args) {    String msg = "Client Data";    try {      Socket socket = new Socket("127.0.0.1", 9090);      // 先写、再读      PrintWriter printWriter = new PrintWriter(socket.getOutputStream());      // 发送数据      printWriter.println(msg);      printWriter.flush();      // 获得服务端返回的数据      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));      String line = bufferedReader.readLine();      System.out.println("received from server: " + line + "/ttime=" + new Date().getTime());      // 关闭资源      printWriter.close();      bufferedReader.close();      socket.close();    } catch (IOException e) {      e.printStackTrace();    }  }}

Server:avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

package IO;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.Date;/** * Created by zhengbin06 on 2017/2/2. */public class Server {  private static Socket socket = null;  private static ServerSocket serverSocket = null;  public static void main(String[] args) throws IOException {    BufferedReader bufferedReader = null;    PrintWriter printWriter = null;    try {      // 创建一个ServerSocket监听9090端口      serverSocket = new ServerSocket(9090);      while (true) {        System.out.println("开始等待请求。。。。");        // 等待请求        // 监听并接受到此套接字的连接。此方法在连接传入之前一直阻塞。        socket = serverSocket.accept();        System.out.println("接收到请求:" + socket.toString() + "/ttime=" + new Date().getTime());        // 接收到请求后使用socket进行通信, 创建BufferedReader用于读取数据        bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));        String line = bufferedReader.readLine();        System.out.println("received from client: " + line + "/ttime=" + new Date().getTime());          // 创建PrintWriter, 用于发送数据        printWriter = new PrintWriter(socket.getOutputStream());        printWriter.println("received data: " + line + "/ttime=" + new Date().getTime());        printWriter.flush();      }    } finally {      // 关闭所有资源      bufferedReader.close();      printWriter.close();      socket.close();      serverSocket.close();    }  }}

细节avGHTML5中文学习网 - HTML5先行者学习网

监听请求:avGHTML5中文学习网 - HTML5先行者学习网

当一个新的Socket请求来到时,将为这个连接创建一个新的套接字数据结构,该套接字数据的信息包含的地址和端口正式请求源地址和端口。这个新创建的数据结构将会关联到ServerSocket实例的一个未完成的连接数据结构列表中。注意,这时服务端的与之对应的Socket实例并没有完成创建,而要等到与客户端的3次握手完成后,这个服务端的Socket实例才会返回,并将这个Socket实例对应的数据结构从未完成列表中移动已完成列表中。avGHTML5中文学习网 - HTML5先行者学习网

数据传输:avGHTML5中文学习网 - HTML5先行者学习网

当连接已经建立成功时,服务端和客户端都会拥有一个Socket实例,每个Socket实例都有一个InputStream和OutputStream,并通过这两个对象来交换数据。avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

要知道网络I/O都是以字节流传输的,当创建Socket对象时,操作系统将会为InputStream和OutputStream分别分配一定大小的缓存区,数据的写入和读取都是通过这个缓存区完成的。avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

写入端将数据写到OutputStream对应的SendQ队列中,当队列填满时,数据将被转移到另一端InputStream的RecvQ队列中,如果这时RecvQ已经满了,那么OutputStream的write方法将会阻塞,直到RecvQ队列有足够的空间容纳SendQ发送的数据。过程如下图所示:avGHTML5中文学习网 - HTML5先行者学习网
avGHTML5中文学习网 - HTML5先行者学习网

avGHTML5中文学习网 - HTML5先行者学习网

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。avGHTML5中文学习网 - HTML5先行者学习网

(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助