JAVA实现局域网聊天(一)socket实例

在这里插入图片描述

原理是通过套字节,两边各自有一个Socket,在两边都确定了ip地址与端口号后,通过socket传输io数据流(内容)可以实现简单的”一问一答“的聊天。

服务器可同时接受多人发起聊天连接(多个客户端可同时与服务器通信)

服务器端

在这里插入图片描述

package com.tedu;
/**
 * @author Myli
 * @create 2023-02-14 10:47
 * 这个类用来当做回声案例的服务器端
 * 1.启动服务器
 * 2.接收客户端的连接请求
 * 3.给每个用户分配对应的话务员
 * 4.话务员:主要负责和对应的客户端对象进行沟通I/O
 */
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**1.创建优化后的Server类,充当服务器端*/
public class net {
    
    
    /**2.创建方法,负责服务多个客户*/
    public void service() {
    
    
        /**3.匿名对象+匿名内部类(重写run方法)*/
        new Thread() {
    
    
            /**5.把业务写在run()中*/
            @Override
            public void run() {
    
    
                try {
    
    
                    //5.1 启动服务器,设置端口号为8000并等待客户端连接
                    ServerSocket ss = new ServerSocket(8000);
                    System.out.println("服务器启动成功!");
                    while (true) {
    
    //死循环,一直accept,也就是接受客户端的连接请求
                        //5.2 一直接受所有客户端的连接请求
                        Socket socket = ss.accept();
                        System.out.println("客户端连接成功!");
                        //5.3 给每个客户分配自己对应的话务员,1v1
                        HuaWuThread t = new HuaWuThread(socket);//创建话务员内部类,主要负责和客户端沟通
                        t.start();
                    }
                } catch (IOException e) {
    
    
                    e.printStackTrace();
                }

            }

            ;
        }.start();/**4.启动线程*/
    }

    /**6.创建话务员内部类,主要负责和客户端沟通 I/O*/
    class HuaWuThread extends Thread {
    
    
        //6.1 定义本类中的成员变量socket,用来保持通话
        Socket socket;

        //6.2含参构造,接受当前的连接信息,保持通话,为谁服务就保存谁的数据
        public HuaWuThread(Socket socket) {
    
    
            this.socket = socket;
        }

        //6.3把话务员的业务放在run(),一直读取客户端发来的数据,并作出回应
        @Override
        public void run() {
    
    
            try {
    
    
                //7.1读取一行BufferedReader,并且写出一行PrintWriter --双向流
                BufferedReader in = new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));
                PrintWriter out = new PrintWriter(
                        new OutputStreamWriter(socket.getOutputStream()));
                //7.2读取客户端发来的一行数据
                String line;//定义变量,记录读取到的一行数据
                while ((line = in.readLine()) != null) {
    
    //只要有数据就一直读
                    System.out.println("客户端发来的数据:" + line);
                    //7.1可以给客户端作出响应-接收键盘输入的响应
                    System.out.println("请输入您的回应:");
                    String input = new Scanner(System.in).nextLine();
                    //7.2发出作为服务器的响应
                    out.println(input);
                    out.flush();//把数据发出去
                }
            } catch (Exception e) {
    
    
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
    
    
        net s = new net();
        //服务器网络启动
        s.service();
    }
}

客户端

在这里插入图片描述

package cn.tedu;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * @author Myli
 * @create 2023-02-14 10:51
 */
public class Client {
    
    
    public static void main(String[] args) {
    
    
        try {
    
    
            //1.连接指定的服务器,同时指定服务器的IP和端口号
            Socket socket = new Socket("127.0.0.1", 8000);
            //2.给服务器发送数据
            while (true) {
    
    
                //向服务器写出一行数据,并且读取服务器响应回来的数据
                PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                //3.通过流对象进行发送和读取的操作
                System.out.println("请输入您想给服务器发送的数据:");
                String input = new Scanner(System.in).nextLine();
                out.println(input);//向服务端发送指定数据
                out.flush();//把数据刷出去
                String line = in.readLine();//读取回声数据
                System.out.println("服务器端响应的数据是:" + line);
            }
        } catch (Exception e) {
    
    

            e.printStackTrace();
        }
    }
}

此为实例,有具体的socket问题可以看思路链接: link
拓展的话,看有没有时间接着拓展。

猜你喜欢

转载自blog.csdn.net/m0_54765221/article/details/129023251