计算机网络编程

计算机网络编程

  • 网络通讯的要素
    • IP和端口号
    • 网络通讯协议
  • 网络编程的目的
    • 直接或间接的通过网络协议与其他计算机实现数据交互,进行通讯
  • 主要问题
    • 如何准确的定位网络上一台或多台主机,定位主机上特定的应用
    • 找到主机后如何可靠高效的进行数据传输

 


 

 

 

 

 TCP/IP协议簇

  • 传输层协议中有两个非常重要的协议
    • 传输层控制协议TCP
    • 用户数据报协议UDP
  • TCP/IP协议:传输控制协议(TCP)和网络互联协议(IP)
    • IP协议是网络层的主要协议,支持网间互联的数据协议
    • TCP/IP协议模型从更实用的角度出发,形成高效的四层体系结构(应用层,传输层,IP层,物理数据链路层)

 

TCP和UDP协议(打电话/发短信)

  • TCP协议
    • 使用前,要先建立TCP连接,形成数据传输通道
    • 传输前,需要进行“三次握手”方式,进行点对点通讯,可靠
    • TCP协议进行通讯的两个应用进程:客户端,服务端
    • 在连接中可以进行大量的数据传输
    • 传输完毕,需要释放已建立的连接,效率低
  • UDP协议
    • 将数据,源,目的封装成数据包,不需要建立连接
    • 每个数据包的大小限制在64k内
    • 发送不需要知道接收方是否准备接收,接收后也不需要确认是否接收成功,不可靠
    • 可以广播发送
    • 数据发送完毕时,不需要释放资源,开销小,速度快

 

 

 

 


 

demo

package com.pw.studydemo.inter;

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author pw
 * @version 1.0
 * @date 2022/7/15 11:26
 */
public class TCPNo1 {

    // 客户端
    @Test
    public void client(){

        OutputStream outputStream = null;
        Socket socket = null;
        /**
         * 网络通讯的要素
         * 1. ip
         * 2. 端口
         *
         * socket = ip + 端口
          */
        try {
            // 创建socket
            // InetAddress.getByName("localhost")对方的ip
            socket = new Socket(InetAddress.getByName("localhost"),10101);

            // 发送
            outputStream = socket.getOutputStream();
            outputStream.write("你好,我是客户端".getBytes());
            outputStream.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(outputStream != null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    // 服务端
    @Test
    public void server(){
        ServerSocket serverSocket = null;
        Socket accept = null;
        InputStream inputStream = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        try {
            // 创建服务端的socket
            serverSocket = new ServerSocket(10101);
            // 表示可以接收来自客户端的socket
            accept = serverSocket.accept();

            inputStream = accept.getInputStream();
            // 可能会有乱码(中文时)
//            byte[] bytes = new byte[1024];
//            int len ;
//            while ((len = inputStream.read(bytes)) != -1){
//                System.out.println(new String(bytes,0,len));
//            }

            byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] bytes = new byte[2];
            int len;
            while ((len = inputStream.read(bytes)) != -1){
                // 上面read到byte中后,直接写到byteArrayInputStream中,内部其实是个数组,会自动扩容
                byteArrayOutputStream.write(bytes,0,len);
            }

            System.out.println(byteArrayOutputStream.toString());
            System.out.println("客户端的ip"+accept.getInetAddress().getHostAddress());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if(byteArrayOutputStream != null){
                try {
                    byteArrayOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(inputStream != null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(accept != null){
                try {
                    accept.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(serverSocket != null){
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public void close(Closeable closeable){
        if(closeable != null){
            try {
                closeable.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

 

posted @ 2022-07-15 14:40  潘小伟  阅读(150)  评论(0编辑  收藏  举报