IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Socket编程-TCP方式 -> 正文阅读

[网络协议]Socket编程-TCP方式

目录

概述

基于TCP的Socket通信

搭建工程

编码

SocketServerTCP类

SocketThreadTCP

SocketClientTCP

演示


概述

Java开发的朋友们,对Socket都不会太陌生,在我们学习Java课程中,一般都会接触到。Socket是应用层与TCP/IP协议族通信的中间软件抽象层,特别是在Java开发中,JDK已经自带了Sokcet编码所需的接口,让我们更方便使用Socket来实现我们网络通讯功能。

由于最近有个项目刚好要用到Socket,在这里就重新复习一下。并分别实现基于TCP和UDP方式的Socket通信。

基于TCP的Socket通信

Socket通信是分别包含了服务端(Server)和客户端(Client)。

搭建工程

我们先建一个Java工程,方便后续扩展,我们还是采用了Maven方式。

给Project命个名和存放路径:

编码

弄个包(Package),方便区分:

SocketServerTCP类

Socket的服务端(Server),主要

因为我们采取多线程方式来处理客户端发送过来的数据,所以我们后面还需要加上一个多线程处理程序SocketThreadTCP。

package com.ispeasant.socket.tcp;

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

public class SocketServerTCP {
    public static void main(String[] args) {
        try {
            // 通过ServerSocket类来创建服务端,端口为8888(TCP方式和UDP方式,使用的类是不一样)
            ServerSocket serverSocket = new ServerSocket(8888);

            System.out.println("服务端启动成功");

            // 创建个Socket对象,可以理解为客户端
            Socket socket = new Socket();

            // 正常情况,我们都是先启动服务端(Server),然后再启动客户端(Client)来连接服务端(Server)
            // 因此,我们需要一直监听客户端(Client)的连接
            while (true) {
                // 连接客户端(Client)
                socket = serverSocket.accept();

                // 我们采用多线程方式,这样就可以同时连接多个客户端
                SocketThreadTCP socketThreadTCP = new SocketThreadTCP(socket);
                socketThreadTCP.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

SocketThreadTCP

package com.ispeasant.socket.tcp;

import java.io.*;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SocketThreadTCP extends Thread {
    // 创建一个Socket对象
    private Socket socket = null;

    // 通过Socket对象与服务端作为入口,定义一个构建函数
    public SocketThreadTCP(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        // 获取客户端传过来的数据
        InputStream clientIS = null;
        InputStreamReader clientISR = null;
        BufferedReader clentBR = null;

        // 向客户端发送信息
        OutputStream serverOS = null;
        PrintWriter serverPW = null;

        try {
            clientIS = socket.getInputStream();
            clientISR = new InputStreamReader(clientIS);
            clentBR = new BufferedReader(clientISR);

            // 客户端发送过来的信息
            String clientInfo = null;

            while ((clientInfo = clentBR.readLine()) != null) {
                System.out.println(clientInfo);
            }
            // 关掉socket的输入
            socket.shutdownInput();

            // 同时,我们也可以往客户端发送一些信息,以确认我们收到客户端的信息
            serverOS = socket.getOutputStream();
            serverPW = new PrintWriter(serverOS);

            // 加个时间戳,更好区分
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
            Date date = new Date(System.currentTimeMillis());

            serverPW.write(date + ":您好!我是服务端,已收到您的信息、");
            serverPW.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭资源
            if (serverPW != null) {
                serverPW.close();
            }

            if (serverOS != null) {
                try {
                    if (serverOS != null) {
                        serverOS.close();
                    }
                    if (clentBR != null) {
                        clentBR.close();
                    }
                    if (clientISR != null) {
                        clientISR.close();
                    }
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }
}

SocketClientTCP

Socket的客户端,可以用于与服务端(Server)通信。

package com.ispeasant.socket.tcp;

import java.io.*;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SocketClientTCP {
    public static void main(String[] args) {
        try {
            // 创建socket对象,并指定服务端(Server的ip和端口)
            Socket socket = new Socket("localhost", 8888);

            // 向服务端(Server)发送信息
            OutputStream clientOS = socket.getOutputStream();
            PrintWriter clientPW = new PrintWriter(clientOS);

            // 加个时间戳
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z");
            Date date = new Date(System.currentTimeMillis());

            clientPW.write(date + ":您好,我是客户端。");
            clientPW.flush();

            // 关闭socket输出
            socket.shutdownOutput();

            // 接收服务端(Server)信息
            InputStream serverIS = socket.getInputStream();
            InputStreamReader serverISR = new InputStreamReader(serverIS);
            BufferedReader serverBR = new BufferedReader(serverISR);

            // 服务端(Server)信息
            String serverInfo = null;

            while ((serverInfo = serverBR.readLine()) != null) {
                System.out.println(serverInfo);
            }

            // 关闭流
            serverBR.close();
            serverISR.close();
            serverIS.close();
            clientPW.close();
            clientOS.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

演示

先启动SocketServerTCP类:

由于我用的是IDEA开发工具,可以同时启动多个程序,接着我们就启动SocketClientTCP类。

这里可以看出,客户端已接收到服务端的信息,我们再看看服务端的情况。

因此,也可以看出服务端也是接收到了客户端发过来的信息。证明Socket的TCP通信,是已经成功了。

如果大家还想继续测试,就不要关停服务端的程序,再次启动客户端程序就可以了。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:23:39  更:2021-12-03 13:24:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年7日历 -2024/7/6 7:55:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码