首页 > 编程语言 >一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例

时间:2023-05-06 10:32:45浏览次数:55  
标签:Socket 编程 网络 public 接字 连接 服务端 客户端


文章目录

  • 1 Socket讲解
  • 2 基于Socket的TCP编程
  • 3 客户端Socket的工作过程包含以下四个基本的步骤
  • 3.1 客户端创建Socket对象
  • 4 服务器程序的工作过程包含以下四个基本的步骤:
  • 4.1 服务器建立`ServerSocket`对象
  • 5 案例实现 客户端和服务端通信
  • 5.1 代码实现
  • 5.2 实现结果
  • 6 更多案例分析
  • 6.1 客户端发送信息给服务端,服务端将数据显示在控制台上
  • 6.2 客户端发送文件给服务端,服务端将文件保存在本地
  • 6.3 从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端

1 Socket讲解

  • 利用套接字(Socket)开发网络应用程序早已被广泛的采用,以至于成为事实

上的标准。

  • 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标

识符套接字。

  • 通信的两端都要有Socket,是两台机器间通信的端点。
  • 网络通信其实就是Socket间的通信。
  • Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输。
  • 一般主动发起通信的应用程序属客户端,等待通信请求的为服务端。
  • Socket分类:
  • 1、流套接字(stream socket):使用TCP提供可依赖的字节流服务。
  • 2、 数据报套接字(datagram socket):使用UDP提供“尽力而为”的数据报服务

Socket类的常用构造器:

  • public Socket(InetAddress address,int port) :创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
  • public Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口号。

Socket类的常用方法:

  • public InputStream getInputStream():返回此套接字的输入流。可以用于接收网络消息
  • public OutputStream getOutputStream()返回此套接字的输出流。可以用于发送网络消息
  • public InetAddress getInetAddress():此套接字连接到的远程 IP 地址;如果套接字是未连接的,则返回 null。
  • public InetAddress getLocalAddress():获取套接字绑定的本地地址。 即本端的IP地址
  • public int getPort():此套接字连接到的远程端口号;如果尚未连接套接字,则返回 0。
  • public int getLocalPort():返回此套接字绑定到的本地端口。 如果尚未绑定套接字,则返回 -1。即本端的

端口号。

  • public void close():关闭此套接字。套接字被关闭后,便不可在以后的网络连接中使用(即无法重新连接

或重新绑定)。需要创建新的套接字对象。 关闭此套接字也将会关闭该套接字的 InputStream

OutputStream

  • public void shutdownInput():如果在套接字上调用 shutdownInput() 后从套接字输入流读取内容,则流将

返回 EOF(文件结束符)。 即不能在从此套接字的输入流中接收任何数据。

  • public void shutdownOutput()禁用此套接字的输出流。对于 TCP 套接字,任何以前写入的数据都将被发

送,并且后跟 TCP 的正常连接终止序列。 如果在套接字上调用 shutdownOutput() 后写入套接字输出流,

则该流将抛出 IOException。 即不能通过此套接字的输出流发送任何数据。

2 基于Socket的TCP编程

Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示:

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例_客户端

3 客户端Socket的工作过程包含以下四个基本的步骤

  • 创建 Socket:根据指定服务端的 IP 地址或端口号构造 Socket 类对象。若服务器端响应,则建立客户端到服务器的通信线路。若连接失败,会出现异常。
  • 打开连接到 Socket的输入/出流: 使用 getInputStream()方法获得输入流,使用

getOutputStream()方法获得输出流,进行数据传输

  • 按照一定的协议对Socket进行读写操作:通过输入流读取服务器放入线路的信息

(但不能读取自己放入线路的信息),通过输出流将信息写入线程。

  • 关闭Socket:断开客户端到服务器的连接,释放线路

3.1 客户端创建Socket对象

  • 客户端程序可以使用Socket类创建对象,创建的同时会自动向服务器方发起连接。Socket的构造器是:
  • Socket(String host,int port)throws UnknownHostException,IOException:向服务器(域名是host端口号为port)发起TCP连接,若成功,则创建Socket对象,否则抛出异常。
  • Socket(InetAddress address,int port)throws IOException:根据InetAddress对象所表示的
    IP地址以及端口号port发起连接
  • 客户端建立socketAtClient对象的过程就是向服务器发出套接字连接请求

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例_网络_02

4 服务器程序的工作过程包含以下四个基本的步骤:

  • 调用ServerSocket(int port):创建一个服务器端套接字,并绑定到指定端口上。用于监听客户端的请求。
  • 调用 accept():监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字对象。
  • 调用 该Socket类对象的 getOutputStream()getInputStream ()获取输出流和输入流,开始网络数据的发送和接收。
  • 关闭ServerSocketSocket对象:客户端访问结束,关闭通信套接字

4.1 服务器建立ServerSocket对象

  • ServerSocket 对象负责等待客户端请求建立套接字连接,类似邮局某个窗口
    中的业务员。也就是说,服务器必须事先建立一个等待客户请求建立套接字
    连接的ServerSocket对象。
  • 所谓“接收”客户的套接字请求,就是accept()方法会返回一个 Socket 对象

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例_客户端_03

5 案例实现 客户端和服务端通信

基本思路:

  • 客户端和服务端建立连接
  • 发送接收数据进行通信
  • 关闭连接

具体实现的过程:(提示:需要客户端先发送数据给服务端,服务端在接收数据后,发送数据给客户端,然后客户端接收数据。如果客户端先接收数据后发送数据,会阻塞)

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例_网络_04

5.1 代码实现

import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author zyz
 * @version 1.0
 * @data 2023/2/18 12:39
 * @Description:
 */
public class TCPTest4 {

    @Test
    public void Myclient() throws IOException {
        //1、准备Scoket,连接服务器,需要指定服务器的IP地址和端口号
        Socket socket = new Socket("127.0.0.1", 8888);

        //3、获取输出流,用来发送数据给服务器
        OutputStream outputStream = socket.getOutputStream();

        //2、获取输入流,用来接收服务器发给客户端的数据
        InputStream inputStream = socket.getInputStream();

        //4、通信

        //发送数据
        outputStream.write("你好,我是客户端发来的数据".getBytes());
        outputStream.flush();
        socket.shutdownOutput();
        //会在流末写一个“流的末尾”标记,对方才能读到-1,否则对方的读取方法会一直阻塞

        //4、接收
        byte[] data = new byte[1024];
        int len;
        while ((len = inputStream.read(data)) != -1) {
            System.out.println(new String(data, 0, len));
        }

        //5、关闭socket,不再与服务器通信,即断开与服务器的连接
        //socker关闭,意味着InputStream和OutputStrem也关闭了
        socket.close();

    }

    @Test
    public void MyServer() throws IOException {
        //1、准备一个ServerSocker
        ServerSocket serverSocket = new ServerSocket(8888);

        //2、监听一个客户端的连接。accept()是一个阻塞的方法,如果没有客户端连接,将一直等待
        Socket socket = serverSocket.accept();
        System.out.println("一个客户端连接成功");

        //3、获取输出流,用来发送数据给客户端
        OutputStream outputStream = socket.getOutputStream();

        //获取输入流,用来接收客户端发送给服务器的数据
        InputStream inputStream = socket.getInputStream();

        //4、通信

        //接收数据
        byte[] data = new byte[1024];
        int len;
        while ((len=inputStream.read(data))!=-1){
            System.out.println(new String(data,0,len));
        }

        //发送数据
        outputStream.write("我是服务端发来的信息".getBytes());
        outputStream.flush();
        socket.shutdownOutput();

        //socker关闭,意味着InputStream和OutputStrem也关闭了
        socket.close();

        //6、如果不在接收任何客户端通信,可以关闭ServerSocker
        serverSocket.close();
    }
}

5.2 实现结果

一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例_客户端_05


一文讲明TCP网络编程、Socket套接字的讲解使用、网络编程案例_套接字_06

6 更多案例分析

6.1 客户端发送信息给服务端,服务端将数据显示在控制台上

代码位置:代码仓库链接

6.2 客户端发送文件给服务端,服务端将文件保存在本地

代码位置:代码仓库链接

6.3 从客户端发送文件给服务端,服务端保存到本地。并返回“发送成功”给客户端

代码位置:代码仓库链接


标签:Socket,编程,网络,public,接字,连接,服务端,客户端
From: https://blog.51cto.com/u_15740728/6249117

相关文章

  • Unix教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介UNIX/Linux操作系统(OS)入门教程-从基本概念开始,简单易学地了解UNIX的基础知识,包括入门,UnixKorn和BourneShell和编程,文件权限/访问模式,环境,实用程序,管道和过滤器,网络通信实用程序,文件系统,目录,内存管理,特殊变量,vi编辑器,什么是Shell?,使用Shell变量,数组,基本运算符,决策,循......
  • WireShark抓包工具抓取查看指定的软件进程网络包的方法
    一、查询应用的端口 1、打开【任务管理器】,点击【查看】—>【选择列】,选中【PID(进程标识符)】2、记录想要查询端口号的PID,比如:打开【运行】—>输入【cmd】,打开【命令处理器】 输入【netstat-ano|findstr6600】52330和52331即为IExplorer的端口号; 二、wiresh......
  • 不同的编程语言中使用管道pipe(或者说链式调用)
    目录终端语言(如bash,zsh)一般有管道符|pythonjavascriptrubymathematicac#c++scala3终端语言(如bash,zsh)一般有管道符|#将`echo`命令的输出传递给`grep`命令echo"Hello,World!"|grep"World"#将`ls`命令的输出传递给`wc`命令,以统计文件和目录的数量ls|wc......
  • 1.李沐课程-零基础多图详解图神经网络
    一前言图是一个序列图越深,上层的节点链接的下次节点越多二什么是图1图是表现一些实体之间的关系实体:点  关系:边核心:如何把想要的信息表示为图中的向量,并可以通过数据得到2三大类问题(1)图层面的任务:整个图的识别(2)顶点层面的任务:点的属性判断(3)边级别上的任务:边的属性......
  • Python asyncore socket客户端开发基本使用
    导读asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服务器的基础结构,这篇文章主要介绍了Pythonasyncoresocket客户端开发基本使用,需要的朋友可以参考下介绍asyncore库是python的一个标准库,提供了以异步的方式写入套接字服务的客户端和服......
  • Go笔记(十五):并发编程
    一、协程的创建Go语言支持并发,只需要通过go关键字来开启goroutine(协程)即可。goroutine(协程)是轻量级线程,goroutine(协程)的调度是由Golang运行时进行管理的。goroutine语法格式(创建协程):go函数名(参数列表)示例代码如下:1packagemain2imp......
  • 基于虚拟力算法的WSN无线传感器网络覆盖优化matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:   2.算法涉及理论知识概要       无线传感器网络(WirelessSensorNetworks,WSNs)是一种分布式传感网络,嵌入了传感器的智能设备感测、通信、处理、收集数据,然后通过互联网将数据传输给监测者进行进一步分析,是通过无线通信方......
  • 计算机网络功能
    1.资源共享。资源共享是计算机网络的一个非常重要的功能,所有的计算机网络建设的核心目的就是为了实现资源共享。资源共享是推动计算机网络产生和发展的的源动力之一。无论是第一代面向终端的计算机,还是后来的二代、第三代网络都将方便、高效的共享分布资源作为设计和追求的目标。共......
  • 通用、可扩展的图卷积神经网络
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]图节点邻近度用于衡量图上节点相对某一给定起始节点的相对距离。根据图学习理论,邻近度较高的节点普遍具有较高的相似性。以节点分类任务为例,由于节点邻近度的高低间接指示了图结构上节点间的相似关系,进而包含了各节点的类别信息,......
  • 云原生时代崛起的编程语言Go常用标准库实战
    @目录基础标准库简述字符串-string底层结构函数长度格式化输出模版-templatetext/templatehtml/template正则表达式-regexp编码-encodingBase64JSONXML时间-time网络-netURLHTTP客户端和服务端加密IO操作读写文件环境变量命令行数据库排序-sort测试和基准测试基础标准库简述Go......