java网络编程之TCP/IP连接

Posted 飞飞吻

tags:

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

1. 百度知识科普:
TCP/IP是为了在互联网实现通信传输,以及为了能够实现在互联网上共享彼此资源所规定的一种通信协议。
TCP/IP 通信协议是对计算机必须遵守的规则的描述,只有遵守这些规则,计算机之间才能进行通信。就比如生活中对于 “一斤是500克,而不是800克” 的重量计数单位约定,是为了方便彼此而建立的一种约定。

从上图TCP/IP四层模型中可以看到,TCP是位于传输层,IP则在于网络层。
而客户端要实现与服务器端进行通信连接,则需要引申出TCP的三次握手。其实还有改进后的TCP四次挥手(分手),就像TCP/IP四层模型是从OSI七层网络模型中改良进来的。

--

也可以这样理解为是两个人见面时的交流:

  A:你瞅啥
  B:瞅你咋滴
  A:来,咋俩来唠唠

TCP三次握手:是客户端与服务器端进行的三次互相确认通信,是为了确定对方收到了进行连接的信号,才进行彼此的通信。
只有当双方两个人每次都听到了对方的话,并给出了回应,通信连接才会成功建立。如果当B听到A说的 你瞅啥 ,但不理会,则连接也不会建立。

下面为模仿服务器与客户端进行通信的程序代码:

2. 模仿服务器端程序代码:

package com.kuang.lesson02;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

//服务端
public class TcpServerDemo01 {
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
//1、首先得有一个地址
serverSocket = new ServerSocket(9999);

        //只要符合条件就一直接收从客户端传过来的信息
        while (true){
            //2、等待客户端的连接过来
            socket = serverSocket.accept();
            //3、读取客户端信息
            is = socket.getInputStream();

        /*
        //一般写法,但如果传过来的信息超过处理范围,则会有隐患
        byte[] buffer = new byte[1024];
        int len;//长度
        while ((len=is.read(buffer)) != -1){
            String msg = new String(buffer,0,len);
            System.out.println(msg);
        }
        */

            //管道流
            baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;//长度
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            System.out.println(baos.toString());
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        //标准写法,在大型项目里面,报了错,这些代码是很救命的
        //优先处理异常
        if (baos != null) {
            try {
                baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (socket != null) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (serverSocket != null) {
            try {
                serverSocket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}  }

3.模仿客户端程序代码:

--
package com.kuang.lesson02;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

//客户端
public class TcpClineDemo01 {
public static void main(String[] args) {

    Socket socket = null;
    OutputStream os = null;

    try {
        //1、知道服务器ip地址和端口号
        InetAddress  serverIp = InetAddress.getByName("127.0.0.1");
        int port = 9999;
        //2、 创建一个socket连接
        socket = new Socket(serverIp, port);
        //3、 发送消息 IO流
        os = socket.getOutputStream();
        os.write("2021/5/4/19:59分学习狂神的网络编程".getBytes());

        os.close();
        socket.close();

    } catch (Exception e) {
        e.printStackTrace();
    }finally {
        //关闭资源
        if (os != null){
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (socket != null){
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}  }

知网上关于TCP/IP的文章链接:

以上是关于java网络编程之TCP/IP连接的主要内容,如果未能解决你的问题,请参考以下文章

基于Socket的低层次Java网络编程

socket编程之----TCP服务器

IO之Socket网络编程

Java网络编程基础-- 基于TCP/IP的Socket编程

网络编程之手把手教你写基于TCP的Socket长连接

Java面试知识点之计算机网络篇