新手练练----也做即时通信系统(1)

简介:
实践出真知,还得要多动手才行。今天做的放上来,实现了客户端的登陆功能,慢慢加功能,锻炼自己的j2se水平。。。功能太简单了(本人水平有限^o^)。
(一)客户端:
login.java
package vitaminclient;

import java.awt.*;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;
import java.net.*;
import java.io.*;
import java.util.*;


/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class Login extends JFrame
{
    private String userName = "";//用户名
    private String password = "";//密码
    private Socket socket = null;//客户端socket
    private java.io.BufferedReader in = null;//读数据的
    private java.io.PrintWriter out = null;//向服务器写数据
    private static final int SeverPort = 6018;//服务器端口
    private String clientCmd = "";
    private String serverMsg = "";

    public Login() {
        try {
            jbInit();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }

    private void jbInit() throws Exception {
        getContentPane().setLayout(null);
        jPanel1.setBounds(new Rectangle(0, 0, 435, 327));
        jPanel1.setLayout(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setTitle("登陆");


        btnLogin.addActionListener(new Login_btnLogin_actionAdapter(this));
        btnReset.addActionListener(new Login_btnReset_actionAdapter(this));

        this.getContentPane().add(jPanel1);
        tfName.setBounds(new Rectangle(139, 75, 178, 41));
        jLabel2.setText("密码:");
        jLabel2.setBounds(new Rectangle(56, 162, 74, 38));
        tfPassword.setBounds(new Rectangle(137, 156, 182, 41));
        btnLogin.setBounds(new Rectangle(90, 254, 87, 32));
        btnLogin.setText("登陆");
        btnReset.setBounds(new Rectangle(238, 251, 84, 34));
        btnReset.setText("重置");
        jPanel1.add(jLabel1);
        jPanel1.add(jLabel2);
        jPanel1.add(tfName);
        jPanel1.add(tfPassword);
        jPanel1.add(btnLogin);
        jPanel1.add(btnReset);
        jLabel1.setText("用户名:");
        jLabel1.setBounds(new Rectangle(56, 76, 71, 38));
        this.setLocation(310,200);
        this.setSize(400,400);
    }

    public static void main(String[] args) {
        Login login = new Login();
        login.setVisible(true);
    }

    JPanel jPanel1 = new JPanel();
    JLabel jLabel1 = new JLabel();
    JTextField tfName = new JTextField();
    JLabel jLabel2 = new JLabel();
    JPasswordField tfPassword = new JPasswordField();
    JButton btnLogin = new JButton();
    JButton btnReset = new JButton();
    public void btnLogin_actionPerformed(ActionEvent e)
    {//用户登陆
        int numRead;
       if(tfName.getText().trim().length()==0)
       {
           javax.swing.JOptionPane.showMessageDialog(this,"请输入用户名!!!","用户登陆",JOptionPane.WARNING_MESSAGE);
           return;
       }
       if(tfPassword.getPassword().length==0)
       {
           javax.swing.JOptionPane.showMessageDialog(this,"请输入密码!!!","用户登陆",JOptionPane.WARNING_MESSAGE);
           return;
       }
       this.userName = tfName.getText().trim();//获取用户名
       this.password = String.valueOf(tfPassword.getPassword());//获取密码
       this.clientCmd = "login " +this.userName+" " +this.password;

       //this.clientCmd = "login";
       try
       {
           this.socket = new Socket(InetAddress.getLocalHost(),SeverPort);//连接服务器
           this.in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//从服务器读数据的
           this.out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//向数据库写数据的
           out.println(this.clientCmd);

           this.serverMsg = in.readLine();
           if(this.serverMsg.equals(new String("LoginBad")))
           {
               javax.swing.JOptionPane.showMessageDialog(this,"登陆失败!!!");
               return;
           }
           else if(this.serverMsg.equals(new String("LoginGood")))
           {
               vitaminclient.clientMain cm = new clientMain();
               cm.setSize(200,500);
               cm.setVisible(true);
               this.dispose();

           }

          }
       catch(java.io.IOException ex)
       {
           System.err.println(ex.getMessage().toString());
           ex.printStackTrace();
       }
       catch(java.lang.Exception ex)
       {
           System.err.println(ex.getMessage().toString());
           ex.printStackTrace();
       }
    }
    public void btnReset_actionPerformed(ActionEvent e) {
        this.tfName.setText("");
        this.tfPassword.setText("");
    }

}


class Login_btnReset_actionAdapter implements ActionListener {
    private Login adaptee;
    Login_btnReset_actionAdapter(Login adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.btnReset_actionPerformed(e);
    }
}







class Login_btnLogin_actionAdapter implements ActionListener {
    private Login adaptee;
    Login_btnLogin_actionAdapter(Login adaptee) {
        this.adaptee = adaptee;
    }

    public void actionPerformed(ActionEvent e) {
        adaptee.btnLogin_actionPerformed(e);
    }
}


clientMain.java(开发中。。。)

(二)服务器端
   数据库用的是Access,图个简单,反正是做着练手用的,能偷懒就尽量吧。。。。
   业务逻辑和数据访问分开的,数据访问我封装了一个javaBean类来实现:
DBbase.java
package com.vitamin.DataAccess;

import java.sql.*;

public class DBbase {
        String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
        String sConnstr = "jdbc:odbc:myDB";
        Connection connect = null;
        ResultSet rs = null;
        Statement stmt = null;


        public DBbase()
        {

                try
                {

                        Class.forName(sDBDriver);

                }
                catch(ClassNotFoundException ex)
                {
                        System.err.println(ex.getMessage());

                }
        }
        public ResultSet executeQuery(String sql)
        {

                try
                {
                        this.connect = DriverManager.getConnection(sConnstr);
                        this.stmt = this.connect.createStatement();
                        rs = stmt.executeQuery(sql);
                }
                catch(SQLException ex)
                {
                        System.err.println(ex.getMessage());
                }
                return rs;
        }
        public int executeUpdate(String sql)
        {
                int result = 0;
                try
                {
                        this.connect = DriverManager.getConnection(sConnstr);
                        this.stmt = this.connect.createStatement();
                        result = stmt.executeUpdate(sql);
                }
                catch(SQLException ex)
                {
                        System.err.println(ex.getMessage());
                }
                return result;
        }

}



服务器端
   为了简单,连GUI都不弄了,等后期再来完善吧,先把主要功能做出来再说:
server.java
package com.vitamin.vitaminserver;

import java.net.*;
import java.io.*;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class server
{



    public static void main(String[] args) throws java.io.IOException
    {
        java.net.ServerSocket s = new ServerSocket(6018);
        System.out.println("服务器启动:"+s);
        try
        {
            while(true)
            {
               java.net.Socket  socket = s.accept();
                System.out.println("连接接受"+socket);
                try
                {
                    new ServerThread(socket);
                }
                catch(java.io.IOException ex)
                {
                    socket.close();
                }

            }
        }
        catch(java.lang.Exception ex)
        {
            System.err.println(ex.getMessage().toString());
            ex.printStackTrace();
        }
        finally
        {
            s.close();
        }

    }




}


ServerThread.java
package com.vitamin.vitaminserver;

import java.io.*;
import java.net.*;
import java.util.*;
import com.vitamin.DataAccess.*;


/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */
public class ServerThread extends java.lang.Thread
{
    private java.net.Socket socket = null;
    private java.io.BufferedReader in = null;//读数据的
    private java.io.PrintWriter out = null;//向客户写数据
    private String clientMsg = "";
    private String sql = "";
    private java.sql.ResultSet rs = null;

    public ServerThread()
    {
        super();
    }
    public ServerThread(Socket s)throws java.io.IOException
    {
        this.socket = s;
        this.in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
        this.out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(this.socket.getOutputStream())),true);
        this.start();//启动线程
    }

    public void run()
    {
        String[] msgTmp;
        String spliter = " ";
        try
        {
            while(true)
            {
                this.clientMsg = in.readLine();
                System.out.println(this.clientMsg);
                 msgTmp = this.clientMsg.split(spliter);
                 System.out.println(msgTmp[0]);
                if(msgTmp[0].equals(new String("login")))
                {
                    String name = "";
                    String pwd = "";
                    System.out.println(this.clientMsg);
                    name = msgTmp[1];
                    pwd = msgTmp[2];
                    com.vitamin.DataAccess.DBbase myDb = new DBbase();
                    this.sql = "select count(*) as count from users where username='"+name+"' and password = '"
                               +pwd +"'";
                    this.rs = myDb.executeQuery(this.sql);
                     int result = 0;
                    if(rs.next())
                    {
                        result = rs.getInt("count");
                    }
                    if(result>=1)
                    {
                        this.out.println("LoginGood");
                    }
                    else
                   {
                        this.out.println("LoginBad");
                    }


                }
                else
                {


                }

            }
        }
        catch(java.lang.Exception ex)
        {
            System.out.println(ex.getMessage().toString());
            ex.printStackTrace();
        }
        try {
            this.socket.close();
        } catch (IOException ex1) {
        }
    }
}


运行结果:

6-20-1.GIF
6-20-2.GIF
6-20-3.GIF

自己水平有限,做的这个小东西实在拿不出手,但还是对自己有些帮助,我会继续努力的,



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/06/22/432208.html,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
人工智能 前端开发 Java
2025 开发必备:精选免费 AI 辅助工具,效率狂飙不停
2025年,AI技术深度融入编程领域,诞生了多款免费且功能强大的辅助工具。通义灵码精通200多种语言,可快速生成代码框架,提升开发效率超10%,还为新手提供学习指导。Google Gemini Code Assist每月完成18万次代码补全,支持智能交互与代码审查,优化团队协作。飞算JavaAI专注Java全流程开发,从需求分析到代码生成实现十倍提效。这些工具大幅降低编程门槛,助力开发者高效高质完成任务。
|
开发框架 JSON 监控
实战指南:从 .NET Framework 迁移到 .NET 5/6 的策略与最佳实践
【8月更文挑战第28天】从 .NET Framework 迁移到 .NET 5/6 是一次重要的技术升级,涉及开发环境与应用架构的改进。本文通过具体案例分析,介绍迁移策略与最佳实践,帮助开发者顺利完成转变。
336 1
|
计算机视觉 Python
Opencv学习笔记(七):如何根据opencv将BGR转换为HSV
使用OpenCV库在Python中将BGR图像转换为HSV颜色空间的两种方法:一种是直接使用cv2.cvtColor函数,另一种是手动实现RGB到HSV的转换。
475 0
Opencv学习笔记(七):如何根据opencv将BGR转换为HSV
|
XML JSON 前端开发
Java @RequestParam和@RequestBody的区别是什么?
【8月更文挑战第28天】Java @RequestParam和@RequestBody的区别是什么?
431 5
成功解决:java: 无效的目标发行版: 17
这篇文章讲述了如何解决在启动SpringBoot项目时遇到的"无效的目标发行版: 17"的问题,主要是通过修改IDEA内置的编译设置,确保它使用正确的JDK版本。
|
Linux Shell 开发工具
C++ 的 ini 配置文件读写/注释库 inicpp 用法 [ header-file-only ]
这是一个C++库,名为inicpp,用于读写带有注释的INI配置文件,仅包含一个hpp头文件,无需编译,支持C++11及以上版本。该库提供简单的接口,使得操作INI文件变得容易。用户可通过`git clone`从GitHub或Gitee获取库,并通过包含`inicpp.hpp`来使用`inicpp::iniReader`类。示例代码展示了读取、写入配置项以及添加注释的功能,还提供了转换为字符串、双精度和整型的函数。项目遵循MIT许可证,示例代码可在Linux环境下编译运行。
1464 0
|
数据采集 人工智能 测试技术
模块化重构LLaVA,替换组件只需添加1-2个文件,开源TinyLLaVA Factory来了
【6月更文挑战第5天】TinyLLaVA Factory是新推出的开源模块化代码库,简化小规模多模态模型的设计与训练,采用工厂模式,允许用户通过添加或替换少量文件轻松重构模型组件,提高开发效率。该库支持定制LMMs并提供训练配方,通过模块化和开源促进社区合作,已实验证实在复现性能上与原始模型相当。尽管面临兼容性等挑战,但其前瞻性的技术路线图确保了其在AI领域的相关性和活力。论文链接:[arxiv.org/abs/2405.11788](https://arxiv.org/abs/2405.11788)
267 0
|
C#
C# WPF 中用代码模拟鼠标和键盘的操作
原文:C# WPF 中用代码模拟鼠标和键盘的操作   原文地址   C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的。
2425 0
|
JavaScript
Vue颜色选择器实现(两种方法)
Vue颜色选择器实现(两种方法)
1161 0
|
数据安全/隐私保护 API 移动开发
登陆功能的实现
我不喜欢废话,上代码 /// /// 运行程序返回进程pid /// /// /// static public int RunProgram(string qqPath) ...
967 0