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协议及socket中TCP的使用 -> 正文阅读

[网络协议]初始传输层TCP协议及socket中TCP的使用

目录

一.socketAPI中TCP的使用

1.socket中TCP的类和常用方法

(1)服务端使用的ServerSocket类

?(2)socket类

2.使用ServerSocket实现一个简单的客户段与服务端交互

(1)图解思路?

(2)代码实现

(3)运行结果

二.初识TCP协议段

1.认识TCP报头结构

2.TCP的三大特点


一.socketAPI中TCP的使用

1.socket中TCP的类和常用方法

(1)服务端使用的ServerSocket类

常用方法如下:

方法名方法说明
ServerSocket(int port)?创建绑定到指定端口的服务器套接字
ServerSocket(int port, int backlog)
?创建服务器套接字并将其绑定到指定的本地端口号,并指定了积压。
Socket accept()?侦听要连接到此套接字并接受它
bind(SocketAddress endpoint)?
将ServerSocket绑定到特定地址(IP地址和端口号)
InetAddress getInetAddress()?返回此服务器套接字的本地地址
void close()关闭此套接字
int getLocalPort()?
返回此套接字正在侦听的端口号

注意:在使用TCP协议进行传输的时候,是以字节流进行传输,所以里面会涉及到流的关闭问题。

?(2)socket类

因为serversocket 中accept()相当于从阻塞队列中取一个客户端请求。所以还需要使用socket来配合使用。

方法名方法说明
Socket(InetAddress address, int port)创建流套接字并将其连接到指定IP地址的指定端口号
Socket(String host, int port)创建流套接字并将其连接到指定主机上的指定端口号
void bind(SocketAddress bindpoint)?将套接字绑定到本地地址
void connect(SocketAddress endpoint)?将此套接字连接到服务器
InetAddress getInetAddress()
?返回套接字所连接的地址
InputStream getInputStream()?返回此套接字的输入流

OutputStream getOutputStream()?
返回此套接字的输出流

2.使用ServerSocket实现一个简单的客户段与服务端交互

(1)图解思路?

(2)代码实现

客户端

package javaweb.udptcp2.tcp;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;

public class TCPClient {
    Socket socket = null;
    public TCPClient(String serverIp, int serverPort) throws IOException {
        socket = new Socket(serverIp,serverPort);
    }
    public void start() {
        System.out.println("客户端运行");
        //通过控制台输入请求数据
        Scanner sc = new Scanner(System.in);
        //以字节流进行发送数据,所以使用流进行处理
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
             BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))){
            while (true) {
                String request = sc.nextLine();

                //退出客户端
                if("exit".equals(request)) {
                    break;
                }

                //将请求发送给服务端(以什么格式发送就以什么格式接收(这里包含换行,所以可以使用readLine接收))
                bufferedWriter.write(request+"\n");
                bufferedWriter.flush();

                //接收响应(等待响应的过程中,就阻塞在这里)
                String respons = bufferedReader.readLine();

                //将响应结果输出到控制台
                System.out.println(respons);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    //启动客户端
    public static void main(String[] args) throws IOException {
        TCPClient client = new TCPClient("127.0.0.1", 9090);
        client.start();
    }
}

服务端

package javaweb.udptcp2.tcp;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

//实现简单的翻译单词功能
public class TCPServer {
    ServerSocket serverSocket = null;
    HashMap<String, String> words = new HashMap<>();
    public TCPServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        words.put("cat","猫");
        words.put("dog","狗");
        words.put("fish","鱼");
        words.put("beef","牛肉");
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while (true) {
            //从阻塞队列中取出一个客户端连接
            Socket clientSocket = serverSocket.accept();
            //这里使用另一个线程专门进行数据处理(目的是为了提高效率)
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    processConnection(clientSocket);
                }
            });
            t.start();
        }
    }

    private void processConnection(Socket clientSocket) {
        System.out.printf("[%s:%d] 客户端上线\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());

        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
             BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()))){
            while (true) {
                //获取请求
                String request = bufferedReader.readLine();

                //根据请求计算响应
                String respons = process(request);

                //将响应发送个客户端
                bufferedWriter.write(respons+"\n");
                //使用buffer需要刷新缓冲区
                bufferedWriter.flush();
                System.out.printf("[%s:%d]  request:%s;response:%s\n",clientSocket.getInetAddress().toString(),clientSocket.getPort(),request,respons);
            }

        } catch (IOException e) {
            System.out.printf("[%s:%d]客户端下线\n",clientSocket.getInetAddress().toString(),clientSocket.getPort());
        }
    }

    private String process(String request) {
        if(words.containsKey(request)) {
            return words.get(request);
        }
        return "没有找到";
    }

    public static void main(String[] args) throws IOException {
        TCPServer server = new TCPServer(9090);
        server.start();
    }
}

(3)运行结果

?

二.初识TCP协议段

1.认识TCP报头结构

2.TCP的三大特点

  • 有连接:在传输数据时需要建立连接。
  • 可靠传输:有确认应答机制, 有重传机制; 如果因为网络故障该段无法发到对方, TCP协议层会给应用层返回错误信息。
  • 面向字节流:根据字节进行网络传输数据。
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-02-22 20:59:39  更:2022-02-22 21:01:21 
 
开发: 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 9:34:52-

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