TCP多端聊天室 java

package dzy;

import java.io.*;
import java.net.Socket;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class jm {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",10086);
        BufferedWriter bw = new BufferedWriter
                (new OutputStreamWriter(socket.getOutputStream()));
        Scanner sc=new Scanner(System.in);
        System.out.println("服务器已经连接成功");
        System.out.println("--------------欢迎来到聊天室---------------");
        System.out.println("1登录");
        System.out.println("2注册");
        System.out.println("输入你的选择");
        String get1 = sc.nextLine();
        if("1".equals(get1)){
            //登录
            cake("A",bw);
        }else if ("2".equals(get1)){
            //注册
            cake("B",bw);
        }
        //System.out.println(1);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String s = br.readLine();
        System.out.println(s);
        if ("登陆成功,开始聊天".equals(s)){
            //开一条线程,专门用于接收聊天记录
            new Thread(new myrun(socket)).start();
            //向服务器发送数据
            talkAll(bw);
        }
        socket.close();
        }

    private static void cake(String flag,BufferedWriter bw) throws IOException {
        String pw="";
        String id="";
        Scanner sc=new Scanner(System.in);

        System.out.println("输入用户名:");
        String tempid = sc.nextLine();
        System.out.println("请输入密码:");
        String temppw = sc.nextLine();
            pw="password="+temppw;
            id="passid="+tempid;
            String EndData=id+"&"+pw+"&"+flag;
            bw.write(EndData);
            bw.newLine();
            bw.flush();
            //socket.shutdownOutput();
    }
    private static void talkAll(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();
        }
    }
}
package dzy;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.Scanner;

public class myrun implements Runnable{
    Socket socket;
    public myrun(Socket socket) {
        this.socket=socket;
    }
    @Override
    public void run() {
        while (true) {
            try {
                //接收服务器发送过来的聊天记录
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String msg = br.readLine();
                System.out.println(msg);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
package dzy;

import java.io.*;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Scanner;

public class myranable implements Runnable{

    Socket socket;
    public myranable(Socket socket) {
        this.socket=socket;
    }
    @Override
    public void run() {
        ArrayList<String> arr=new ArrayList<>();
        try {
            //获取新登录的数据
            BufferedReader br = new BufferedReader
                    (new InputStreamReader(socket.getInputStream()));
            String newdate = br.readLine();

           if (newdate==null){
               return;
           }
            String[] split1 = newdate.split("&");
            String[] split2 = split1[0].split("=");
            String[] split3 = split1[1].split("=");
            String newname=split2[1];
            String newpw=split3[1];
            //String pid = "[a-zA-Z]{6,18}";
            //String ppw="[a-zA-Z][0-9]{2,7}";
            //要求1:用户名要唯一,长度:6~18位,纯字母,不能有数字或其他符号。
            //要求2:密码长度3~8位。第一位必须是小写或者大小的字母,后面必须是纯数字。

            //从以登记文件中获取数据
            BufferedReader bfFile=new BufferedReader
                    (new InputStreamReader
                            (new FileInputStream("user_data/user_id_pw")));
            String line;
            while ((line=bfFile.readLine())!=null){
                arr.add(line);
            }bfFile.close();
            System.out.println(arr);
            //逐一比较
            if (split1[2].equals("A")){
                for (String str : arr) {
                    String[] split4 = str.split("=");
                    if (split4[0].equals(newname)){
                        if (split4[1].equals(newpw)){
                            reMessage("登陆成功,开始聊天");
                               myserver.list.add(socket);
                               talkall(br,newname);
                        }else {
                            reMessage("密码错误");
                            break;
                        }
                    }
                }
                reMessage("账号不存在");
            }
            else if (split1[2].equals("B")) {//注册
                String pid = "[a-zA-Z]{6,18}";
                String ppw = "[a-zA-Z][0-9]{2,7}";
                //要求1:用户名要唯一,长度:6~18位,纯字母,不能有数字或其他符号。
                //要求2:密码长度3~8位。第一位必须是小写或者大小的字母,后面必须是纯数字。
                if (newname.matches(pid)&&newpw.matches(ppw)){
                    for (String str : arr) {
                        String[] split4 = str.split("=");
                        if (split4[0].equals(newname)) {
                            reMessage("用户名已存在");
                            return;
                        }
                    }
                    //System.out.println("用户名不存在");
                    BufferedWriter bwF = new BufferedWriter
                            (new OutputStreamWriter
                                    (new FileOutputStream("C:\\Users\\35602\\javalx\\educate\\user_data\\user_id_pw", true)));
                    if (arr.size()==0){
                        bwF.write(newname + "=" + newpw);
                    }else {
                        bwF.newLine();
                        bwF.write(newname + "=" + newpw);
                    }
                    bwF.flush();
                    bwF.close();
                    reMessage("注册成功");
                }else {
                    reMessage("格式错误");
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //向所有用户发送信息
    public void talkall(BufferedReader br,String name) throws IOException {
        while (true){
            String str = br.readLine();
            System.out.println(name+":"+str);
            for (Socket s : myserver.list) {
                dialogue(s,(name+":"+str));
            }
        }
    }
    //向指定用户发送信息
    public void dialogue(Socket socket,String str) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(str);
        bw.newLine();
        bw.flush();
    }
    //向用户反馈信息
    public void reMessage(String message) throws IOException {
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write(message);
        bw.newLine();
        bw.flush();
    }
}
package dzy;

import cn.hutool.core.thread.ThreadException;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.concurrent.*;

public class myserver {
    //用list将登录的用户储存起来
    static ArrayList<Socket> list=new ArrayList<>();
    public static void main(String[] args) throws IOException {
        //创建线程池
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3,
                16,
                60,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(2),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );
        //创建服务器

        ServerSocket ss = new ServerSocket(10086);
        while (true){
            try {
                Socket socket = ss.accept();
                if (socket!=null){
                    pool.submit(new myranable(socket));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }
}

黑马的网络编程大作业

验证前:

用户的登录,注册和服务器的反馈一直都是用的最开始创建的用户br1,用户bw1或服务器br1,服务器bw1

当验证完毕:

用户发送的聊天信息还是用原本的用户bw1,服务器读消息还是用原本的服务器br1

服务器在用服务器br1获取聊天信息后

新建一个服务器bw2

通过遍历list表将数据输出给对应的用户

而用户将创建一个线程(用户br2)专门用于接收聊天信息

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值