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)专门用于接收聊天信息