javase复习day33网络编程

news2024/11/15 21:57:48

网络编程

常见的软件架构

BS架构

CS架构

网络编程小结

网络编程三要素

三要素小结

IP

IPV4

IPV6

IP小结

IPV4的地址分类形式

常用的CMD命令

小结

InetAddress的使用
public class Demo1 {
    public static void main(String[] args) throws UnknownHostException {
        //获取IP对象
        /**
         * 通过InetAddress.getByName方法获取到InetAddress对象
         * 方法的形参可以是主机名,也可以是IP地址
         */
        InetAddress byName = InetAddress.getByName("DESKTOP-0MCCNFM");
        System.out.println(byName);

        //获取到该对象的主机名,如果该主句无法链接,将返回该对象的IP地址
        String hostName = byName.getHostName();
        System.out.println(hostName);

        //获取该对象的IP地址
        String hostAddress = byName.getHostAddress();
        System.out.println(hostAddress);
    }
}

端口号

协议

UDP协议
UDP发送
public class udpSendDemo {
    public static void main(String[] args) throws IOException {
        //创建一个链接对象
        /**
         * DatagramSocket的参数是指定端口号,如果为无参构造则表示随机一个端口号
         */
        DatagramSocket ds = new DatagramSocket();

        //创建一个对象用来打包数据
        //创建一个字符数组用来保存要传输的数据
        /**
         * 参数一:保存数据的字符数组
         * 参数二:字符数组传输的开始位置(可不输入,表述从头开始)
         * 参数三:字符数组传输的长度
         * 参数四:目标设备的地址(IP)
         * 参数五:目标设备的接受端口
         */
        String str = "你好,万维";
        byte[] bytes = str.getBytes();
        //目标设备的地址(本地环回地址)
        InetAddress byName = InetAddress.getByName("127.0.0.1");
        //目标设备的接收端口
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,byName,port);
        //使用DatagramSocket对象发送DatagramPacket对象(数据包)
        ds.send(dp);

        //释放资源
        ds.close();
    }
}
UDP接收

public class udpresurt {
    public static void main(String[] args) throws IOException {
        /**
         * 接收数据
         */
        //接收数据要创建DatagramSocket对象
        //DatagramSocket对象必须要指定端口号,且端口号应该和发送端发送的端口号相同
        DatagramSocket ds = new DatagramSocket(10086);

        //创建字符数组用于存储接受到的数据
        byte[] arr = new byte[1024];
        //接收数据只需要将字符数组存入即可
        DatagramPacket dp = new DatagramPacket(arr,arr.length);

        /**
         * 该方法用于接受数据
         * 该方法是阻塞的
         * 即只用该方法获取到传输的数据时才会向下执行
         */
        ds.receive(dp);

        //解析数据
        //写入的数据
        byte[] data = dp.getData();
        //发送数据的设备的地址
        InetAddress address = dp.getAddress();
        //发送端要发送的真实数据的数据的长度
        int length = dp.getLength();
        //发送端的端口号
        int port = dp.getPort();
        //new String(data,0,length)表示将data字符数组中的数据从0开始到length转为字符串,即将发送端要传输的字符串转换出来
        //data中的其他字符串转换会出现乱码
        System.out.println(new String(data,0,length));
        System.out.println(length);
        System.out.println(address);
        System.out.println(port);

        /**
         * 你好,万维
         * 15
         * /127.0.0.1
         * 55623
         */

        //关闭资源
        ds.close();

    }
}
练习:聊天室

public class udpSendTest {
    public static void main(String[] args) throws IOException {
        //创建一个链接对象
        /**
         * DatagramSocket的参数是指定端口号,如果为无参构造则表示随机一个端口号
         */
        DatagramSocket ds = new DatagramSocket();

        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入要说的话");
            String str = sc.nextLine();
            if (str.equals("886")){
                break;
            }
            byte[] bytes = str.getBytes();
            //目标设备的地址(本地环回地址)
            InetAddress byName = InetAddress.getByName("127.0.0.1");
            //目标设备的接收端口
            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bytes,bytes.length,byName,port);
            //使用DatagramSocket对象发送DatagramPacket对象(数据包)
            ds.send(dp);
        }

        //释放资源
        ds.close();
    }
}
public class udpresurtTest {
    public static void main(String[] args) throws IOException {
        /**
         * 接收数据
         */
        //接收数据要创建DatagramSocket对象
        //DatagramSocket对象必须要指定端口号,且端口号应该和发送端发送的端口号相同
        DatagramSocket ds = new DatagramSocket(10086);

        //创建字符数组用于存储接受到的数据
        byte[] arr = new byte[1024];
        //接收数据只需要将字符数组存入即可
        DatagramPacket dp = new DatagramPacket(arr,arr.length);

        /**
         * 该方法用于接受数据
         * 该方法是阻塞的
         * 即只用该方法获取到传输的数据时才会向下执行
         */
        while (true) {
            ds.receive(dp);

            //解析数据
            //写入的数据
            byte[] data = dp.getData();
            //发送数据的设备的地址
            InetAddress address = dp.getAddress();
            String hostAddress = address.getHostAddress();
            String hostName = address.getHostName();
            //发送端要发送的真实数据的数据的长度
            int length = dp.getLength();
            //发送端的端口号
            int port = dp.getPort();

            String s = new String(data,0,length);
            //new String(data,0,length)表示将data字符数组中的数据从0开始到length转为字符串,即将发送端要传输的字符串转换出来
            //data中的其他字符串转换会出现乱码
            System.out.println("ip为:"+hostAddress+" 主机名为:"+hostName+" 的人发来了话:"+s);
        }



        //关闭资源
//        ds.close();

    }
}
UDP的三种通讯方式

组播
public class udpresurt {
    public static void main(String[] args) throws IOException {
        /**
         * 接收数据
         */
        //接收数据要创建MulticastSocket对象,用于组播
        //MulticastSocket对象必须要指定端口号,且端口号应该和发送端发送的端口号相同
        MulticastSocket ds = new MulticastSocket(10086);

        //将主机添加到224.0.0.1的这一组中
        InetAddress byName = InetAddress.getByName("224.0.0.1");
        ds.joinGroup(byName);

        //创建字符数组用于存储接受到的数据
        byte[] arr = new byte[1024];
        //接收数据只需要将字符数组存入即可
        DatagramPacket dp = new DatagramPacket(arr,arr.length);


        /**
         * 该方法用于接受数据
         * 该方法是阻塞的
         * 即只用该方法获取到传输的数据时才会向下执行
         */
        ds.receive(dp);

        //解析数据
        //写入的数据
        byte[] data = dp.getData();
        //发送数据的设备的地址
        InetAddress address = dp.getAddress();
        //发送端要发送的真实数据的数据的长度
        int length = dp.getLength();
        //发送端的端口号
        int port = dp.getPort();
        //new String(data,0,length)表示将data字符数组中的数据从0开始到length转为字符串,即将发送端要传输的字符串转换出来
        //data中的其他字符串转换会出现乱码
        System.out.println(new String(data,0,length));
        System.out.println(length);
        System.out.println(address);
        System.out.println(port);


        //关闭资源
        ds.close();

    }
}
public class udpSendDemo {
    public static void main(String[] args) throws IOException {
        //创建一个链接对象
        /**
         * DatagramSocket的参数是指定端口号,如果为无参构造则表示随机一个端口号
         */
        MulticastSocket ds = new MulticastSocket();


        //创建一个对象用来打包数据
        //创建一个字符数组用来保存要传输的数据
        /**
         * 参数一:保存数据的字符数组
         * 参数二:字符数组传输的开始位置(可不输入,表述从头开始)
         * 参数三:字符数组传输的长度
         * 参数四:目标设备的地址(IP)
         * 参数五:目标设备的接受端口
         */
        String str = "你好,万维";
        byte[] bytes = str.getBytes();
        //目标设备的地址(本地环回地址)
        InetAddress byName = InetAddress.getByName("224.0.0.1");
        //目标设备的接收端口
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,byName,port);
        //使用DatagramSocket对象发送DatagramPacket对象(数据包)
        ds.send(dp);

        //释放资源
        ds.close();
    }
}

广播(只需要单播,将IP改为255.255.255.255)

public class udpSendDemo2 {
    public static void main(String[] args) throws IOException {
        //创建一个链接对象
        /**
         * DatagramSocket的参数是指定端口号,如果为无参构造则表示随机一个端口号
         */
        DatagramSocket ds = new DatagramSocket();


        //创建一个对象用来打包数据
        //创建一个字符数组用来保存要传输的数据
        /**
         * 参数一:保存数据的字符数组
         * 参数二:字符数组传输的开始位置(可不输入,表述从头开始)
         * 参数三:字符数组传输的长度
         * 参数四:目标设备的地址(IP)
         * 参数五:目标设备的接受端口
         */
        String str = "你好,万维";
        byte[] bytes = str.getBytes();
        //目标设备的地址(本地环回地址)
        InetAddress byName = InetAddress.getByName("255.255.255.255");
        //目标设备的接收端口
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length,byName,port);
        //使用DatagramSocket对象发送DatagramPacket对象(数据包)
        ds.send(dp);

        //释放资源
        ds.close();
    }
}
TCP

public class ClientDemo {
    public static void main(String[] args) throws IOException {
        //客户端,发送数据
        //"127.0.0.1",指定服务器地址和端口号
        Socket s = new Socket("127.0.0.1",10001);

        //通过s.getOutputStream();方法获取到输出流,写出数据
        OutputStream os = s.getOutputStream();
        //目前传输中文会报错
//        os.write("你好你好".getBytes());
        os.write("halloword".getBytes());

        //关闭资源
        os.close();
        s.close();
    }
}
public class SocketDemo {
    public static void main(String[] args) throws IOException {
        //服务端的接收对象,要指定客户端的访问端口
        ServerSocket ss = new ServerSocket(10001);

        //用于监听客户端连接,一旦有链接则继续执行
        Socket socket = ss.accept();

        InputStream inputStream = socket.getInputStream();

        int ch;
        while ((ch = inputStream.read())!= -1){
            System.out.println((char) ch);
        }

        //关闭资源
        inputStream.close();
        socket.close();
        ss.close();
    }
}
中文乱码的解决

将接收流使用转换流包装,客户端不需要更改

public class SocketDemo {
    public static void main(String[] args) throws IOException {
        //服务端的接收对象,要指定客户端的访问端口
        ServerSocket ss = new ServerSocket(10001);

        //用于监听客户端连接,一旦有链接则继续执行
        Socket socket = ss.accept();

        InputStream is = socket.getInputStream();
        //InputStreamReader包装InputStream可以避免乱码
        InputStreamReader isr = new InputStreamReader(is);
        //提高效率
        BufferedReader br = new BufferedReader(isr);
        int ch;
        while ((ch = br.read())!= -1){
            System.out.println((char) ch);
        }

        //关闭资源
        br.close();
        socket.close();
        ss.close();
    }
}
三次握手,四次挥手

综合练习

练习一:多发多收

public class udpsend {
    public static void main(String[] args) throws IOException {
        //udp发送
        DatagramSocket ds = new DatagramSocket();


        Scanner sc  = new Scanner(System.in);
        while (true){
            System.out.println("请输入数据");
            String s = sc.nextLine();
            if (s.equals("886")){
                break;
            }
            byte[] bytes = s.getBytes();
            InetAddress address = InetAddress.getByName("127.0.0.1");
            DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length,address,10000);

            ds.send(dp);
        }
        ds.close();
    }
}

public class udpresure {
    public static void main(String[] args) throws IOException {
        //UDP接受
        DatagramSocket ds = new DatagramSocket(10000);

        byte[] bytes = new byte[1024];

        DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length);

        while (true) {
            ds.receive(dp);
            //解析数据
            InetAddress address = dp.getAddress();
            int port = dp.getPort();
            int len = dp.getLength();
            byte[] data = dp.getData();
            String s = new String(data, 0, len);
            System.out.println("ip为:"+address.getHostAddress()+"主机名为"+address.getHostName()+"发来了消息:"+s);
        }
    }
}

练习二:接收和反馈

public class udpresure {
    public static void main(String[] args) throws IOException {
        //UDP服务端
        DatagramSocket ds = new DatagramSocket(10000);

        byte[] bytes = new byte[1024];

        DatagramPacket dp = new DatagramPacket(bytes, 0, bytes.length);

        //接收数据
        ds.receive(dp);
        //解析数据
        InetAddress address = dp.getAddress();
        int port = dp.getPort();
        int len = dp.getLength();
        byte[] data = dp.getData();
        String s = new String(data, 0, len);
        System.out.println("ip为:" + address.getHostAddress() + "主机名为" + address.getHostName() + "发来了消息:" + s);
        //发送数据发送
        String string = "服务端接收到了请求";
        bytes = string.getBytes();
        DatagramPacket dp2 = new DatagramPacket(bytes, 0, bytes.length, address, port);
        ds.send(dp2);

        ds.close();

    }
}
public class udpsend {
    public static void main(String[] args) throws IOException {
        //udp客户端
        //接收端口是10002
        DatagramSocket ds = new DatagramSocket();


        Scanner sc = new Scanner(System.in);
        //开始发送信息
        System.out.println("请输入数据");
        String s = sc.nextLine();
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("127.0.0.1");
        DatagramPacket dp = new DatagramPacket(bytes, 0, bytes.length, address, 10000);

        ds.send(dp);

        //开始接收数据

        ds.receive(dp);
        //解析数据
        InetAddress address2 = dp.getAddress();
        int port = dp.getPort();
        int len = dp.getLength();
        byte[] data = dp.getData();
        String s2 = new String(data, 0, len);
        System.out.println("ip为:" + address2.getHostAddress() + "主机名为" + address2.getHostName() + "发来了消息:" + s2);

        ds.close();
    }
}

练习三:上传文件

public class TcpFileget {
    public static void main(String[] args) throws IOException {
        //使用TCP链接来接受文件
        ServerSocket ss = new ServerSocket(10003);

        Socket s = ss.accept();

        InputStream is = s.getInputStream();



        FileOutputStream fos = new FileOutputStream("D:\\Test\\b.rar");

        byte[] bytes = new byte[1024];
        int ch;
        while ((ch = is.read(bytes))!= -1){
            fos.write(bytes,0,ch);
        }

        //接收完毕给客户端一个反馈
        //获取一个发送流
        OutputStream os = s.getOutputStream();
        String string = "文件接受完毕,上传成功";
        System.out.println(string);
        byte[] bytes1 = string.getBytes();
        os.write(bytes1);

        os.close();
        fos.close();
        is.close();
        s.close();
        ss.close();
    }

}
public class TcpFilesend {
    public static void main(String[] args) throws IOException {
        //使用TCP链接来发送文件
        Socket s = new Socket("127.0.0.1",10003);

        OutputStream os = s.getOutputStream();

        FileInputStream fis = new FileInputStream("C:\\Users\\20724\\Desktop\\代码.rar");

        //接收文件,并通过OS法除去
        byte[] bytes = new byte[1204];
        int ch;
        while ((ch = fis.read(bytes))!= -1){
            os.write(bytes,0,ch);
        }
        //表示文件传输已经结束
        s.shutdownOutput();

        //获取接受流
        InputStream is = s.getInputStream();
        byte[] bytes1 = new byte[1024];
        int c;
        while ((c = is.read(bytes1)) != -1) {
//            StringBuilder sb = new StringBuilder();
            String string = new String(bytes1,0,c);
            System.out.println("服务区传输的数据:"+string);
        }

        is.close();
        fis.close();
        os.close();
        s.close();
    }
}

练习四:文件重名

//只需将接受代码中保存文件的名称的代码进行修改即可

        //解决重名问题可以添加一个UUID
        UUID uuid = UUID.randomUUID();//36a05678-f015-4d47-b641-4598918f2269
        //将UUID中的-去掉
        String s1 = uuid.toString().replaceAll("-", "");


        FileOutputStream fos = new FileOutputStream("D:\\Test\\"+s1+".rar");

练习五:上传文件(多线程)

public class TcpFileget {
    public static void main(String[] args) throws IOException {
        //使用TCP链接来接受文件
        ServerSocket ss = new ServerSocket(10004);
        Socket s = null;
        while (true) {
            s = ss.accept();
            MyThread myThread = new MyThread(s);
            Thread thread = new Thread(myThread);

            thread.start();
        }
    }
}

 

public class MyThread implements Runnable{
    Socket s;

    MyThread(Socket s){
        this.s = s;
    }
    @Override
    public void run() {
            try {
                InputStream is = s.getInputStream();

                //解决重名问题可以添加一个UUID
                UUID uuid = UUID.randomUUID();//36a05678-f015-4d47-b641-4598918f2269
                //将UUID中的-去掉
                String s1 = uuid.toString().replaceAll("-", "");


                FileOutputStream fos = new FileOutputStream("D:\\Test\\"+s1+".rar");

                byte[] bytes = new byte[1024];
                int ch;
                while ((ch = is.read(bytes))!= -1){
                    fos.write(bytes,0,ch);
                }

                //接收完毕给客户端一个反馈
                //获取一个发送流
                OutputStream os = s.getOutputStream();
                String string = "文件接受完毕,上传成功";
                System.out.println(string);
                byte[] bytes1 = string.getBytes();
                os.write(bytes1);
                s.shutdownOutput();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
    }
}
public class TcpFilesend {
    public static void main(String[] args) throws IOException {
        //使用TCP链接来发送文件
        Socket s = new Socket("127.0.0.1",10004);
        OutputStream os = s.getOutputStream();
        FileInputStream fis = new FileInputStream("C:\\Users\\20724\\Desktop\\代码.rar");
        //接收文件,并通过OS法除去
        byte[] bytes = new byte[1204];
        int ch;
        while ((ch = fis.read(bytes))!= -1){
            os.write(bytes,0,ch);
        }
        //表示文件传输已经结束
        s.shutdownOutput();
        //获取接受流
        InputStream is = s.getInputStream();
        byte[] bytes1 = new byte[1024];
        int c;
        while ((c = is.read(bytes1)) != -1) {
//            StringBuilder sb = new StringBuilder();
            String string = new String(bytes1,0,c);
            System.out.println("服务区传输的数据:"+string);
        }
        s.close();
    }
}

练习六:上传文件(线程池优化)

其他代码同上 

public class TcpFilesend {
    public static void main(String[] args) throws IOException {
        //使用TCP链接来发送文件
        Socket s = new Socket("127.0.0.1",10004);
        OutputStream os = s.getOutputStream();
        FileInputStream fis = new FileInputStream("C:\\Users\\20724\\Desktop\\代码.rar");
        //接收文件,并通过OS法除去
        byte[] bytes = new byte[1204];
        int ch;
        while ((ch = fis.read(bytes))!= -1){
            os.write(bytes,0,ch);
        }
        //表示文件传输已经结束
        s.shutdownOutput();
        //获取接受流
        InputStream is = s.getInputStream();
        byte[] bytes1 = new byte[1024];
        int c;
        while ((c = is.read(bytes1)) != -1) {
//            StringBuilder sb = new StringBuilder();
            String string = new String(bytes1,0,c);
            System.out.println("服务区传输的数据:"+string);
        }
        s.close();
    }
}

练习七:(接收浏览器的数据并打印)

public class GetTCP {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10008);
        Socket socket = ss.accept();
        InputStream inputStream = socket.getInputStream();

        InputStreamReader isr = new InputStreamReader(inputStream);
        int a;
        while ((a = isr.read())!= -1){
            System.out.print((char) a);
        }
        isr.close();
        ss.close();
    }
}

练习八:网络编程(大作业)

zhangsan=123
lisi=123
wangwu=123
qwqwq=123
sdsds=1231username
public class Service {
    //用静态记录一登录成功的信息
    static ArrayList<Socket> list = new ArrayList<>();
    //服务器端
    public static void main(String[] args) throws IOException {

        //使用集合存储登录的用户的链接
        HashMap<String,String> userMap = new HashMap<>();
        //获取数据
        FileReader fr = new FileReader("javaday34dzy\\src\\main\\java\\userdata.txt");
        BufferedReader br = new BufferedReader(fr);
        String str;
        while ((str = br.readLine())!= null){
            String[] split = str.split("=");
            userMap.put(split[0],split[1]);
        }
        //获取所有已注册的数据
        ServerSocket ss =  new ServerSocket(10086);//启动服务
        Socket s = null;

        while (true) {

            //创建接受流
            s = ss.accept();
            System.out.println("有客户端来链接");
            //创建线程
            Thread t = new Thread(new serviceThread(s,userMap));
            t.start();
        }
    }
}
public class serviceThread implements Runnable{
    Socket s;
    HashMap<String,String> hashMap;

    public serviceThread(Socket socket, HashMap<String, String> hashMap) {
        this.s = socket;
        this.hashMap = hashMap;
    }

    @Override
    public void run() {
        try {
            //开始接收数据,并对接收的数据进行处理
            InputStream is = s.getInputStream();
            OutputStream os = s.getOutputStream();
            //使用字符缓冲流包装
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));

            //接受第一次传来的等录或注册
            int s1 = br.read();
            System.out.println(s1);
            if (s1=='1'){
                //登录
                userjoin(br, bw);
            }else {
                userresuie(br, bw);
            }


//            //开始接收数据
//            String str;
//            while ((str = br.readLine()) != null){
//                System.out.println(str);
//                //判断数据
//                //将数据拆分
//
//            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    private void userresuie(BufferedReader br, BufferedWriter bw) throws IOException {
        //注册
//        String s1 = br.readLine();
        String s2 = br.readLine();
        System.out.println("正在注册");
        System.out.println("================");
        System.out.println(s2);
        //解析数据
        String[] split = s2.split("&");
        String[] split1 = split[0].split("=");
        String[] split2 = split[1].split("=");
        boolean flag = true;
        //遍历
        Set<String> strings = hashMap.keySet();
        for (String string : strings) {
            if (split1[1].equals(string)){
                flag = false;
                //已经有账号,不可在注册
                bw.write(0);
                //刷新将数据发出
                bw.flush();
                break;
            }
        }
        if (flag){
            //没有账号开始注册
            //整理数据
            String userdata = split1[1]+"="+split2[1];
            FileWriter fw = new FileWriter("javaday34dzy\\src\\main\\java\\userdata.txt",true);
            BufferedWriter bw1 = new BufferedWriter(fw);
            bw1.write(userdata);
            //换行
            bw1.newLine();
            //关闭资源
            bw1.close();
            System.out.println("账号注册成功");
        }
    }

    private void userjoin(BufferedReader br, BufferedWriter bw) throws IOException {
        String s2 = br.readLine();
        //解析数据
        String[] split = s2.split("&");
        String[] split1 = split[0].split("=");
        String[] split2 = split[1].split("=");
        boolean flag = true;
        //判断
        //遍历
        Set<String> strings = hashMap.keySet();
        for (String string : strings) {
            if (split1[1].equals(string)){
                //判断密码是否一样
                String password = hashMap.get(string);
                if (password.equals(split2[1])){
                    flag = false;
                    //密码正确,登录
                    bw.write(1);
                    //刷新将数据发出
                    bw.flush();
                    //将信息写入集合中
                    Service.list.add(s);
                    //写一个while(){}表示正在聊天
                    //接收客户端发送过来的消息,并打印在控制台
                    talk2All(br, string);
                }else {
                    密码不正确
                    bw.write(0);
                    //刷新将数据发出
                    bw.flush();
                }
            }
        }
        if (flag){
            //没有账号,先注册账号
            bw.write(-1);
            //刷新将数据发出
            bw.flush();
        }
    }

    private void talk2All(BufferedReader br, String username) throws IOException {
        while (true) {
            String message = br.readLine();
            System.out.println(username + "发送过来消息:" + message);

            //群发
            for (Socket s : Service.list) {
                //s依次表示每一个客户端的连接对象
                writeMessage2Client(s, username + "发送过来消息:" + message);
            }
        }
    }

    private void writeMessage2Client(Socket s, String message) throws IOException {
        //获取输出流
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }
}
public class Join {
    //用户端
    //选择登录还是注册

    //服务器已经连接成功
    //==============欢迎来到黑马聊天室================
    //1登录
    //2注册
    //请输入您的选择:
    public static void main(String[] args) throws IOException {
        //和服务端进行连接
        Socket s = new Socket("127.0.0.1",10086);
        //获取发送流
        OutputStream os = s.getOutputStream();
        //获取接受流
        InputStream is = s.getInputStream();
        //向服务端发送请求,如果回复则显示 服务器已经连接成功
        //使用缓冲字符包装
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        Scanner sc = new Scanner(System.in);
//
        while (true) {
            System.out.println("服务器已经连接成功");
            System.out.println("==============欢迎来到黑马聊天室================");
            System.out.println("1登录");
            System.out.println("2注册");
            System.out.println("请输入您的选择:");
            String str = sc.next();
            //判断输入的试什么
            switch (str){
                case "1":
                    joinin(sc, bw, br, s);
                    break;
                case "2":
                    resurt(sc, bw);
                    break;
                default:
                    System.out.println("您输入的数据有误,请重新选择");
            }
        }

    }

    private static void resurt(Scanner sc, BufferedWriter bw) throws IOException {
        //调用注册函数
        System.out.println("请输入用户名");
        String usernamere = sc.next();
        System.out.println("请输入密码");
        String passwordre = sc.next();
        //将两个数据进行加工并发送给服务端,1username=zhangsan&password=123,最前边的1表述告诉服务器这是登录操作
        String joinstrre = "username="+usernamere+"&password="+passwordre;
        System.out.println(joinstrre);
        bw.write(2);
        bw.flush();
        //第二次发送
        bw.write(joinstrre);
        bw.newLine();
        bw.flush();
        //开始监听服务器的返回数据
    }

    private static void joinin(Scanner sc, BufferedWriter bw, BufferedReader br, Socket s) throws IOException {
        //调用登录函数
        /**
         * 请输入用户名
         * zhangsan
         * 请输入密码
         * 123
         */
        System.out.println("请输入用户名");
        String username = sc.next();
        System.out.println("请输入密码");
        String password = sc.next();
        //将两个数据进行加工并发送给服务端,1username=zhangsan&password=123,最前边的1表述告诉服务器这是登录操作
        String joinstr = "username="+username+"&password="+password;
        bw.write("1");
        bw.flush();
        //第二次发送
        bw.write(joinstr);
        bw.newLine();
        bw.flush();
        //开始监听服务器的返回数据
        int joinresult = br.read();
        //判断返回的数据
        if (joinresult==1){
            System.out.println("登录成功");
            //登陆成功的操作
            //开一条单独的线程,专门用来接收服务端发送过来的聊天记录
            //创建一个对应的线程用于接受发来的数据
            new Thread(new joinThread(s)).start();
            //开始聊天
            talk2All(bw);
        } else if (joinresult==0) {
            System.out.println("密码有误");
            //重新进行操作
        }else {
            System.out.println("用户名不存在");
            //重新进行操作
        }
    }

    private static void talk2All(BufferedWriter bw) throws IOException {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入您要说的话");
            String str = sc.nextLine();
            //把聊天内容写给服务器
            bw.write(str);
            bw.newLine();
            bw.flush();
        }
    }
}
public class joinThread implements Runnable{

    Socket s;

    public joinThread(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {
        //循环,重复的接受
        while (true) {
            try {
                //接收服务器发送过来的聊天记录
                BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
                String msg = br.readLine();
                System.out.println(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2165154.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【EI会议大盘点!涵盖计算机图像视觉、机器学习等众多方向】

EI会议&#xff0c;作为全球知名的学术会议平台&#xff0c;以其广泛的影响力和严格的收录标准著称。 相较于SCI、核心期刊等期刊来说&#xff0c;EI会议的审稿周期更短&#xff0c;最快7天即可录用。 费用上也相对较低&#xff0c;这对于资金和时间双重压力的学生党来说&…

Rpc框架——服务端框架设计

目录 一、Network 二、Protocol 三、Dispatcher 四、RpcRouter 五、Publish-Subscribe 六、Registry-Discovery 七、Server 服务端的功能需求&#xff1a; 基于网络通信接收客户端的请求&#xff0c;提供rpc服务 基于网络通信接收客户端的请求&#xff0c;提供服务注…

【POJ-1061 青蛙的约会】

题目 代码 #include <bits/stdc.h> using namespace std; typedef long long LL; LL ex_gcd(LL a, LL b, LL &x, LL &y) {if (b 0){x 1;y 0;return a;}LL gcd ex_gcd(b, a % b, x, y);LL tmp x;x y;y tmp - a / b * y;return gcd; } int main() {LL x, y…

springboot实战学习(9)(配置mybatis“驼峰命名“和“下划线命名“自动转换)(postman接口测试统一添加请求头)(获取用户详细信息接口)

接着学习。之前的博客的进度&#xff1a;完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用以及完成了"登录认证"&#xff08;生成与验证JWT令牌&#xff09;具体往回看了解的链接…

SpringBoot项目编译运行成功,但有些包名类名仍然下划线标红的解决方法 | Idea

目录 问题解决方案&#xff1a;方法一&#xff1a;方法二【我用这个成功的】 问题 如图&#xff0c;成功运行但有些包名类名仍然下划线标红&#xff0c;强迫症抓狂 成功运行&#xff1a; 有些包导入标红&#xff1a; 解决方案&#xff1a; 方法一&#xff1a; 点击fil…

K8S介绍---搭建集群

Kubernetes介绍 官网&#xff1a;https://kubernetes.io/ 一、应用部署方式演变 1、传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&a…

AXI4-Stream

AXI4-Stream 简介信号握手机制字节类型TKEEP和TSTRBAXI4-Stream Data FIFO正常模式packet模式 AXI4-Stream Interconnect 简介 这是一种连续流接口&#xff0c;不需要地址线&#xff08;很像 FIFO &#xff0c;一直读或一直写就行&#xff09;。对于这类 IP &#xff0c;ARM 不…

WebUI密码被锁定

锁定密码 打开-webui/打开-webui 讨论 #1027 (github.com) 当你忘记WebUI密码了

通信工程学习:什么是VPN虚拟专用网络

VPN:虚拟专用网络 VPN(Virtual Private Network),即虚拟专用网络,是一种通过公共网络(如互联网)建立私有网络连接的技术。以下是关于VPN的详细解释: 一、VPN虚拟专用网络的定义与原理 VPN通过公共网络(通常是互联网)建立一个临时的、安全的连接,形…

一维数组在内存中的存储

在之前的文章中&#xff0c;我已经介绍了一维数组的创建和初始化和一维数组的使用&#xff0c;今天我们来深入了解一下一维数组在内存中的存储形式。 首先我们先用代码打出数组元素的地址。 #include <stdio.h> int main() { int arr[8]{1,2,3,4,5,11,6,7,8}; int i0; …

单词记忆的化境:用思想的流水去淹没坚硬的石块

其实&#xff0c;鹅卵石通常都是很硬的。但是河底的石子&#xff0c;几乎大多都成了鹅卵石&#xff0c;它们被流水淹没&#xff0c;日复一日、夜以继日的冲刷着&#xff0c;没有了棱角。 在单词的记忆过程中&#xff0c;我们有太多的人&#xff0c;都有着不堪回首的往事&#x…

HDFS分布式文件系统01-HDFS JAVA操作与联邦机制

HDFS分布式文件系统 参考学习目标第三课时知识点1-HDFS的Java API介绍知识点2-案例-使用Java API操作HDFS 第四课时知识点1-Federation机制的实现原理知识点2-Federation机制的特点知识点3-Federation机制的实现知识点4-Erasure Coding 参考 maven的setting.xml配置文件详解 …

影刀RPA实战:网页爬虫之天猫商品数据

1.实战目标 1.1 实战目标 在电商行业&#xff0c;我们经常爬取各个平台的商品数据&#xff0c;通过收集和分析这些商品数据&#xff0c;企业可以了解市场趋势、消费者偏好和竞争对手的动态&#xff0c;从而制定更有效的市场策略。爬取商品数据对于企业在市场竞争中把握先机、…

招联金融2025校招内推喇

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 深圳&#xff0c;武汉&#xff1a; 后台开发 前端开发 数据开发 数据运营…

SD卡读写

SD卡 SD卡分类根据存储容量根据性能 SD卡协议简介SPI 模式命令命令格式命令类别CMDACMD 响应R1R2R3R7 寄存器CSD 总线读操作写操作擦除&写保护 初始化流程 SD 模式 IP 设计IP 例化界面IP 接口IP 状态机IP 验证 雷龙贴片式TF卡参考资料 SD卡分类 根据存储容量 Standard Ca…

五星级可视化页面(26):经常被模仿,从未被的超越的大屏界面。

Hello&#xff0c;各位老铁&#xff0c;本期分享的可视化界面&#xff0c;你可能在某些地方见过&#xff0c;或者被某些设计师临摹过&#xff0c;说明它们足够漂亮了&#xff0c; 你如果仔细观看细节&#xff0c;还是会发现很作出彩的地方不是轻易可以模仿的。 只有创新&#x…

linux网络编程8

24.9.25学习目录 一.原始套接字&#xff08;续&#xff09;1.sendto发送数据原始套接字1.ARP 二.Web编程1.概述2.HTML 一.原始套接字&#xff08;续&#xff09; 混杂模式&#xff1a; 指一台机器的网卡能够接受所有经过它的数据包&#xff0c;不论其目的地址是否是它&#xf…

【智能大数据分析 | 实验一】MapReduce实验:单词计数

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

alpine安装docker踩坑记

文章目录 前言错误场景正确操作最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;最近使用alpine操作系统上docker遇到了一些错误&#xff0c;尝试解决之后就准备输出一篇博客&#xff0c;帮助有需要的后人能够少踩坑&#xff0c;因为淋过雨所以想给别人撑伞 错误场景 我…

dump java内存并进行分析

一、确保机器存在jmap命令 jmap 如果不存在&#xff0c;可以从其他机器将完整的jdk拷贝过来&#xff0c;然后进行使用 二、dump内存 ./jmap -dump:formatb,file./dump.hprof 2853 其中2853是java的PID&#xff0c;将其改为自己想要dump的java进程ID 三、分析&#xff0c;…