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程序在开发应用程序,搭建网站,尤其对于网络通信提供了大量快速便捷的的函数和方法。如果有补充或者指正的内容,欢迎读者在评论区中留言。

相关推荐
程序猿进阶1 小时前
ThreadLocal 释放的方式有哪些
java·开发语言·性能优化·架构·线程池·并发编程·threadlocal
战族狼魂1 小时前
java代码 识别pdf文件是否含有表格
java·python·pdf
程序者王大川1 小时前
【大数据】如何读取多个Excel文件并计算列数据的最大求和值
开发语言·python·excel·big data
Mryan20051 小时前
OpenJudge | 寻找中位数
开发语言·数据结构·c++·算法·openjudge
码里法2 小时前
springmvc用配置类替换xml配置
java·spring·mvc
lizi888882 小时前
打包Python代码的常用方法实现程序exe应用
开发语言·python
api茶飘香3 小时前
守护应用边界:通过反射API实现安全的输入输出过滤
java·开发语言·python·安全·django·virtualenv·pygame
杀死一只知更鸟debug3 小时前
策略模式的小记
java·开发语言·策略模式
nice666603 小时前
CSS的基本语法
java·前端·css·visual studio code
efls1113 小时前
Qt_了解Qt Creator
开发语言·qt