0

0

深入理解Java Socket通信的分析

黄舟

黄舟

发布时间:2017-03-07 10:21:12

|

2022人浏览过

|

来源于php中文网

原创

本篇文章主要介绍了深入理解java socket,java中的网络通信是通过socket实现的,socket分为serversocket和socket两大类,有兴趣的可以了解一下

简述

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

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

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

立即学习Java免费学习笔记(深入)”;

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

中解商务通
中解商务通

实时捕捉 一旦访问者打开您的网站,系统会立即显示,这时您就可以查看用户的信息,如:来自搜索引擎关键词、友情链接或直接访问;访问者的IP地址,所在地区,正在访问哪个网页;以及访问者使用的操作系统、浏览器、显示器屏幕分辨率颜色深度等。 主动出击 变被动为主动,可以主动邀请访问者进行洽谈勾通,帮助客户深入了解您的企业和产品,同时获得对方的采购意向、联系方式等信息。 互动交流 主动销售和在线客服合二为一,

下载

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通信的分析的内容,更多相关内容请关注PHP中文网(www.php.cn)!

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.1万人学习

C# 教程
C# 教程

共94课时 | 8.1万人学习

Java 教程
Java 教程

共578课时 | 54.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号