当前位置: 首页 > news >正文

新手练练----也做即时通信系统(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,如需转载请自行联系原作者

相关文章:

  • 2017双11技术揭秘—分布式缓存服务Tair的热点数据散列机制
  • 8.不绑定(ngNonBindable)
  • spring boot 2.0之使用spring boot
  • ELK实战之Tomcat的json日志收集
  • 爬虫如何解决验证码的问题
  • PostgreSQL 时序数据案例 - 时间流逝, 自动压缩, 同比\环比
  • 使用 HttpClient 4 进行文件上传
  • 深入解析Spring Cloud内置的Zuul过滤器
  • exe4j打包jar文件成exe .
  • 使用 VisualVM 进行性能分析及调优
  • BZOJ1901:Zju2112 Dynamic Rankings——题解
  • Android交互
  • 第 15 章 Admonition 警告与提示
  • Android OkHttp简易使用
  • 怎么让div内容超出后自动显示滚动条
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2018一半小结一波
  • Go 语言编译器的 //go: 详解
  • JavaScript对象详解
  • js写一个简单的选项卡
  • Redis 中的布隆过滤器
  • Swoft 源码剖析 - 代码自动更新机制
  • 成为一名优秀的Developer的书单
  • 实现菜单下拉伸展折叠效果demo
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 世界上最简单的无等待算法(getAndIncrement)
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 项目管理碎碎念系列之一:干系人管理
  • 数据可视化之下发图实践
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • $.ajax()方法详解
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (39)STM32——FLASH闪存
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (转)Mysql的优化设置
  • (转)ObjectiveC 深浅拷贝学习
  • (转)Oracle存储过程编写经验和优化措施
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET构架之我见
  • ?.的用法
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [Docker]四.Docker部署nodejs项目,部署Mysql,部署Redis,部署Mongodb
  • [FFmpeg学习]从视频中获取图片
  • [FxCop.设计规则]8. 也许参数类型应该是基类型
  • [HNOI2006]鬼谷子的钱袋
  • [LeetCode] 178. 分数排名
  • [linux] shell中的()和{}
  • [LWC小知识] 标准lightning-input-field怎么取得变更值(onchange)
  • [mit6.s081] 笔记 Lab2:system calls
  • [MYSQL数据库]- 索引