TCP协议与TCP通信

1 TCP协议

TCP协议是面向连接的通信协议,即在传输数据前先在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。

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

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

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

下载文件时必须采用TCP协议。

2 TCP通信

TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象。

在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。

2.1 ServerSocket

ServerSocket的构造方法:

ServerSocket的常用方法:

ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。

2.2 Socket

在Socket类的常用方法中,getInputStream()和getOutStream()方法分别用于获取输入流和输出流。当客户端和服务端建立连接后,数据是以IO流的形式进行交互的,从而实现通信。

2.3 简单的TCP网络程序

要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序。

服务器端:

//TCP服务器端
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1.创建服务器套接字对象
        ServerSocket server=new ServerSocket(8888);
        //2.调用accept方法,创建连接,获取客户端的套接字对象Socket
        Socket socket=server.accept();
        //3.从客户端套接字对象中获取字节输入流
        InputStream in=socket.getInputStream();
        byte[] bytes=new byte[1024];
        int len=in.read(bytes);
        System.out.println(new String(bytes,0,len));
        String ip=socket.getInetAddress().getHostAddress();
        System.out.println("来自此ip地址:"+ip);
        //发送给客户端一个响应(回复)
        //获取字节输出流
        OutputStream out=socket.getOutputStream();
        Scanner sc=new Scanner(System.in);
        String str=sc.next();
        out.write(str.getBytes());
        //4.释放资源
        server.close();
    }
}

客户端:

//TCP客户端
public class TCPClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //1.创建Socket对象,连接服务器
        Socket socket=new Socket("192.168.1.147",8888);
        //2.通过客户端Socket对象中的方法,获取字节输出流,将数据写向服务器
        OutputStream out=socket.getOutputStream();
        //3.写数据
        Scanner sc=new Scanner(System.in);
        String str=sc.next();
        out.write(str.getBytes());
        //接收服务器端的响应
        //获取字节输入流
        InputStream in=socket.getInputStream();
        byte[] bytes=new byte[1024];
        int len=in.read(bytes);
        System.out.println(new String(bytes,0,len));
        //4.释放资源
        socket.close();
    }
}

2.4 文件的上传案例

服务器端:

//服务器端
public class TCPServer {
    public static void main(String[] args) throws IOException {
        //1.创建服务器套接字,绑定端口号
        ServerSocket server=new ServerSocket(8888);
        //2.调用accept方法,与客户端创建连接,获取客户端套接字对象
        Socket socket=server.accept();
        //3.获取字节输入流,明确数据源
        InputStream in=socket.getInputStream();
        //4.明确目的地
        File file=new File("D:\\upload");
        //判定该文件夹是否存在,不存在则创建
        if(!file.exists()){
            file.mkdirs();
        }
        //域名+毫秒值+六位随机数
        String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(999999)+".png";
        FileOutputStream fos=new FileOutputStream(file+File.separator+filename);
        //开始复制
        byte[] bytes=new byte[1024];
        int len=0;
        while((len=in.read(bytes))!=-1){
            fos.write(bytes,0,len);
        }
        //给客户端响应(回复)
        //获取字节输出流
        OutputStream out=socket.getOutputStream();
        out.write("上传成功".getBytes());
        //释放资源
        server.close();
        fos.close();
    }
}

客户端:

//客户端
public class TCPClient {
    public static void main(String[] args) throws UnknownHostException, IOException {
        //1.创建客户端套接字Socket对象,连接服务器
        Socket socket=new Socket("192.168.1.147",8888);
        //2.通过Socket获取字节输出流
        OutputStream out=socket.getOutputStream();
        //明确数据源
        FileInputStream fis=new FileInputStream("E:\\java\\pp.png");
        //开始复制
        int len=0;
        byte[] bytes=new byte[1024];
        while((len=fis.read(bytes))!=-1){
            out.write(bytes,0,len);
        }
        //告诉服务器端当前字节已经读完,不用等了
        socket.shutdownOutput();
        //接收服务器端的回复
        //获取字节输入流
        InputStream in=socket.getInputStream();
        len=in.read(bytes);
        System.out.println(new String(bytes,0,len));
        //释放资源
        socket.close();
        fis.close();
    }
}

原文地址:https://www.cnblogs.com/zzq123/p/10249864.html

时间: 2024-11-17 03:52:50

TCP协议与TCP通信的相关文章

于TCP协议的socket通信

基于TCP协议Socket服务端和客户端的通信模型: Socket通信步骤: 1.建立服务端ServerSocket和客户端Socket 2.打开连接到Socket的输出输入流 3.按照协议进行读写操作 4.关闭相对应的资源 多线程服务器 多线程用来实现 服务器与多客户端之间的通信 基本步骤 1 服务器创建serverSocket,循环调用accept()等待客户端连接 2 客户端创建一个scoket并请求和服务器端连接 3 服务器端接收客户端请求,创建socket与该客户建立专线连接 4 建立

Android基础入门教程——7.6.3 基于TCP协议的Socket通信(2)

Android基础入门教程--7.6.3 基于TCP协议的Socket通信(2) 标签(空格分隔): Android基础入门教程 本节引言: 上节中我们给大家接触了Socket的一些基本概念以及使用方法,然后写了一个小猪简易聊天室的 Demo,相信大家对Socket有了初步的掌握,本节我们来学习下使用Socket来实现大文件的断点续传! 这里讲解的是别人写好的一个Socket上传大文件的例子,不要求我们自己可以写出来,需要的时候会用 就好! 1.运行效果图: 1.先把我们编写好的Socket服务

Android基础入门教程——7.6.2 基于TCP协议的Socket通信(1)

Android基础入门教程--7.6.2 基于TCP协议的Socket通信(1) 标签(空格分隔): Android基础入门教程 本节引言: 上一节的概念课枯燥无味是吧,不过总有点收获是吧,本节开始我们来研究基于TCP协议的Socket 通信,先来了解下Socket的概念,以及Socket通信的模型,实现Socket的步骤,以及作为Socket服务 端与客户端的两位各做要做什么事情!好的,我们由浅入深来扣这个Socket吧! 1.什么是Socket? 2.Socket通信模型: Socket通信

TCP协议及TCP正常连接与断开

一.TCP协议简介TCP,全称Transfer Control Protocol,中文名为传输控制协议,它工作在OSI的传输层,提供面向连接的可靠传输服务.TCP的工作主要是建立连接,然后从应用层程序中接收数据并进行传输.TCP采用虚电路连接方式进行工作,在发送数据前它需要在发送方和接收方建立一个连接,数据在发送出去后,发送方会等待接收方给出一个确认性的应答,否则发送方将认为此数据丢失,并重新发送此数据.下面我们来介绍一下TCP的报头结构和相关工作原理:1.TCP报头TCP报头总长最小为20个字

浅析C#基于TCP协议的SCOKET通信

TCP协议是一个基本的网络协议,基本上所有的网络服务都是基于TCP协议的,如HTTP,FTP等等,所以要了解网络编程就必须了解基于TCP协议的编程.然而TCP协议是一个庞杂的体系,要彻底的弄清楚它的实现不是一天两天的功夫,所幸的是在.net framework环境下,我们不必要去追究TCP协议底层的实现,一样可以很方便的编写出基于TCP协议进行网络通讯的程序. C#基于TCP协议的网络通讯 要进行C#基于TCP协议的网络通讯,首先必须建立同远程主机的连接,连接地址通常包括两部分--主机名和端口,

基于TCP协议的socket通信

一.服务器端 1.创建serverSocket,即服务器端的socket,绑定指定的端口,并侦听此端口 ServerSocket server = new ServerSocket(8888); 2.调用accept()方法,开始侦听,等待客户端的连接,在未连接成功之前,处于阻塞状态,返回的socket,用于与客户端连接 Socket socket = server.accept(); 3.获取输入流,用来读取客户端发来的信息 InputStream is = socket.getInputSt

利用TCP协议实现通信

Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连接请求的信息,并建立与客户端之间的连接. (3)当完成通信后,服务器关闭与客户端的Socket连接. 客户端的步骤如下. (1)建立客户端的Socket,确定要连接的服务器的主机名和端口. (2)发送连接请求到服务器,并等待服务器的回馈信息. (3)连接成功后,与服务器进行数据的交互. (4)数据处

+++++++++用户空间进程通信、tcp协议基础、http协议基础

网络进程的通信知识 裸套接字.分段.分片.MTU 进程地址.用户空间.内核空间 进程间通信.socket tcp协议 http协议 超文本定义.超文本格式 web资源: 动态 静态 访问入口.被访问的资源 跨站引用/盗链 URI,URL,RUN关系,子集 URL格式 主机地址+进程地址(port) 裸套接字:不调用传输层的tcp,udp协议封装报文 进程地址:用TCP,UDP协议的端口标识,端口(16bits) IANA Internet Assign Number Agent 互联网地址名称分

TCP协议可靠性数据传输实现原理分析

http://blog.csdn.net/chexlong/article/details/6123087 TCP 协议是一种面向连接的,为不同主机进程间提供可靠数据传输的协议.TCP 协议假定其所使用的网络栈下层协议(如IP 协议)是非可靠的,其自身提供机制保证数据的可靠性传输.在目前的网络栈协议族中,在需要提供可靠性数据传输的应用中,TCP 协议是首选的,有时也是唯一的选择.TCP 协议是在最早由Cerf 和Kahn[1]所提出的有关网络数据包传输协议的概念之上建立的.TCP 协议被设计成符