深入理解Java Socket通信
发布时间 - 2026-01-10 22:58:33 点击率:次简述

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接收保证能读完数据的实例
# 服务端
# 数据结构
# 的是
# 客户端
# 也有
# 将会
# 创建一个
# 都是
# 都有
# 列表中
# 才会
# 两种
# 它是
# 我们可以
# 这两个
# 并将
# 将被
# 要知道
# 它可以
# 只需要
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
lovemo网页版地址 lovemo官网手机登录
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Python面向对象测试方法_mock解析【教程】
制作旅游网站html,怎样注册旅游网站?
如何在橙子建站上传落地页?操作指南详解
phpredis提高消息队列的实时性方法(推荐)
nginx修改上传文件大小限制的方法
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
微信小程序 canvas开发实例及注意事项
js实现点击每个li节点,都弹出其文本值及修改
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
如何快速搭建虚拟主机网站?新手必看指南
Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
QQ浏览器网页版登录入口 个人中心在线进入
Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】
简历在线制作网站免费版,如何创建个人简历?
PythonWeb开发入门教程_Flask快速构建Web应用
如何在云虚拟主机上快速搭建个人网站?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel如何实现模型的全局作用域?(Global Scope示例)
个人摄影网站制作流程,摄影爱好者都去什么网站?
如何为不同团队 ID 动态生成多个独立按钮
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel怎么在Blade中安全地输出原始HTML内容
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
网页设计与网站制作内容,怎样注册网站?
如何在IIS中新建站点并解决端口绑定冲突?
Laravel怎么导出Excel文件_Laravel Excel插件使用教程
Laravel如何发送系统通知?(Notification渠道示例)
如何用搬瓦工VPS快速搭建个人网站?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
node.js报错:Cannot find module 'ejs'的解决办法
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
如何快速上传建站程序避免常见错误?
Laravel如何集成Inertia.js与Vue/React?(安装配置)
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
JavaScript如何实现继承_有哪些常用方法
如何在腾讯云服务器快速搭建个人网站?
Laravel如何使用Collections进行数据处理?(实用方法示例)
海南网站制作公司有哪些,海口网是哪家的?
Laravel如何实现多对多模型关联?(Eloquent教程)
如何在七牛云存储上搭建网站并设置自定义域名?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
如何快速查询网址的建站时间与历史轨迹?

