Socket网络编程进阶与实战(二)

什么是网络编程

  • 什么是网络,计算机网络的构成是什么?
    网络是信息传输、接收、共享的虚拟平台
    什么是网络编程?

Socket 与TCP/UDP

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

客户端实例

import java.io.*;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket();

        // 超时时间
        socket.setSoTimeout(3000);

        // 连接本地,端口200,超时时间3000ms
        socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(),2000),3000);

        System.out.println("已发起服务器连接,并进入后续流程~~");
        System.out.println("客户端信息 "+ socket.getLocalAddress()+" Port: "+socket.getLocalPort());
        System.out.println("服务器信息 "+ socket.getInetAddress()+" Port: "+ socket.getPort());

        try {
            // 发送 接收 数据
            todo(socket);
        }catch (Exception e){
            System.out.println("客户端连接异常关闭");
        }

        // 释放资源
        socket.close();
        System.out.println("客户端已退出");
    }

    private static void todo(Socket client) throws IOException{

        // 构建键盘输入流
        InputStream in =System.in;
        BufferedReader input = new BufferedReader(new InputStreamReader(in));

        //得到socket输出流,并转换为打印流
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream = new PrintStream(outputStream);

        // 得到Socket输入流,并转换为BufferReader
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBufferReader = new BufferedReader(new InputStreamReader(inputStream));

        boolean flag = true;
        do {
            // 键盘读取一行
            String str = input.readLine();
            // 发送数据到服务器
            socketPrintStream.println(str);
            // 从服务器读取一行
            String echo = socketBufferReader.readLine();
            if ("bye".equalsIgnoreCase(echo)){
                flag = false;
            }else {
                System.out.println(echo);
            }

        }while (flag);

        socketPrintStream.close();
        socketBufferReader.close();

    }

}

服务端实例

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {

        ServerSocket server = new ServerSocket(2000);
        System.out.println("服务器准备就绪~~");
        System.out.println("服务器信息 "+ server.getInetAddress()+" Port: "+ server.getLocalPort());

        // 等待客户端连接
       for (;;){
           // 得到客户端
           Socket client = server.accept();
           // 客户端构建异步线程
           // 异步操作, 多个客户端连接的情况
           ClientHandler clientHandler = new ClientHandler(client);
           // 启动线程
           clientHandler.start();
       }

    }

    /**
     * 客户端消息的处理
     */
    private static class ClientHandler extends Thread{
        private Socket socket;
        private boolean flag =  true;
        ClientHandler(Socket socket){
            this.socket = socket;
        }
        @Override
        public void run() {
            System.out.println("新客户端连接: "+socket.getInetAddress()+"Port: "+socket.getPort());
            try {
                // 得到打印流,用于数据输出;服务器回送数据
                PrintStream socketOutput = new PrintStream(socket.getOutputStream());
                // 得到输入流,用于接收数据
                BufferedReader socketInput = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
                do {
                    // 客户端拿到一条数据
                    String str = socketInput.readLine();
                    if ("bye".equalsIgnoreCase(str)){
                        flag = false;
                        // 回送
                        socketOutput.println("bye");
                    }else {
                        // 打印到屏幕,并回送数据长度
                        System.out.println(str);
                        socketOutput.println("send back: "+str.length());

                    }
                    socketOutput.println("send back test ");
                }while (flag);
                socketInput.close();
                socketOutput.close();

            }catch (Exception e){
                System.out.println("服务端连接异常断开");
            }finally {
                // 连接关闭
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("客户端已退出"+socket.getInetAddress()+"Port: "+socket.getPort());
        }
    }

}

报文、 协议、MAC地址

报文段

报文段是指TCP/IP协议网络传输过程中,起着路由导航作用
在这里插入图片描述
在这里插入图片描述

传输协议

在这里插入图片描述

MAC地址

在这里插入图片描述

IP、端口、远程服务器

IP地址

在这里插入图片描述

IPV4

在这里插入图片描述
在这里插入图片描述

IPV6

在这里插入图片描述
在这里插入图片描述

端口

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

远程服务器

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值