服务器
public class Service extends Thread{
//顶一个socket对象,在构造函数中传入
Socket socket;
public Service(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
//创建服务端输入流
BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//创建服务端的输出流
BufferedWriter socketWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
//创建输出写入流
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
//一直循环,接收来自客户端的消息
while (true) {
String choose = socketReader.readLine(); //读取用户的选择
System.out.println(choose+"服务...");
//判断要哪个服务
switch (choose){
case "login" :
login(socketReader, printWriter);
break;
case "register" :
register(socketReader, printWriter);
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
//登录
public static void login(BufferedReader socketReader, PrintWriter pw) throws IOException {
//接收客户端传来数据
String userid = socketReader.readLine(); //账号
String pass = socketReader.readLine(); //密码
//验证数据库
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = dao.selectByIdPass(userid,pass);
sqlSession.close();
//查看是否已存在
if (user != null) {
//可以登录
pw.println(user.getName()+""); //给客户端返回一些东西(返回啥都行,就算我后面刚好缺这玩意,就顺便返回了)
} else {
//数据不存在,不能登录
pw.println("登录失败。"+"账号为"+userid+"且密码为"+pass+"的用户不存在,请检查账号密码信息重新登录");
}
}
//注册
public static void register(BufferedReader socketReader, PrintWriter pw) throws IOException {
//客户端传来数据
String userid=socketReader.readLine();
String name=socketReader.readLine();
String pass=socketReader.readLine();
//验证数据库
SqlSession sqlSession = MyBatisUtils.getSqlSession();
UserDao dao = sqlSession.getMapper(UserDao.class);
User user = dao.selectById(userid);
//查看账号是否已存在
if(user == null) {
//数据不存在,可以注册
dao.insertUser(new User(userid,name,pass));
sqlSession.commit();
pw.println("注册成功!");//给客户端发消息
}else {
pw.println("注册失败!");
}
sqlSession.close();
}
public static void main(String[] args) throws IOException {
//开启tcp服务,监听9090端口
ServerSocket serverSocket = new ServerSocket(9090);
while (true) {
//开启线程
new Service(serverSocket.accept()).start();
}
}
}
客户端
//登录
public class LoginCli {
public String login(String inetAddress, String userid, String pass) throws IOException {
//创建端口
Socket s = new Socket(InetAddress.getByName(inetAddress),9090);
//创建选择
String choose = "login";
//创建输出写入流
PrintWriter pw =new PrintWriter(s.getOutputStream(),true);
//写入数据
pw.println(choose); //选择
pw.println(userid);
pw.println(pass);
//创建输入读取流
BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream()));
//获取数据
String str=br2.readLine();
//关闭
s.close();
return str;
}
}
//注册
public class RegisterCli {
public String register(String inetAddress, String userid, String name, String pass) throws IOException {
//创建端口
Socket s = new Socket(InetAddress.getByName(inetAddress),9090);
//创建输出写入流
PrintWriter pw =new PrintWriter(s.getOutputStream(),true);
//写入数据
pw.println("register");//写入选择
pw.println(userid);
pw.println(name);
pw.println(pass);
//创建输入读取流
BufferedReader br2=new BufferedReader(new InputStreamReader(s.getInputStream()));
//获取数据
String str=br2.readLine();
s.close();
return str+"你注册的信息是,账号:"+userid+",姓名:"+name+",密码:"+pass;
}
}
写进swing
//登录窗口的登录按钮
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String reminder = null; //提示语
String ip = ipField.getText(); //获取就是127.0.0.1这个东西
String userid = textField.getText(); //账号
String pass = String.valueOf(passwordField.getPassword()); //密码
try {
reminder = new LoginCli().login(ip, userid, pass); //登录客户端
} catch (IOException ioException) {
ioException.printStackTrace();
}
if (reminder.length() < 20){ //这个判断的有点草率,因为成功返回的是用户名,不成功返回的是一大长串提示语,不想写了,就先这么草率的搞完得了(看上面的LoginCli的return)
//登录成功
new ClientUI().ui(ip, userid, reminder); //进入客户端窗口
} else {
//登录失败
new ReminderUI().ui(reminder); //进入提示错误窗口
}
jf.dispose();
}
});
//注册窗口的注册按钮
btn1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String reminder = null; //提示语
try {
//注册客户端~服务
reminder = new RegisterCli().register(textField3.getText(), textField1.getText(), textField2.getText(), String.valueOf(passwordField.getPassword()));
} catch (IOException ioException) {
ioException.printStackTrace();
}
new ReminderUI().ui(reminder); //进入提示界面
jf.dispose();
}
});
越写重复代码越多,应该是可以更加精简代码(废话),我不会
本文介绍了一位新手使用Java实现TCP协议的服务器和客户端登录注册系统的过程,通过Swing构建用户界面。在实践中遇到了代码重复的问题,作者寻求代码优化的方法。

888

被折叠的 条评论
为什么被折叠?



