全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

深入理解Java Socket通信

简述

Java中Socket分为普通Socket和NioSocket两种,这里介绍Socket。

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

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

ServerSocket的使用可以分为三步:

1.创建ServerSocket。ServerSocket的构造方法一共有5个,通常用的是ServerSocket(int port),只需要端口号(port)即可。

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

3.使用accept方法返回的Socket与客户端进行通信。

栗子

Client:

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:

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

细节

监听请求:

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

数据传输:

当连接已经建立成功时,服务端和客户端都会拥有一个Socket实例,每个Socket实例都有一个InputStream和OutputStream,并通过这两个对象来交换数据。

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Java  # Socket  # Socket通信  # java使用Socket类接收和发送数据  # Java基于Socket的文件传输实现方法  # java socket接收保证能读完数据的实例  # 服务端  # 数据结构  # 的是  # 客户端  # 也有  # 将会  # 创建一个  # 都是  # 都有  # 列表中  # 才会  # 两种  # 它是  # 我们可以  # 这两个  # 并将  # 将被  # 要知道  # 它可以  # 只需要 


相关文章: 高配服务器限时抢购:企业级配置与回收服务一站式优惠方案  湖北网站制作公司有哪些,湖北清能集团官网?  网站企业制作流程,用什么语言做企业网站比较好?  如何快速搭建响应式可视化网站?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  h5在线制作网站电脑版下载,h5网页制作软件?  临沂网站制作公司有哪些,临沂第四中学官网?  建站之星官网登录失败?如何快速解决?  建站主机无法访问?如何排查域名与服务器问题  大型企业网站制作流程,做网站需要注册公司吗?  如何撰写建站申请书?关键要点有哪些?  如何在服务器上配置二级域名建站?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  网站制作员失业,怎样查看自己网站的注册者?  如何用低价快速搭建高质量网站?  香港服务器租用费用高吗?如何避免常见误区?  如何高效利用200m空间完成建站?  如何快速查询网站的真实建站时间?  建站VPS能否同时实现高效与安全翻墙?  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  如何在宝塔面板中修改默认建站目录?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何通过.red域名打造高辨识度品牌网站?  如何快速搭建FTP站点实现文件共享?  公司网站制作价格怎么算,公司办个官网需要多少钱?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  如何高效配置香港服务器实现快速建站?  建站之星如何防范黑客攻击与数据泄露?  网站制作壁纸教程视频,电脑壁纸网站?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  如何获取上海专业网站定制建站电话?  深圳网站制作培训,深圳哪些招聘网站比较好?  python的本地网站制作,如何创建本地站点?  代刷网站制作软件,别人代刷火车票靠谱吗?  C#如何使用XPathNavigator高效查询XML  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何通过多用户协作模板快速搭建高效企业网站?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  如何选择CMS系统实现快速建站与SEO优化?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  Bpmn 2.0的XML文件怎么画流程图  C#如何在一个XML文件中查找并替换文本内容  山东网站制作公司有哪些,山东大源集团官网?  如何在Windows环境下新建FTP站点并设置权限?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  建站主机选择指南:服务器配置与SEO优化实战技巧  如何在阿里云虚拟主机上快速搭建个人网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。