网络通信与TCP

Posted 超霸霸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络通信与TCP相关的知识,希望对你有一定的参考价值。

网络通信与TCP

一、计算机之间如何精确的连接?

  • ip地址

    计算机通过ip地址找到对方的计算机,每台计算机的ip地址都是独一无二的

  • 端口号

    • 端口号是一个逻辑端口,我们无法直接看到,可以使用一些软件查看端口号

    • 当我们使用网络软件一打开,那么操作系统就会为网络软件分配一个随机的端口号,或者网络软件在打开的时候和系统要指定的端口号

    • 端口号由两个字节组成,取值范围在0-65535之间

    • 1024之前的端口号我们不能使用,已经被系统分配给已知的网络软件了

    • 网络软件的端口号不能重复使用

    • 常用的端口号:

      网络端口:80端口

      数据库mysql:3306

      oracle:1521

      Tomcat服务器:8080

二、TCP通信概述

  • TCP通信能实现两台计算机之间的数据交互,通信的两端要严格区分为客户端(Client)和服务端(Server)

  • 两端通信的步骤:

    1. 服务器程序启动,等待客户端连接
    2. 客户端主动连接服务器端,建立一个逻辑连接

    注意:

    • 这个连接包含一个IO对象,客户端和服务端使用IO对象进行通信
    • 通信的数据不仅仅是字符,所以IO对象是字节流对象
    • 客户端和服务端进行一个数据交互需要4个IO流对象
  • 在Java中提供了两个类用于实现TCP通信程序:

    1. 客户端:java.net.Socket类表示创建Socket对象,向服务端发出连接请求,服务端响应请求,两者建立连接开始通信
    2. 服务端:java.net.ServerSocket类表示创建ServerSocket对象,相当于开启一个服务器,并等待客户的连接

三、Socket类

  • 该类实现客户端套接字,套接字指的是两台设备之间通信的端点
  • 构造器:

  • Socket类的方法:

  • 创建一个Socket对象:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TCPClient {
    public static void main(String[] args) throws IOException {
        //1.创建一个客户端对象Socket,构造方法绑定服务器IP地址和端口号
        Socket socket = new Socket("10.159.55.7", 8888);
        //2.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream os = socket.getOutputStream();
        //3.使用网络字节输出流OutputStream对象中的方法write向服务器发送数据
        os.write("你好服务器".getBytes());
        //4.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
        InputStream is = socket.getInputStream();
        //5.使用网络字节输入流InputStream对象中的方法read读取服务器回写的数据
        byte[] bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes, 0, len));
        //6.释放资源
        socket.close();
    }
}

四、ServerSocket类

  • 服务器必须明确一件事,必须知道是哪个客户端请求的服务器,所以可以使用accept方法获取到请求的客户端对象Socket。成员方法:Socket accept() 侦听并接受到此套接字的连接

  • 构造方法:

  • ServerSocket类的方法:

  • 创建一个ServerSocket对象:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1.创建服务器ServerSocket对象和系统要指定的端口号
        ServerSocket server=new ServerSocket(8888);
        //2.使用ServerSocket对象中的方法accept获取到请求的客户端对象Socket
        Socket socket=server.accept();
        //3.使用Socket对象中的方法getInputStream()获取网络字节输入流InputStream对象
        InputStream is=socket.getInputStream();
        //4.使用网络字节输入流InputStream对象中的方法read读取客户端发送的数据
        byte[] bytes=new byte[1024];
        int len=is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //5.使用Socket对象中的方法getOutputStream()获取网络字节输出流OutputStream对象
        OutputStream os=socket.getOutputStream();
        //6.使用网络字节输出流OutputStream对象中的write方法给客户端回写数据
        os.write("收到".getBytes());
        //7.释放资源
        socket.close();
        server.close();
    }
}

运行:

【注意】:先运行服务器端程序,再运行客户端程序

以上是关于网络通信与TCP的主要内容,如果未能解决你的问题,请参考以下文章

201555332盛照宗—网络对抗实验1—逆向与bof基础

Python 之 Socket编程(TCP/UDP)

与 viewpager 内的片段的父片段通信

通过 PuTTY 与 TCP 服务器通信

TCP案例代码

TCP案例代码