Java TCP协议通信超详细讲解

Java TCP协议通信超详细讲解

什么是TCP协议

TCP(Transmission Control Protocol)传输控制协议是一种可靠的、面向连接的传输层协议。TCP协议通过序列号、确认、重传等方式,确保传输的可靠性,但会对网络带宽进行占用,因此适用于对网络传输质量要求高的场景。

TCP协议通信的基本流程

TCP协议通信的基本流程如下:

  1. 服务器启动并等待客户端的连接请求。
  2. 客户端主动发起连接请求,服务器接受连接请求并向客户端发送确认信息。
  3. 双方建立连接后,进行数据通信。
  4. 通信结束后,由其中一方断开连接,另一方接受关闭连接请求。

Java实现TCP协议通信的步骤

Java通过Socket类实现TCP协议通信,具体步骤如下:

  1. 在服务器端创建ServerSocket对象,并调用accept()方法等待客户端连接请求。
  2. 在客户端创建Socket对象,并向服务器IP地址和端口号发起连接请求。
  3. 客户端向服务器发送数据,服务器通过Socket对象的输入流读取数据。
  4. 服务器向客户端发送数据,客户端通过Socket对象的输入流读取数据。
  5. 通信结束后,双方关闭Socket对象。

示例1:Java服务器端和客户端的交互

Java服务器端代码:

import java.net.*;
import java.io.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9090);
        Socket clientSocket = serverSocket.accept();
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            out.println("Server: " + inputLine);
        }
    }
}

Java客户端代码:

import java.net.*;
import java.io.*;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 9090);
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
        String userInput;
        while ((userInput = stdIn.readLine()) != null) {
            out.println(userInput);
            System.out.println("Server: " + in.readLine());
        }
    }
}

这个例子展示了一个简单的双向通信,服务器将客户端发送的信息返回给客户端,客户端输出服务器返回的信息。
在服务器端,ServerSocket监听本地IP地址的9090端口,并等待客户端连接。当有客户端发起连接请求时,服务器Socket接受连接请求,将客户端传递过来的信息返回给客户端。

在客户端,通过Socket对象连接服务器,向服务器发送文本并获取服务器返回的文本。

示例2:Java客户端与服务器传输文件

Java服务器端代码:

import java.io.*;
import java.net.*;

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(9090);
        Socket clientSocket = serverSocket.accept();
        InputStream in = clientSocket.getInputStream();
        OutputStream out = new FileOutputStream("file.txt");
        byte[] buffer = new byte[1024];
        int length;
        while ((length = in.read(buffer)) != -1) {
            out.write(buffer, 0, length);
        }
        out.close();
        in.close();
        clientSocket.close();
        serverSocket.close();
    }
}

Java客户端代码:

import java.io.*;
import java.net.*;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("localhost", 9090);
        File file = new File("file.txt");
        InputStream in = new FileInputStream(file);
        OutputStream out = socket.getOutputStream();
        byte[] buffer = new byte[1024];
        int length;
        while ((length = in.read(buffer)) != -1) {
            out.write(buffer, 0, length);
        }
        out.flush();
        in.close();
        socket.close();
    }
}

这个例子展示了如何使用Java客户端向服务器端传输文件。在服务器端,ServerSocket监听本地IP地址的9090端口,并等待客户端连接。当有客户端发起连接请求时,服务器Socket接受连接请求,并通过输入流将客户端传递过来的文件数据写入本地磁盘的文件file.txt中。

在客户端,通过Socket对象连接服务器,并将本地磁盘中的文件通过输出流发送到服务器端。在发送完成后,关闭Socket对象和输入流。

总结

本文介绍了TCP协议的基本概念和Java实现TCP协议通信的步骤。通过两个示例展示了Java服务器端和客户端之间的交互和通过Java客户端向服务器端传输文件的方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java TCP协议通信超详细讲解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 检查上传图片是否合法的函数,木马改后缀名、图片加恶意代码均逃不过

    检查上传图片是否合法的函数攻略 为了确保上传的图片是合法的,我们可以采取以下步骤: 验证文件类型:首先,我们需要验证上传的文件是否是图片文件。我们可以通过检查文件的扩展名或者使用文件的魔术数字(magic number)来确定文件类型。常见的图片文件类型有JPEG、PNG、GIF等。以下是一个示例函数,用于验证文件类型: import imghdr def …

    other 2023年8月5日
    00
  • 很详细的Log4j配置步骤

    下面是“很详细的Log4j配置步骤”的完整攻略。 Log4j配置步骤 1. 引入依赖 首先,需要在项目中引入Log4j的依赖。以Maven为例,在pom.xml文件中添加以下代码: <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId…

    other 2023年6月25日
    00
  • MySQL优化案例之隐式字符编码转换

    MySQL优化案例之隐式字符编码转换是一个涉及MySQL字符集和编码的优化技巧,能够帮助开发者避免隐式字符编码转换带来的性能影响。 以下是MySQL优化案例之隐式字符编码转换的完整攻略: 背景和问题 MySQL中字符集和编码是非常重要的概念,不同的字符集和编码对查询和存储的性能影响很大,甚至会带来莫名其妙的问题。在MySQL中,如果查询语句中涉及到多个字段或…

    other 2023年6月25日
    00
  • Layui之table中的radio在切换分页时无法记住选中状态的解决方法

    下面是详细的攻略过程。 问题描述 Layui是一款非常流行的前端UI框架,其中table组件提供了类似于网页中的表格功能。在使用table时,可能会遇到一个问题:table中的radio在切换分页时无法记住选中状态。 具体来说,当表格有多页时,用户在当前页选择了某个radio之后,当切换到其他页再回来时,之前选中的radio会被取消选中状态,导致用户体验不佳…

    other 2023年6月27日
    00
  • vs2010 中添加 ActiveX Control Test Container工具的方法

    首先,需要了解的是什么是ActiveX Control Test Container工具。它是Visual Studio的一个附加工具,作用是用于创建和运行ActiveX控件测试用例,并检查控件的行为和属性是否符合预期。那么如何添加这个工具呢?步骤如下: 步骤1:打开Visual Studio开发环境并进入”工具”菜单 在Visual Studio开发环境中…

    other 2023年6月27日
    00
  • VB实现屏蔽文本框右键菜单的复制、粘贴等功能的方法

    首先,需要明确一点,禁用文本框右键菜单的复制、粘贴等功能,其实也就是禁用系统默认的快捷键,因此我们需要通过VB代码来修改系统默认快捷键,具体步骤如下: 步骤一:新建窗体并设置属性 首先,需要新建一个窗体,并在窗体中添加一个文本框控件,随后需要设置文本框控件的以下属性: Name:txtInput MultiLine:True EnableContextMen…

    other 2023年6月27日
    00
  • mybatis教程之resultmap_动力节点Java学院整理

    MyBatis教程之ResultMap 什么是ResultMap? 在MyBatis中,ResultMap是一个用于描述如何从数据库中结果集中来进行对象的映射的对象。它主要用于将查询结果集中的字段映射到对应的Java对象的成员变量中,从而使得Java对象能够得到填充,方便操作。 通常情况下,ResultMap会定义在Mapper映射文件中,用于描述Resul…

    other 2023年6月27日
    00
  • java自定义Scanner类似功能类的实例讲解

    下面我为你详细讲解“Java自定义Scanner类似功能类的实例讲解”的攻略。 什么是Java自定义Scanner类似功能类 Java中的Scanner类是一种常用的输入工具,可以方便地从控制台读取各种类型的数据。但是,有时我们需要从文件、网络、数据库等地方读取数据,此时Scanner就不适用了。因此,我们需要自定义一个类,在某些方面类似于Scanner,能…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部