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 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> TCP网络编程 -> 正文阅读

[网络协议]TCP网络编程

一、网络编程基本概念

1. 什么是计算机网络
分布在不同地域的计算机, 通过硬件等网络设备使用通信线路互相连接形成的一个网格系统.
计算机网络, 可以很方便的进行 信息的传递, 资源的共享!


2. 什么是计算机的IP地址
IP地址 是计算机在互联网中的唯一标识 . 就像人在社会中的身份证号码.
本机IP:
127.0.0.1
localhost


3. 什么是 网络中 网站的域名
域名可以简单的理解为, IP地址的别名. 更方便记忆, 当输入域名后(例如www.baidu.com) , 计算机会访问域名解析商 , 然后得到ip地址, 再进行访问.


4. 什么是计算机的端口号
端口号的范围 0-65535 之间 . *****
与ip地址很相似, IP地址是计算机在网络中的唯一标识 .
端口号是计算机中 程序的标识 . 用于在一台计算机中区分不同的应用程序
端口号在使用时 , 应尽量避免0-1024之间的端口号, 因为已经被一些知名的软件 和 windows操作系统所占用了.


5. 什么是计算机之间的通信协议
是计算机与计算机之间交流的标准 .
是对数据的 传输速率, 传入接口, 步骤控制 出错控制 等等 制定的一套标准 !
常用的通信协议:
1. http协议 : 超文本传输协议 . 80端口号
2. https协议: 安全的超文本传输协议 443端口号
3. ftp协议: 文件传输协议 21端口号
4. TCP协议: 传输控制协议
5. UDP协议: 数据报协议

6.网络 编程程序的分类:

1.B/S 程序 : 浏览器与服务器程序
2.C/S 程序 : 客户端与服务器程序

7.TCP协议 - OSI网络模型

指的是 从一台计算机的软件中, 将数据发送到另一台计算机的软件中的过程.
七层网络模型: 应用层 / 表现层 / 会话层 / 传输层 / 网络层 / 数据链路层 / 物理层


三次握手 和 四次挥手 熟悉

第一次握手:客户端向服务器端发起连接请求,等待服务器确认。

第二次握手:服务器端向客户端回送一个响应,通知客户端收到了连接请求。

第三次握手:客户端再次向服务器端发送确认信息,确认连接。

第一次挥手:客户端向服务器发送断开请求。

第二次挥手:服务器收到请求后,向客户端回一个应答,接着服务器进入等待关闭状态,TCP处于半关闭状态。

第三次挥手:服务器也打算断开连接,向客户端发送报文。

第四次挥手:客户端收到报文后,回复一个响应。双方关闭。

二、TCP程序

需要用到两个类来编写TCP的cs程序

1、ServerSocket 搭建服务器

2、Socket 搭建客户端

ServerSocket用来搭建服务器,搭建完毕后,会绑定一个端口号。

然后此服务器可以等待客户端连接。

每连接一个客户端,服务器就会得到一个新的Socket对象,用于跟客户通信。

Socket是两台计算机之间通信的端点。一边持有一个socket对象,来沟通。socket像电话的作用。

下面我们来演示一下服务器与客户端连接的全过程,注:用两个类来通信,一个搭建服务器,一个搭建客户端。

第一步,我们先来搭建服务器:起端口号为:10086

ServerSocket server = new ServerSocket(10086); //搭建服务器

第二步:用accept来接收客户端的连接,并且将链接好的端口起名为socket

Socket socket = server.accept(); //等待客户端连接,连接好的端点为socket

第三步:创建一个客户端:

Socket socket = new Socket("127.0.0.1",10086);

端口中的参数是IP地址和端口号。本机IP地址为127.0.0.1或localhost。端口号就是服务器的端口号。

这样运行两个类,我们的服务器和客户端就连接成功了。

下面我们进行一些简单的通信。通信都是用socket来进行通信的。用输入输出流来进行交流。

服务器端发消息:?

//发消息
        OutputStream os = socket.getOutputStream(); //端点调用输出流
        PrintStream ps = new PrintStream(os);//将输出流转换成打印流
        ps.println("欢迎连接本服务器!");

客户端收消息:

InputStreamReader将字节流转换为字符流,BufferedReader从字符流中缓存字符。

InputStream is = socket.getInputStream(); //用端点调用输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String text = br.readLine();
        System.out.printf("客户端接收到的消息为:"+text);

?客户端的发消息,服务器的收消息的方法都同上。

注:必须有一端发,一端收,不能两端同时都发。

整体的代码如下:代码示例:

服务器端:

public class Demo1 {
    public static void main(String[] args) throws IOException {
       ServerSocket server = new ServerSocket(10086); //搭建服务器
        System.out.println("服务器搭建完毕!");
        Socket socket = server.accept(); //等待客户端连接,连接好的端点为socket
        System.out.println("一个客户端已成功连接√");
        //发消息
        OutputStream os = socket.getOutputStream(); //端点调用输出流
        PrintStream ps = new PrintStream(os);//将输出流转换成打印流
        ps.println("欢迎连接本服务器!");
        //接收消息
        InputStream is = socket.getInputStream(); //用端口接收流
        /**
         * InputStreamReader将字节流转换为字符流
         * BufferedReader从字符流中缓存字符
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String text = br.readLine();
        System.out.printf("服务器接到了客户端的回复:"+text);
        System.out.printf("服务器程序执行结束!");
    }
}

客户端:

public class Demo2 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10086);
        InputStream is = socket.getInputStream(); //用端点调用输入流
        /**
         * InputStreamReader将字节流转换为字符流
         * BufferedReader从字符流中缓存字符
         */
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        String text = br.readLine();
        System.out.printf("客户端接收到的消息为:"+text);
        OutputStream os = socket.getOutputStream();
        PrintStream ps = new PrintStream(os);
        ps.println("服务器你好!");
    }
}

运行结果:

执行完服务器端,服务器端等待客户端连接。?

再运行客户端:客户端代码结果

?服务器端结果:整个结束。

?三、服务器中加入多线程

上面的方法,我们一个服务器可以连接多个客户端,但是只能按顺序执行,处理完第一个客户端的事情后,才能处理第二个客户端。效率太低,服务器不可能一次只处理一个客户端的事情。所以我们需要加入多线程技术。多线程技术连接:

https://mp.csdn.net/mp_blog/creation/editor/121070409icon-default.png?t=M1L8https://mp.csdn.net/mp_blog/creation/editor/121070409

循环接收客户端,在接收客户端后面,加入多线程。每接收一个客户端,就进入一个新的线程中。各线程完成各线程的事情。?

请阅读源码:

public class Demo3 {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(20086);
        while(true){
           Socket socket = server.accept();
           new Thread(){
               @Override
               public void run() {
                   try {
                       InputStream is = socket.getInputStream();
                       BufferedReader br = new BufferedReader(new InputStreamReader(is));
                       System.out.println(Thread.currentThread().getName());
                       System.out.println("客户端发来的消息:"+br.readLine());
                       OutputStream os = socket.getOutputStream();
                       PrintStream ps = new PrintStream(os);
                       ps.println("我是服务器,感谢链接");
                       Thread.sleep(10000);   //休眠十秒
                       System.out.println(Thread.currentThread().getName()+"休眠完毕!");
                   } catch (IOException e) {
                       e.printStackTrace();
                   } catch (InterruptedException e) {
                       e.printStackTrace();
                   }
               }
           }.start();
        }
    }
}

于是我们在客户端不断连接。

运行结果如下:多线程一起运行。一个服务器连接多个客户端,并同时处理。

?

?

本文到这里,关于TCP网络编程的方法就全部介绍完毕了。

作者码字不易,您的点赞收藏是对我的鼓励~

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 15:59:55  更:2022-02-28 16:03:30 
 
开发: 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年11日历 -2024/11/26 8:39:23-

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