广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java网络编程 - TCP通信
  • 205
分享到

Java网络编程 - TCP通信

网络tcp/ipjava 2023-08-16 14:08:24 205人浏览 安东尼
摘要

文章目录 TCP通信快速入门(一发一收)编写客户端代码编写服务器代码 多发多收多发多收(同时接受多个客户端)线程池优化 tcp通信 快速入门(一发一收) TCP协议回顾: TCP是一种面向连接,安全、可靠的

tcp通信

快速入门(一发一收)

TCP协议回顾:

TCP是一种面向连接,安全、可靠的传输数据的协议

传输前,采用“三次握手”方式,点对点通信,是可靠的

在连接中可进行大数据量的传输

TCP通信模式:

在这里插入图片描述

在java中只要是使用java.net.Socket类实现通信,底层即是使用了TCP协议

编写客户端代码

Socket(客户端):

构造器说明
Socket(String host , int port)创建发送端的Socket对象与服务端连接,参数为服务端程序的ip和端口。

Socket类成员方法:

方法说明
OutputStream getOutputStream()获得字节输出流对象
InputStream getInputStream()获得字节输入流对象

客户端实现步骤:

  • 创建客户端的Socket对象,请求与服务端的连接。
  • 使用socket对象调用getOutputStream()方法得到字节输出流。
  • 使用字节输出流完成数据的发送。
  • 不建议直接关闭socket管道释放资源, 一般用户退出时才会关闭。
public class ClientDemo {    public static void main(String[] args) {        try {            // 1. 创建socket通信管道请求与服务端进行连接                        Socket socket = new Socket("127.0.0.1", 7777);            // 2. 从socket通信管道中获取到字节输出流            OutputStream os = socket.getOutputStream();            // 包裹低级字节输出流为字节打印流            PrintStream ps = new PrintStream(os);            // 3. 打印流发送消息            ps.println("我是TCP的客户端");            ps.flush(); // 刷新        } catch (Exception e) {            e.printStackTrace();        }    }}

编写服务器代码

ServerSocket(服务端):

构造器说明
ServerSocket(int port)注册服务端端口

ServerSocket类成员方法:

方法说明
Socket accept()等待接收客户端的Socket通信连接
连接成功返回Socket对象与客户端建立端到端通信

服务端实现步骤:

  • 创建ServerSocket对象,注册服务端端口。
  • 调用ServerSocket对象的accept()方法,等待客户端的连接,并得到Socket管道对象。
  • 通过Socket对象调用getInputStream()方法得到字节输入流、完成数据的接收。
  • 不建议直接关闭socket管道释放资源, 一般用户退出时才会关闭。
public class ServerDemo {    public static void main(String[] args) {        try {            // 1. 创建ServerSocket对象注册服务器端口            ServerSocket serverSocket = new ServerSocket(7777);            // 2. 调用accept方法, 等待客户端连接, 连接成功返回socket管道对象            Socket socket = serverSocket.accept();            // 3. 从socket管道中获取字节输入流, 完成数据接受            InputStream is = socket.getInputStream();            // 把字节输入流包装为缓冲字符输入流进行消息接收            BufferedReader br = new BufferedReader(new InputStreamReader(is));            // 按照行读取            String message;            if ((message = br.readLine()) != null) {                System.out.println(message);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

多发多收

需求

  • 使用TCP通信方式实现:多发多收消息。

具体要求

  • 可以使用死循环控制服务端收完消息继续等待接收下一个消息。
  • 客户端也可以使用死循环等待用户不断输入消息。
  • 客户端一旦输入了exit,则关闭客户端程序,并释放资源。

客户端

public class ClientDemo {    public static void main(String[] args) {        try {            Socket socket = new Socket("127.0.0.1", 7777);            OutputStream os = socket.getOutputStream();            PrintStream ps = new PrintStream(os);            // 客户端使用死循环等待用户不断地输入消息            Scanner scanner = new Scanner(System.in);            while (true) {                System.out.println("发送消息: ");                String inp = scanner.nextLine();                // 一旦输入了exit,则关闭客户端程序,并释放资源                if (inp.equals("exit")) {                    System.out.println("下线成功");                    ps.close();                    break;                }                ps.println(inp);                ps.flush();            }        } catch (Exception e) {            e.printStackTrace();        }    }}

服务端

public class ServerDemo {    public static void main(String[] args) {        try {            ServerSocket serverSocket = new ServerSocket(7777);            Socket socket = serverSocket.accept();            InputStream is = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            String message;            // 死循环控制服务端收完消息继续等待接收下一个消息            while ((message = br.readLine()) != null) {                System.out.println("收到消息: " + message);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

多发多收(同时接受多个客户端)

思考: 案例实现了多发多收,那么是否可以同时接收多个客户端的消息?

不可以的。

因为服务端现在只有一个线程,只能与一个客户端进行通信; 并且上面代码中, 我们只连接了一个客户端然后就在死循环接受消息。

那么如何才可以让服务端可以处理多个客户端的通信需求

引入多线程

同时处理多个客户端消息实现架构如下:

主线程死循环不断地接收socket链接, 每成功链接一个socket, 就交给子线程处理

在这里插入图片描述

实现步骤如下:

优化服务器代码即可

创建一个线程类, 用来处理接收消息

public class ServerReaderThread extends Thread {    private Socket socket;    public ServerReaderThread(Socket socket) {        this.socket = socket;    }    @Override    public void run() {        try {            InputStream is = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            String message;            // 死循环控制服务端收完消息继续等待接收下一个消息            while ((message = br.readLine()) != null) {                System.out.println("收到消息: " + message);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

在服务器主线程中, 每链接到一个socket都要创建一个线程类交给子线程处理

public class ServerDemo {    public static void main(String[] args) {        try {            ServerSocket serverSocket = new ServerSocket(7777);            // 1. 主线程中定义一个死循环由主线程不断地接收客户端socket管道连接            while (true) {                // 2. 每接收到一个socket管道, 都交给一个独立的子线程负责读取消息                Socket socket = serverSocket.accept();                // 交给子线程处理, 并启动子线程                new ServerReaderThread(socket).start();            }        } catch (Exception e) {            e.printStackTrace();        }    }}

线程池优化

目前的通信架构存在什么问题

客户端与服务端的线程模型是: 1-1的关系, 有多少客户端就会创建多少线程。

客户端并发越多,系统瘫痪的越快。

引入线程池处理多个客户端消息的架构如下:

在这里插入图片描述

线程池优化多发多收, 我们只需要优化服务器的代码即可:

创建一个Runnable任务类

public class ServerReaderRunnable implements Runnable {    private Socket socket;    public ServerReaderRunnable(Socket socket) {        this.socket = socket;    }    @Override    public void run() {        try {            InputStream is = socket.getInputStream();            BufferedReader br = new BufferedReader(new InputStreamReader(is));            String message;            // 死循环控制服务端收完消息继续等待接收下一个消息            while ((message = br.readLine()) != null) {                System.out.println(socket.getRemoteSocketAddress() + "收到消息: " + message);            }        } catch (Exception e) {            e.printStackTrace();        }    }}

优化服务器端代码

public class ServerDemo {    // 使用静态变量记录一个线程池对象    private static ExecutorService pool = new ThreadPoolExecutor(3, 5, 6,            TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(),            new ThreadPoolExecutor.AbortPolicy());    public static void main(String[] args) {        try {            ServerSocket serverSocket = new ServerSocket(7777);            while (true) {                Socket socket = serverSocket.accept();                System.out.println(socket.getRemoteSocketAddress() + "上线了");                // 创建Runnable任务交给线程池处理                pool.execute(new ServerReaderRunnable(socket));            }        } catch (Exception e) {            e.printStackTrace();        }    }}

线程池优势是什么?

服务端可以复用线程处理多个客户端,可以避免系统瘫痪。

适合客户端通信时长较短的场景。
计思想, 客户端将消息发送给服务器, 再由服务器进行转发给其他客户端。

来源地址:https://blog.csdn.net/m0_71485750/article/details/127720523

--结束END--

本文标题: Java网络编程 - TCP通信

本文链接: https://www.lsjlt.com/news/371535.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java网络编程 - TCP通信
    文章目录 TCP通信快速入门(一发一收)编写客户端代码编写服务器代码 多发多收多发多收(同时接受多个客户端)线程池优化 TCP通信 快速入门(一发一收) TCP协议回顾: TCP是一种面向连接,安全、可靠的...
    99+
    2023-08-16
    网络 tcp/ip java
  • .NET网络编程——TCP通信
    一、网络编程的基本概念 : 1. 网络         就是将不同区域的电脑连接到一起,组成局域网、城域网或广域网。把分部在不同地理区域的计算机于专门的外部设备用通信线路 互联成一个规模大、功能强的网络系统,从而使众多的计算机可以方便地互相...
    99+
    2023-08-31
    网络 tcp/ip 服务器 .net eclipse java
  • Java网络编程之TCP通信完整代码示例
    一、概述  Socket类是Java执行客户端TCP操作的基础类,这个类本身使用代码通过主机操作系统的本地TCP栈进行通信。Socket类的方法会建立和销毁连接,设置各种Socket选项。  ServerSocket类是Java执行服务器端...
    99+
    2023-05-30
    java tcp socket
  • Java网络编程 - UDP通信
    文章目录 UDP通信快速入门一发一收多发多收广播组播 UDP通信 快速入门 UDP协议的特点: UDP是一种无连接、不可靠传输的协议。 将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直...
    99+
    2023-08-30
    java 网络 udp
  • 学习网络编程No.5【TCP套接字通信】
    引言: 北京时间:2023/8/25/15:52,昨天刚把耗时3天左右的文章更新,充分说明我们这几天并不是在摆烂中度过,而是在为了更文不懈奋斗,历时这么多天主要是因为该部分知识比较陌生,所以需要我们花...
    99+
    2023-09-05
    网络 学习 tcp/ip
  • Java网络编程 - 网络编程介绍 - 网络通信三要素
    文章目录 网络编程网络编程介绍网络通信三要素要素一: IP地址IP地址基本介绍IP地址的操作类 要素二: 端口号要素三: 协议TCP协议UDP协议 网络编程 网络...
    99+
    2023-09-07
    网络 java 网络协议
  • Java网络编程之UDP网络通信详解
    目录1.UDP网络通信编程原理1.1 UDP网络通信编程介绍1.2 UDP网络通信编程的基本流程2.UDP网络通信编程案例1.UDP网络通信编程原理 1.1 UDP网络通信编程介绍 ...
    99+
    2022-11-13
  • 网络编程—tcp
              一、TCP简介           二、tcp网络程序-客户端           三、tcp网络程序-服务器           四、案例:文件下载器           五、tcp三次握手、四次挥手        ...
    99+
    2023-01-31
    网络编程 tcp
  • python 网络通信协议/TCP,UD
    一.osi七层协议 互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层 协议具体内容   各层的功能简述: 【1】物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率...
    99+
    2023-01-30
    通信协议 网络 python
  • Python socket网络编程TCP/IP服务器与客户端通信
    Python socket网络编程 初学 python,前段时间买了两本书《python 编程从入门到实践》《Python 核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深...
    99+
    2022-06-04
    客户端 网络编程 通信
  • Java网络编程之基于TCP协议
    目录一、单向通信二、双向通信三、对象流传送四、加入完整的处理异常方式五、多线程接收用户请求一、单向通信 功能:客户端发送一句话到服务器: 客户端: public class ...
    99+
    2022-11-12
  • Java网络编程TCP实现聊天功能
    网络编程TCP实现聊天的前提还需要掌握IO流,话不多说,直接上代码! 客户端: package com.kuang.lesson02; import java.io.IOExc...
    99+
    2022-11-12
  • Java网络编程之UDP和TCP套接字
    文章目录 一. 网络编程概述二. UDP网络编程1. UDP套接字2. UDP客户端回显服务器程序2.1 UDP回显服务器2.2 UDP客户端2.3 UDP实现查词典的服务器 三. ...
    99+
    2023-09-08
    网络编程 Java Socket UDP/TCP 套接字
  • 如何使用Node.js进行TCP网络通信
    这篇文章给大家介绍如何使用Node.js进行TCP网络通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。摘要: 网络是通信互联的基础,Node.js提供了...
    99+
    2022-10-19
  • 第二十七天- 网络通信协议 TCP UD
        1.网络通信协议   osi七层模型:按照分工不同把互联网协议从逻辑上划分了层级       socket层   2.理解socket:   Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计...
    99+
    2023-01-30
    通信协议 十七天 网络
  • Java网络编程TCP实现文件上传功能
    本文实例为大家分享了Java网络编程TCP实现文件上传的具体代码,供大家参考,具体内容如下 上一篇博客,用网络编程TCP 实现聊天,这次实现文件上传。 客户端: package ...
    99+
    2022-11-12
  • Java网络编程TCP如何实现聊天功能
    这篇文章主要为大家展示了“Java网络编程TCP如何实现聊天功能”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java网络编程TCP如何实现聊天功能”这篇文章吧。客户端:package ...
    99+
    2023-06-20
  • C++ TCP网络编程详细讲解
    目录TCP介绍与编程流程TCP C/S架构TCP客户端编程流程1. 创建TCP套接字2. connect连接服务器3. send发送请求4. recv接收应答(默认带阻塞)5. cl...
    99+
    2022-11-13
  • python网络-Socket之TCP编
    一、TCP简介 1、TCP介绍 TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP通信需要经过创建连接、数据传送、终止...
    99+
    2023-01-31
    网络 python TCP
  • Java实现基于UDP协议的网络通信UDP编程
    目录UDP编程通信基本介绍基本流程UDP编程通信 基本介绍 类DatagramSocket和DatagramPacket【数据包/数据报】实现了基于UDP协议网络程序。UDP数据报通...
    99+
    2023-05-17
    Java UDP编程 Java UDP网络编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作