Day28-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\IPDemo\BSDemo+TCP

TCP

image-20251101141106178

image-20251101141216807

image-20251101142337777

package Basic.src.com.IPDemo.TCPDemo.Demo01;

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

public class Client {
    public static void main(String[] args) throws Exception {
        //1.创建一个socket对象,并同时请求与服务端程序连接
        Socket socket = new Socket("127.0.0.1", 8888);//socket管道

        //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3.把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        //4.开始写数据出去
        dos.writeUTF("在一起,好吗?");
        dos.close();//关闭外部包装流会同时关闭内部的流

        //5.关闭管道,释放资源
        socket.close();

    }
}
package Basic.src.com.IPDemo.TCPDemo.Demo01;

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("=============服务端已开启============");
        //1.创建ServerSocket对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(8888);

        //2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
        Socket socket = serverSocket.accept();//启动后在此阻塞等待

        //3.从socket通信管道中获得一个字节输入流
        InputStream is = socket.getInputStream();

        //4.把原始低级的字节输入流包装成数据输入流
        DataInputStream dis = new DataInputStream(is);

        //5.使用数据输入流读取客户端数据
        String rs = dis.readUTF();//第二次阻塞等待
        System.out.println(rs);
        //其实我们也可以获取客户端的ip地址
        System.out.println(socket.getRemoteSocketAddress());

        dis.close();
        socket.close();
        //serverSocket.close();

    }
}

多发多收

package Basic.src.com.IPDemo.TCPDemo.Demo02;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1.创建一个socket对象,并同时请求与服务端程序连接
        Socket socket = new Socket("127.0.0.1", 8888);//socket管道

        //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3.把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        //让用户输入消息
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();

            //一旦用户输入了"exit",就退出客户端程序
            if (msg.equals("exit")) {
                System.out.println("欢迎您下次光临,退出成功!");
                dos.close();
                socket.close();
                break;
            }
            //4.开始写数据出去
            dos.writeUTF(msg);
            dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端
        }
//        dos.close();//关闭外部包装流会同时关闭内部的流
//
//        //5.关闭管道,释放资源
//        socket.close();
    }
}
package Basic.src.com.IPDemo.TCPDemo.Demo02;

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

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("=============服务端已开启============");
        //1.创建ServerSocket对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(8888);

        //2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
        Socket socket = serverSocket.accept();//启动后在此阻塞等待

        //3.从socket通信管道中获得一个字节输入流
        InputStream is = socket.getInputStream();

        //4.把原始低级的字节输入流包装成数据输入流
        DataInputStream dis = new DataInputStream(is);

        while (true) {
            try {
                //5.使用数据输入流读取客户端数据
                String rs = dis.readUTF();//第二次阻塞等待
                System.out.println(rs);
                //其实我们也可以获取客户端的ip地址
                System.out.println(socket.getRemoteSocketAddress());
            } catch (IOException e) {
                System.out.println(socket.getRemoteSocketAddress()+"离线了");
                dis.close();
                socket.close();
                break;
            }
        }

//        dis.close();
//        socket.close();
        //serverSocket.close();

    }
}

多客户端通信:引入多线程

image-20251101151130776

package Basic.src.com.IPDemo.TCPDemo.Demo03;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1.创建一个socket对象,并同时请求与服务端程序连接
        Socket socket = new Socket("127.0.0.1", 8888);//socket管道

        //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3.把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        //让用户输入消息
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();

            //一旦用户输入了"exit",就退出客户端程序
            if (msg.equals("exit")) {
                System.out.println("欢迎您下次光临,退出成功!");
                dos.close();
                socket.close();
                break;
            }
            //4.开始写数据出去
            dos.writeUTF(msg);
            dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端
        }
    }
}

多线程设置

package Basic.src.com.IPDemo.TCPDemo.Demo03;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ServerReaderThread1 extends Thread {
    private Socket socket;

    public ServerReaderThread1(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while (true) {
                String msg = null;
                try {
                    msg = dis.readUTF();
                } catch (Exception e) {
                    System.out.println("有人下线了:"+socket.getRemoteSocketAddress());
                    dis.close();
                    socket.close();
                    break;
                }
                System.out.println(msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

即时通信

群聊

image-20251101160619761

package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception {
        //1.创建一个socket对象,并同时请求与服务端程序连接
        Socket socket = new Socket("127.0.0.1", 8888);//socket管道
        //TCP 的三次握手完成后,程序才会执行 Socket socket = new Socket("127.0.0.1", 8888); 之后的代码。
        //三次握手:
        //客户端发送 SYN 包(请求连接);
        //服务端回复 SYN+ACK 包(同意连接);
        //客户端回复 ACK 包(确认连接)。

        //创建一个独立线程,负责随机从socket中接收服务端发过来的信息
        new ClentReaderThread(socket).start();

        //2.从socket通信管道中得到一个字节输出流,用来发数据给服务端程序
        OutputStream os = socket.getOutputStream();

        //3.把低级的字节输出流包装成数据输出流
        DataOutputStream dos = new DataOutputStream(os);

        //让用户输入消息
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();

            //一旦用户输入了"exit",就退出客户端程序
            if (msg.equals("exit")) {
                System.out.println("欢迎您下次光临,退出成功!");
                dos.close();
                socket.close();
                break;
            }
            //4.开始写数据出去
            dos.writeUTF(msg);
            dos.flush();//刷新出去,防止数据还在客户端的内存中:立即发生给服务端
        }
    }
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;

import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;

public class ClentReaderThread extends Thread{
    private Socket socket;
    public ClentReaderThread(Socket socket){
        this.socket = socket;
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while (true) {//循环接收信号
                try {
                    String msg = dis.readUTF();
                    System.out.println(msg);
                    //把这个消息分发给全部客户端接收,包括自己
                    //sentMsgToAll(msg);
                } catch (Exception e) {
                    System.out.println("自己下线了:"+socket.getRemoteSocketAddress());
                    //Server.onlinesockets.remove(socket);
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;

import Basic.src.com.IPDemo.TCPDemo.Demo03.ServerReaderThread;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public class Server {
    public static List<Socket> onlinesockets = new CopyOnWriteArrayList<Socket>();
    public static void main(String[] args) throws IOException {
        System.out.println("=============服务端已开启============");
        //1.创建ServerSocket对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //Socket socket = new Socket("127.0.0.1", 8888);

        while (true) {//循环启动线程
            //2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
            Socket socket = serverSocket.accept();//启动后在此阻塞等待
            //Socket socket =  new ServerSocket(8888).accept();//启动后在此阻塞等待

            //追踪客户端上线
            onlinesockets.add(socket);//存入管道
            System.out.println("有人上线了"+socket.getRemoteSocketAddress());

            //3.把这个客户端对应的socket的通信管道交给一个独立的线程负责处理
            new ServerReadThreads(socket).start();
        }
    }
}
package Basic.src.com.IPDemo.TCPDemo.Demo04Forward;

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

public class ServerReadThreads extends Thread {
    private Socket socket;
    public ServerReadThreads(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        System.out.println("转发程序启动:"+socket.getRemoteSocketAddress());
        try {
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while (true) {//循环接收信号
                try {
                    String msg = dis.readUTF();
                    System.out.println(msg);
                    //把这个消息分发给全部客户端接收,包括自己
                    sentMsgToAll(msg);
                } catch (Exception e) {
                    System.out.println("有人下线了:"+socket.getRemoteSocketAddress());
                    Server.onlinesockets.remove(socket);
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private void sentMsgToAll(String msg)  throws Exception{
        //发送给全部在线的socket接收
        for (Socket onlinesocket : Server.onlinesockets){
            System.out.println("开始转发消息,在线客户端数:" + Server.onlinesockets.size());
            OutputStream os = onlinesocket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

BS

http协议: http://服务器IP:服务器端口

比如:http://127.0.0.1:8080

image-20251101175335466

image-20251101175540321

package Basic.src.com.IPDemo.BSDemo;

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

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("=============服务端已开启============");
        //1.创建ServerSocket对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(8080);

        while (true) {
            //2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
            Socket socket = serverSocket.accept();

            System.out.println("有人上线了:"+socket.getRemoteSocketAddress());

            new ServerReaderThread(socket).start();

        }
    }
}
package Basic.src.com.IPDemo.BSDemo;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

public class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        //立即响应一个网页内容:“黑马程序员”给浏览器展示
        OutputStream os = null;
        try {
            os = socket.getOutputStream();
            PrintStream ps = new PrintStream(os);
            ps.println("HTTP/1.1 200 OK");
            ps.println("Content-Type: text/html; charset=UTF-8");
            ps.println();
            ps.println("<div style='color:red;font-size:140px;text-align:center;font-family:Arial'>密码的666<div style");
            ps.close();

            ps.close();
            socket.close();//网页响应是短连接
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

image-20251101181058275

package Basic.src.com.IPDemo.BSDemo;

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

public class Server {
    public static void main(String[] args) throws Exception {
        System.out.println("=============服务端已开启============");
        //1.创建ServerSocket对象,同时为服务端注册端口
        ServerSocket serverSocket = new ServerSocket(8080);

        while (true) {
            //2.使用ServerSocket对象,调用一个accept方法,等待客户端的连接请求
            Socket socket = serverSocket.accept();

            System.out.println("有人上线了:"+socket.getRemoteSocketAddress());

            new ServerReaderThread(socket).start();

        }
    }
}
package Basic.src.com.IPDemo.BSDemo;

import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;

public class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }
    @Override
    public void run() {
        //立即响应一个网页内容:“黑马程序员”给浏览器展示
        OutputStream os = null;
        try {
            os = socket.getOutputStream();
            PrintStream ps = new PrintStream(os);
            ps.println("HTTP/1.1 200 OK");
            ps.println("Content-Type: text/html; charset=UTF-8");
            ps.println();
            ps.println("<div style='color:red;font-size:140px;text-align:center;font-family:Arial'>密码的666<div style");
            ps.close();

            ps.close();
            socket.close();//网页响应是短连接
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
posted @ 2025-11-01 20:42  David大胃  阅读(9)  评论(0)    收藏  举报