基于TCP协议的Socket编程

2023-05-16

一、基于TCP协议的网络编程

1、TCP/IP是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路;

  一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路来进行通信;

2、Socket编程主要是指基于TCP/IP协议的网络编程。

Java对基于TCP/IP协议的网络通信提供了良好的封装;

Java使用Socket对象来代表两端(服务器程序和客户端程序)的通信端口;并通过Socket产生的IO流来进行通信。

其中 ServerSocket 类表示 Socket 服务器端,Socket 类表示 Socket 客户端。这两个类中的方法都比较相同。

简单来说,Java的网络编程是使用Socket对象进行的I/O编程。

1、ServerSocket 类

用来实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。

服务器套接字一次可以与一个套接字连接,如果多台客户端同时提出连接请求,请求连接的客户端会被存入一个队列中,然后从中取出一个套接字与服务器新建的套接字连接起来。

若请求连接大于最大容纳数,则多出的连接请求被拒绝;默认的队列大小是 50。

1. ServerSocket 的构造方法

ServerSocket()
          创建非绑定服务器套接字。
ServerSocket(int port)
          创建绑定到特定端口的服务器套接字。backlog (默认队列大小是50)
ServerSocket(int port, int backlog)
          利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
ServerSocket(int port, int backlog, InetAddress bindAddr)
          使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

2. ServerSocket 的常用方法

 Socketaccept()
          侦听并接受到此套接字的连接。
 voidbind(SocketAddress endpoint)
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
 voidbind(SocketAddress endpoint, int backlog)
          将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
 voidclose()
          关闭此套接字。
 ServerSocketChannelgetChannel()
          返回与此套接字关联的唯一 ServerSocketChannel 对象(如果有)。
 InetAddressgetInetAddress()
          返回此服务器套接字的本地地址。
 intgetLocalPort()
          返回此套接字在其上侦听的端口。
 SocketAddressgetLocalSocketAddress()
          返回此套接字绑定的端点的地址,如果尚未绑定则返回 null
 intgetReceiveBufferSize()
          获取此 ServerSocket 的 SO_RCVBUF 选项的值,该值是将用于从此 ServerSocket 接受的套接字的建议缓冲区大小。

调用 accept() 方法会返回一个和客户端 Socket 对象相连接的 Socket 对象。

  • 服务器端的 Socket使用 getOutputStream() 方法获得的输出流,将指向客户端 Socket 使用 getInputStream() 方法获得那个输入流。
  • 同样,服务器端的 Socket使用的 getInputStream() 方法获得的输入流,将指向客户端 Socket 使用的 getOutputStream() 方法获得的那个输出流。
  • 也就是说,当服务器向输出流写入信息时,客户端通过相应的输入流就能读取,反之同样如此。

2、Socket 类

用来实现客户端套接字。用于呼叫远端机器上的一个端口,主动向服务器端发送数据(当连接建立后也能接收数据)。

1. Socket 的构造方法

 Socket()
          通过系统默认类型的 SocketImpl 创建未连接套接字
 Socket(InetAddress address, int port)
          创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
 Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
          创建一个套接字并将其连接到指定远程地址上的指定远程端口。
 Socket(Proxy proxy)
          创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。
 Socket(String host, int port)
          创建一个流套接字并将其连接到指定主机上的指定端口号。
 Socket(String host, int port, InetAddress localAddr, int localPort)
          创建一个套接字并将其连接到指定远程主机上的指定远程端口。

2. Socket 的常用方法

方法摘要
 voidbind(SocketAddress bindpoint)
          将套接字绑定到本地地址。
 voidclose()
          关闭此套接字。
 voidconnect(SocketAddress endpoint)
          将此套接字连接到服务器。
 voidconnect(SocketAddress endpoint, int timeout)
          将此套接字连接到服务器,并指定一个超时值。
 booleanisBound()
          返回套接字的绑定状态。
 booleanisClosed()
          返回套接字的关闭状态。
 booleanisConnected()
          返回套接字的连接状态。
 booleanisInputShutdown()
          返回是否关闭套接字连接的半读状态 (read-half)。
 booleanisOutputShutdown()
          返回是否关闭套接字连接的半写状态 (write-half)。
 voidsetSoLinger(boolean on, int linger)
          启用/禁用具有指定逗留时间(以秒为单位)的 SO_LINGER。
 voidsetSoTimeout(int timeout)
          启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。

SO_TIMEOUT选项

该选项表示accept()方法等待客户端连接的时间,以毫秒为单位。

当accept()方法在超时时间内没有获得连接,就会抛出SocketTImeoutException。

选项必须在进入阻塞操作前被启用才能生效。超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。 

SO_REUSEADDR选项

关闭 TCP 连接时,该连接可能在关闭后的一段时间内保持超时状态。

此时,是否允许新的ServerSocket绑定到与旧的ServerSocket 同样的端口上,在某些操作系统上允许重用端口,有些则不允许。很多服务器程序都是用固定的端口,当程序关闭后,端口可能还被占用一段时间,如果此时立刻重启服务器,服务器就会无法绑定端口,抛出BindException异常。为了确保不发生这种异常,就可以调用ServerSocket的setReuseAddress(boolean on)方法:

if(!serverSocket.getResuseAddress()) 

serverSocket.setReuseAddress(boolean on);

该方法必须在绑定端口前设置。

SO_RCVBUF选项

用于设置内部套接字接收缓冲区的大小和设置公布到远程同位体的 TCP 接收窗口的大小。 

该方法必须在绑定端口前设置。
 

 

基于TCP的套接字编程实现流程

服务器端流程:

  1. 创建服务器套接字(ServerSocket)
  2. 将套接字绑定到一个本地地址和端口上(bind)
  3. 将套接字设定为监听模式,准备接受客户端请求(listen)
  4. 阻塞等待客户端请求到来。当请求到来后,接受连接请求,返回一个新的对应于此客户端连接的套接字socketClient(accept)
  5. 用返回的套接字socketClient和客户端进行通信(IO流操作)
  6. 返回,等待另一个客户端请求(accept)
  7. 关闭套接字(close)

客户端流程:

  1. 创建客户端套接字(Socket)
  2. 向服务器发出连接请求(connect)
  3. 和服务器进行通信(IO流操作)
  4. 关闭套接字(close)

 

/**
 * 服务器端
 */
public class Server {

    public static void main(String[] args) throws IOException {
        // 创建一个ServerSocket,用于监听客户端的连接请求
        ServerSocket serverSocket = new ServerSocket();
        serverSocket.bind(new InetSocketAddress("127.0.0.1", 8000));

        // 使用循环不断地接受来自客户端的连接
        while (true) {
            Socket socket= serverSocket.accept();

            // IO流交互通信
            PrintStream printStream = new PrintStream(socket.getOutputStream(), true, "UTF-8");
            printStream.println("服务器说:" + socket.getInetAddress() + ",来了老弟");

            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
            System.out.println("来自客户端的信息:" + in.readLine());

            // 关闭
            printStream.close();
            in.close();
            socket.close();
        }
        
    }
}

/**
 * 客户端的代码
 */
public class Client {
    public static void main(String[] args) throws IOException {
        // 创建一个Socket,向服务器发出连接请求
        Socket socket = new Socket();
        socket.connect(new InetSocketAddress("127.0.0.1", 8000));

        // IO流交互通信
        BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));
        System.out.println("来自服务器的信息:" + reader.readLine());

        PrintStream ps = new PrintStream(socket.getOutputStream(), true, "UTF-8");
        ps.println("客户端向你问好");

        // 关闭
        reader.close();
        socket.close();
    }
}

 

 

—— Stay Hungry. Stay Foolish. 求知若饥,虚心若愚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于TCP协议的Socket编程 的相关文章

  • 适合程序员的 TCP/IP 网络书籍? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • http.sys 究竟是如何工作的[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试更深入地了解 IIS 的工作原理 我理解 http sys 是它的主要组件之一 然而 我一直很难找到有关它的易于理解的信息
  • 将进程附加到远程 PC 上正在运行的进程

    我正在开发一个 C 应用程序 该应用程序在远程 PC 上运行 我有 VPN 连接并使用 RDP 会话 我可以登录到该计算机 在那台计算机上 在正在运行的进程旁边 还有两个 msvsmon exe 进程 在任务管理器中具有以下 命令行 条目
  • TCP 数据偶尔会以错误的顺序接收且不完整

    我用 Java 创建了 TCP 服务器应用程序 并用 C 创建了客户端应用程序 当我发送数据时 客户端有时会乱序接收数据 有时部分会完全丢失 基本上 我在服务器 java 中使用的代码如下 已删除 ServerSocket welcomeS
  • Spring 集成超时客户端

    我的 Spring 集成场景是 使用自定义协议发送数据的数十个生产者 大小和内容 我必须解码这个自定义协议 然后处理结果 所以我尝试了很多配置 目前最好的配置如下
  • WebSocket 和纯 TCP 之间的根本区别是什么?

    我读过关于WebSockets http en wikipedia org wiki Web Sockets我想知道为什么浏览器不能像任何其他桌面应用程序一样简单地打开简单的 TCP 连接并与服务器通信 为什么可以通过 websocket
  • IPv4 允许的最大 TCP/IP 网络端口号是多少?

    可以使用的最大端口号是多少 端口号是一个无符号 16 位整数 即 65535
  • 如何监控 TCP 连接的 cwnd 和 ssthresh 值? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望在通过套接字连接发送或接收数据包时确定这些值 有没有现有的工具可以做到这一点 The ss http linux die net m
  • 无法通过 ngrok ssh 进入远程 Linux

    远程Linux计算机位于内部网络中 没有公共IP地址 所以我安装了ngrok ngrok tcp 22 ngrok by inconshreveable Ctrl C 退出 在线隧道状态版本2 0 19 2 0 17网页界面http 127
  • Nodejs TCP连接客户端端口分配

    我使用nodejs在客户端和服务器之间创建了tcp连接 网络模块 https nodejs org api net html 服务器正在侦听已经预定义的端口 并且客户端正在连接到该端口 据我了解客户端的端口是由节点动态分配的 那是对的吗 节
  • TCP Socket无连接超时

    我打开一个 TCP 套接字并将其连接到网络上其他位置的另一个套接字 然后我就可以成功发送和接收数据 我有一个计时器 每秒向套接字发送一些内容 然后 我通过强行断开连接 在本例中拔出以太网电缆 来粗暴地中断连接 我的套接字仍然报告它每秒都在成
  • TCP 兼容性:为什么 TCP 不兼容数据包广播和组播操作?

    http en wikipedia org wiki User Datagram Protocol http en wikipedia org wiki User Datagram Protocol 与 TCP 不同 UDP 与数据包广播
  • 查找网络中的所有IP地址

    我正在尝试用 C 来做这个 我需要找到我的网络中所有活动的 IP 地址并将它们显示在列表中 我可以 ping 网络中所有可用的 1 255 IP 地址 但我想让这个过程更快 此代码在大约 1 秒内扫描我的网络 255 个 D 级段 我在 V
  • Socket ReceiveAsync 合并数据包

    我打算通过套接字接收数据包 但由于它们是从发送方以高频率发送的 因此其中许多数据包被打包成一个byte array SocketAsyncEventArgs Buffer然后保存多个数据包 即使它们是单独发送的 使用验证wireshark
  • 由于将请求从主线程传递到工作线程,netty 中出现延迟?

    我有一些关于 Netty 服务器端 TCP IP 应用程序的问题 我想知道在将请求从老板线程传递到工作线程时是否会因为 netty 由于缺少配置等 而出现延迟 我在用 new OrderedMemoryAwareThreadPoolExec
  • 使用 iPhone 作为热点时 TCP 连接无法正常工作

    我正在开发一个 iOS 应用程序 它通过 TCP 套接字连接到在 Android 上运行的服务器应用程序 为了找到第二个设备的 IP 我使用 UDP 请求并接收服务器的 IP 当我将它们连接到 Wi Fi 网络或使用 Android 设备作
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • Web 服务器可以处理多少个套接字连接?

    假设我要获得共享 虚拟或专用托管 我在某处读到服务器 计算机一次只能处理 64 000 个 TCP 连接 这是真的吗 无论带宽如何 任何类型的托管可以处理多少个 我假设 HTTP 通过 TCP 工作 这是否意味着只有 64 000 个用户可
  • 在 Golang Server 中接受持久的 tcp 连接

    我正在尝试使用 Go 并且想创建一个 TCP 服务器 我可以通过 telnet 访问该服务器 发送命令并接收响应 const CONN HOST localhost CONN PORT 3333 CONN TYPE tcp func mai
  • 两个http请求可以合并在一起吗?如果可以的话,nodeJS服务器如何处理呢?

    昨天我做了一些关于 NodeJS 的演讲 有人问我以下问题 我们知道nodeJS是一个单线程服务器 多个请求是 到达服务器并将所有请求推送到事件循环 如果什么 两个请求同时到达服务器 服务器将如何处理 处理这种情况 我猜到了一个想法并回复如

随机推荐

  • “天才少年” 27岁华为副总裁 百度CTO 成为阶下囚的传奇经历

    今天的主角是李一男 xff0c 也许你未曾听过他的名字 xff0c 但他却有金光闪闪的履历 毕业于华中科大少年班 xff0c 最年轻的华为副总裁 xff0c 百度CTO xff0c 12580CEO xff0c 金沙江创投合伙人 xff0c
  • 计算机网络---TCP的可靠传输机制和面向字节流传输

    在了解了TCP的面向连接传输之后我们讲解TCP的可靠传输相关的机制和面向字节流传输 一 xff0c TCP的可靠传输 可靠应答机制超时重传机制报文中的序号和确认序号 可靠应答机制 就是在每次发送数据或者请求之后对方都要回复一个应答信号 xf
  • Linux内核必读五本书籍(强烈推荐)

    深入理解Linux内核 推荐等级 xff1a 5颗星 为了透彻理解Linux的工作机理 xff0c 以及为何它在各种系统上能顺畅运行 xff0c 你需要深入到内核的心脏 cPu与外部世界的所有交互活动都是由内核处理的 xff0c 哪些程序会
  • YOLO系列标注文件txt标签类别索引批量修改脚本

    在我们做YOLO类检测网络的自定义训练时 xff0c 有时会将多个独立的数据集合并训练 xff0c 但往往遇到一个问题 xff0c 比如两个独立的数据集中有相同的一类 xff0c 比如船 但是在一个数据集中船的标注文件 txt文件 的索引为
  • realsense系列(二):录制深度图和RGB图

    录制深度图和RGB图 本次任务使用方法总结 本次任务 利用realsenseviewer软件录制深度图和RGB图 使用方法 1 将realsense连接到计算机上 xff0c 然后打开realsenseviewer软件 xff0c 打开后默
  • realsense系列(三):播放深度图和RGB图

    播放深度图和RGB图 本次任务使用方法总结 本次任务 利用realsenseviewer软件播放深度图和RGB图 使用方法 1 将realsense连接上计算机 然后打开realsenseviewer软件 点击Add Source Load
  • 海思3559万能平台搭建:OSD实时叠加的支持2区域RGN的配置

    前言 位图的生成只是我们字符叠加的基础 xff0c 具体表现就要靠对区域RGN的配置了 调试记录 现在距离移植成功osd也有一段时间了 xff0c 所有所有的报错一时也想不起来太多 xff0c 当时是在焦头烂额没有记录下全部 xff0c 但
  • 在ubuntu中使用命令行下载谷歌浏览器(Linux)

    使用命令行安装谷歌 1 sudo wget http www linuxidc com files repo google chrome list P etc apt sources list d 2 wget q O https dl g
  • TJA1043 CanTrcv

    目录 一 概述 二 功能和优势 2 1 基本功能 2 2 低功耗管理 2 3 保护和诊断 xff08 检测和信号传输 xff09 三 引脚信息 四 功能描述 4 1 五种工作模式 4 1 1 正常模式 4 1 2 仅监听模式 4 1 3 待
  • Git/Gitlab添加SSH秘钥与小乌龟配置

    目录 一 Git Gitlab添加SSH秘钥 二 秘钥添加情况验证 三 小乌龟关联SSH 一 Git Gitlab添加SSH秘钥 xff08 1 xff09 查找是生成sSh秘钥 xff0c 显示文件夹不存在 xff0c 可以生成秘钥 指令
  • 系统分析师之信息化技术(十一)

    目录 一 企业信息化概述 1 1 信息系统的基本概念 1 1 1 什么是信息 1 1 2 什么是信息化 1 1 3 信息系统分类 二 企业信息化规划 2 1 信息化战略体系 2 2 企业战略与信息化战略集成方法 三 信息系统开发方法 3 1
  • 【AUTOSAR】【信息安全】SecOC

    目录 一 概述 二 约束和假设 三 依赖模块 四 功能描述 4 1 安全解决方案的规范 4 1 1 安全解决方案的基本实体 4 1 2 安全的I PDU构建 4 1 3 安全的I PDU验证 4 2 与PduR的关系 4 3 初始化 4 4
  • 计算机网络---网络层

    网络层的作用 IP地址 地址管理 路由选择 1 网络层的作用 首先网络层是为了地址管理和路由选择 xff0c 通过对地址的管理能够保证数据从一台主机上到另一台主机上 xff0c 并且选择合适的路径进行传输 主机 就是PC xff0c 也就是
  • 【AUTOSAR】【通信安全】CRC

    目录 一 概述 二 功能说明 2 1 通用行为 2 2 8位CRC计算 2 2 1 8位SAE J1850 CRC计算 2 2 2 8位0x2F多项式CRC计算 2 3 16位CRC计算 2 3 1 16位CCITT FALSE CRC16
  • 系统分析师之项目管理(十七)

    一 范围管理 范围管理 xff1a 确定项目的边界 xff0c 即哪些工作是项目应该做的 xff0c 哪些工作不应该包括在项目中 二 时间管理 时间管理 xff1a 也叫进度管理 xff0c 就是用科学的方法 xff0c 确定目标进度 xf
  • 【AUTOSA】

    目录 一 概述 二 限制与约束 三 功能描述 3 1 网络通信模式请求的转换 3 2 当前网络通信方式的输出 3 3 外围设备的控制 3 3 1 以太网接口控制器 3 4 多网络 3 5 网络模式状态机 3 5 1 初始化 3 5 2 在亚
  • 【AUTOSAR】【以太网】TCPIP

    目录 一 概述 二 约束和假设 三 依赖模块 3 1 EthIf 3 2 EthSM 3 3 SoAd 3 4 KeyM 3 5 CSM 四 功能说明 4 1 系统扩展性 4 2 IPv4 4 2 1 IPv4 4 2 2 ARP 4 2
  • CMake 链接时出现undefined reference to 错误

    一 问题背景 之前新建了一个项目项目文件分布为 1 src MROR cpp 2 include MROR h 3 main cpp 执行cmake出现undefined reference toxx xff0c 显示main函数中的类成员
  • Ubuntu系统下使用VScode进行CMake编译调试C++程序

    一 前提须知 必须确保你的cmake文件能够编译通过 xff0c 并可以通过make生成可执行文件 二 具体步骤 1 设置CMakeLists txt set CMAKE BUILD TYPE DEBUG 2 VScode调试 VScode
  • 基于TCP协议的Socket编程

    一 基于TCP协议的网络编程 1 TCP IP是一种可靠的网络协议 xff0c 它在通信的两端各建立一个Socket xff0c 从而在通信的两端之间形成网络虚拟链路 xff1b 一旦建立了虚拟的网络链路 xff0c 两端的程序就可以通过虚