TCP协议程序设计

文章目录


前言

TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通讯的两个应用程序是有主次之分的,一个称为服务器程序,另一个称为客户机程序,两者的功能和编写方法不太一样。必须先启动服务器程序,调用accept()方法等待客户机程序启动,连接起服务器程序和客户机程序的就是相同的端口。


一、TCP协议程序是什么?

TCP网络程序协议是一种基于传输控制协议(TCP)的网络通信协议。

它定义了在计算机网络上进行通信时,如何建立、维护和关闭连接,以及如何传输数据的规则和约定。TCP网络程序协议提供了可靠的、面向连接的数据传输服务,确保数据的正确性和有序性。

TCP协议基础是通过**套接字(socket)**建立的。

它是Internet上最常用的协议之一,被广泛应用于Web浏览、电子邮件、文件传输、远程登录等网络应用中。举个例子,我们使用的QQ和微信,这些通信软件,都离不开TCP协议程序。

二、使用步骤

1.服务器端与客户端

(1)服务器套接字(ServerSocket类)

ServerSocket类的语法:

java 复制代码
ServerSocket 对象 = new ServerSocket();
//创建非绑定服务器套接字(无指定端口和地址)

ServerSocket 对象 = new ServerSocket(int port);
//创建绑定特定端口的服务器套接字

ServerSocket 对象 = new ServerSocket(int port,int backlog);
//利用backlog创建服务器套接字,并将其绑定到本地端口号上

ServerSocket 对象 = new ServerSocket(int port,int backlog,InetAddress bindAddress);
/*使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器。
  这种情况适用于计算机上有多块网卡和多个IP地址的情况,用户可以明
  确规定ServerSocket在哪块网卡或哪个IP地址上等待客户的连接请求。 */

我们输入的端口值,就是设定该服务器的接入端口,任何客户机都需要使用这个端口值才能申请接入此服务器。

|------------------------------|--------------------------------|---------|
| 方法 | 功能描述 | 返回类型 |
| isBound() | 判断ServerSocket是否处于绑定状态 | boolean |
| bind(SocketAddress endpoint) | 将ServerSocket绑定到特定地址(IP地址和端口号) | void |
| accept() | 等待客户端的连接,返回成功连接的Socket对象 | Socket |
| getInetAddress() | 返回此服务器套接字的本地地址 | int |
| isClosed() | 查看服务器套接字是否关闭 | boolean |
| close() | 关闭服务器套接字 | void |
[ServerSocket类的常用方法]

accept()方法会阻塞线程的继续执行,直到接收到客户端的呼叫。如果没有客户端呼叫服务器,那么线程仍处于阻塞状态,后面的代码不会执行。(这时我们运行客户端代码后,阻塞状态结束)

若没有客户端运行,产生客户请求,accept()方法也没有让线程阻塞,那么程序出了问题。可能是使用了一个被其他程序占用的端口号,或者ServerSocket绑定没有成功之类的。

(2)客户端套接字(Socket类)

Socket类的语法:

java 复制代码
Socket 对象 = new Socket(String host,int port);
//创建一个连接到指定主机和端口的套接字
//host是服务器的IP地址或主机名,port是服务器上正在监听的端口号。

Socket 对象 = new Socket(InetAddress address,int port);
//使用InetAddress对象创建一个连接到指定地址和端口的套接字

Socket 对象 = new Socket(String host,int port,InetAddress localAddr,int localPort);
//创建一个连接到指定主机和端口的套接字,并指定本地地址和端口
//localAddr是本地地址,localPort是本地端口

Socket 对象 = new Socket(InetAddress address,int port,InetAddress localAddr,int localPort);
//使用InetAddress对象创建一个连接,并指定本地地址和端口

以上为Socket对象的创建方法,其中第一个最常使用。

|---------------------------------------------|-------------------------------------------------------------|--------------|
| 方法 | 功能描述 | 返回类型 |
| getInputStream() | 返回与此套接字连接的输入流,用于读取从服务器发送的数据 | InputStream |
| getOutputStream() | 返回与此套接字连接的输出流,用于向服务器发送数据 | OutputStream |
| close() | 关闭此套接字并释放与之关联的资源 | void |
| isConnected() | 判断此套接字是否已经连接到远程主机 | boolean |
| isClosed() | 判断此套接字是否已关闭 | boolean |
| setSoTimeout(int timeout) | 设置套接字的超时时间(以毫秒为单位)。如果指定时间内没有数据可以,抛出SocketTimeoutException异常 | void |
| connect(SocketAddress endpoint) | 连接到指定的地址 | void |
| connect(SocketAddress endpoint,int timeout) | 连接到指定的地址,并设置连接超时时间 | void |
[Socket类的常用方法]

2.实操展示

TCP程序设计流程:

所谓启动服务器、客户端,指的是运行相应的程序;关闭客户端、服务器,也是指相应的实例化对象调用close()方法进行套接字关闭。

**注意:**该实操展示写了两个java文件,一个为服务器代码,另一个为客户端代码,两个文件各自先后运行,实现数据交互。

(1)服务器端代码:

java 复制代码
import java.net.Socket; 
import java.net.ServerSocket; 
import java.io.InputStream;
public class Demo9 {    
    private InputStream inputStream; 
    private ServerSocket server; 
    private Socket socket; 
    void server(){ 
        try { 
            server = new ServerSocket(1024); 
            System.out.println("服务器端口已建立,等待用户端连接..."); 
            socket = server.accept();   //等待用户接入 
            inputStream = socket.getInputStream();
            byte b[] =new byte[1024];
            int len = inputStream.read(b);
            String string = new String(b,0,len);
            System.out.println("来自客户端的消息:"+string);
            System.out.println("客户端IP:"+socket.getInetAddress());
        } catch (Exception e) { 
            e.printStackTrace(); 
        }finally{
            inputStream.close();
            server.close();
        } 
    } 
    public static void main(String[] args) { 
       Demo9 demo9 = new Demo9(); 
       demo9.server(); 
    } 
}

创建服务器套接字,并设定端口号为1024。使用accept()方法监听客户端的申请。再通过ServerSocket类的getInputStream()方法和IO输入流读取客户端发来的信息。最后根据socket对象,获取发送信息的客户机的公共IP地址。最后关闭各种流,释放系统资源。

(2)客户机端代码:

java 复制代码
import java.net.Socket;
import javax.swing.JFrame;
import java.io.OutputStream;

public class Demo10 extends JFrame{
    private OutputStream out;
    private Socket socket;

    private void connect(){
        System.out.println("尝试与服务器连接...");
        try {
            socket = new Socket("127.0.0.1", 1024);
            String string = "向服务器输送数据中...";
            out = socket.getOutputStream();
            out.write(string.getBytes());
            System.out.println("接入成功");
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            out.close();
            socket.close();
        }
    }
 
    public static void main(String[] args) {
        Demo10 demo10 = new Demo10();
        demo10.connect();
    }

}

创建客户机套接字,实例化时输入目标主机的公共IP地址和开放的端口号。使用getOutputStream()方法和IO输出流的write()方法向服务器输入数据。最后关闭各种流,释放系统资源。

运行结果:

运行服务器代码,服务器端启动,等待客户端接入:

运行客户端代码,客户端启动,接入服务器,发送数据:

此时再去查看服务器处终端的反馈:

如上图所示,"向服务器输送数据中..."这段字符串就是从客户端向服务器发过来的,通过IO流。

而发送这条信息的客户端,正是我自己的笔记本。我的笔记本既是服务器,又是客户端,所以当服务器终端输出发送数据的客户端的IP地址,就是我的本地主机地址(当然我也可以显示为我的公共IP地址)。

总而言之,获取到客户端的信息,并且可以获取到该客户端的公共IP地址。


总结

以上就是TCP协议的程序设计,本文简单介绍如何搭建TCP程序,而TCP程序在开发应用程序,搭建网站,尤其对于网络通信提供了大量快速便捷的的函数和方法。如果有补充或者指正的内容,欢迎读者在评论区中留言。

相关推荐
Scott9999HH3 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社4 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海4 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖5 小时前
JDK 26 新特性详解
java·开发语言
马优晨5 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区7 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大8 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai8 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说8 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json