📄 serverframe.java
字号:
/* * ServerFrame.java * * Created on 2005年12月18日, 下午3:10 */package javaicqproj;/** * * @author shiyang */import java.awt.*;import javax.swing.*;import javax.swing.table.*;import java.io.*;import java.net.*;import java.sql.*;import java.util.*;public class ServerFrame extends javax.swing.JFrame { private int clientNum;//记录所占端口数 private int udpport; private DefaultTableModel userList; private JTable userListTable; private JTextArea jInfoTextArea=new JTextArea(); /** Creates new form ServerFrame */ public ServerFrame() { String[] columnNames={"在线用户","jicq号"}; userList=new DefaultTableModel(columnNames,0); userListTable=new JTable(); userListTable.setModel(userList); userListTable.setEnabled(false); initComponents(); jPortText.setText("8080"); clientNum=0; udpport=2000; } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents private void initComponents() { jSplitPane1 = new javax.swing.JSplitPane(); jUserListScrollPane = new javax.swing.JScrollPane(); jUserListScrollPane.setViewportView(userListTable); jInfoScrollPane = new javax.swing.JScrollPane(); jInfoScrollPane.setViewportView(jInfoTextArea); jPanel1 = new javax.swing.JPanel(); jPortLabel = new javax.swing.JLabel(); jPortText = new javax.swing.JTextField(); jPanel2 = new javax.swing.JPanel(); jStartButton = new javax.swing.JButton(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("JavaICQ-Server"); jSplitPane1.setDividerSize(2); jSplitPane1.setResizeWeight(0.3); jSplitPane1.setLeftComponent(jUserListScrollPane); jSplitPane1.setRightComponent(jInfoScrollPane); getContentPane().add(jSplitPane1, java.awt.BorderLayout.CENTER); jPanel1.setLayout(new java.awt.GridLayout(1, 4)); jPortLabel.setFont(new java.awt.Font("宋体", 0, 14)); jPortLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); jPortLabel.setText("\u76d1\u542c\u7aef\u53e3"); jPanel1.add(jPortLabel); jPortText.setEditable(false); jPortText.setFont(new java.awt.Font("宋体", 0, 14)); jPanel1.add(jPortText); jPanel1.add(jPanel2); jStartButton.setFont(new java.awt.Font("宋体", 0, 14)); jStartButton.setText("\u5f00\u59cb\u76d1\u542c"); jStartButton.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jStartButtonActionPerformed(evt); } }); jPanel1.add(jStartButton); getContentPane().add(jPanel1, java.awt.BorderLayout.NORTH); pack(); } // </editor-fold>//GEN-END:initComponents private void jStartButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jStartButtonActionPerformed// TODO add your handling code here: try { ServerSocket serverSocket=new ServerSocket(8080);//在8080端口创建套接口 jInfoTextArea.append("系统提示:聊天服务器系统开始启动......\n"); new listenThread(serverSocket); } catch(IOException e) { jInfoTextArea.append("对不起,不能监听端口:8080.\n"); System.exit(-1); } jStartButton.setEnabled(false); }//GEN-LAST:event_jStartButtonActionPerformed public class listenThread extends Thread { private ServerSocket serverSocket; private ProcessDBService pDBService=new ProcessDBService(); public listenThread(ServerSocket s) throws IOException {//线程构造函数 serverSocket=s;//取得传递参数 this.start();//启动线程 } public void run() { try{ while(true){ Socket socket=serverSocket.accept();//无限监听客户的请求 jInfoTextArea.append("Connectino accept:"+socket+"\n"); clientNum++; pDBService.processDB(socket); } } catch(IOException e){} finally{ try{serverSocket.close();}catch(IOException e){} } } } /** * @param args the command line arguments */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { ServerFrame sf=new ServerFrame(); sf.setSize(417,333); sf.setVisible(true); } }); } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JScrollPane jInfoScrollPane; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JLabel jPortLabel; private javax.swing.JTextField jPortText; private javax.swing.JSplitPane jSplitPane1; private javax.swing.JButton jStartButton; private javax.swing.JScrollPane jUserListScrollPane; // End of variables declaration//GEN-END:variables public class ProcessDBService{ private final String url="jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=javaicq.dll"; private final String username="gws"; private final String password="pass"; private Socket socket;//定义套接口 private BufferedReader in;//定义输入流 private PrintWriter out;//定义输出流 /** Creates a new instance of ServerThread */ public ProcessDBService(){ } public void processDB(Socket s){ socket=s;//取得传递参数 try{ in=new BufferedReader(new InputStreamReader(socket.getInputStream()));//创建输入流 out=new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);//创建输出流 String str=in.readLine();//取得输入字符串 if(str==null)return; else if(str.equals("end"))return;//如果是结束就关闭连接 else if(str.equals("login")) {//登录 this.login(); } else if(str.equals("new")){//客户新建请求 this.newUser(); } else if(str.equals("find")){//用户查找好友 this.findFriends(); } else if(str.equals("friend")){//用户登录时读取其好友资料 this.getFriendsInfo(); } else if(str.equals("addfriend")){//用户添加好友 this.addFriend(); } else if(str.equals("delfriend")){//用户删除好友 this.deleteFriend(); } else if(str.equals("logout")){//用户退出 this.logout(); } } catch(IOException e){}//捕或异常 finally{ try{socket.close();} catch(IOException e){} }//end of try } /** 登陆线程 */ private void login() { try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//连接数据库 Connection c=DriverManager.getConnection(url,username,password); String sql="select nickname,password,status from icq where icqno=?"; //准备从数据库选择呢称和密码 PreparedStatement prepare=c.prepareCall(sql);//设定数据库查寻条件 String icqno=in.readLine(); int g=Integer.parseInt(icqno);//取得输入的jicq号码 jInfoTextArea.append("Jicq号码:"+icqno); String passwd=in.readLine().trim();//取得输入的密码 prepare.clearParameters(); prepare.setInt(1,g);//设定参数 ResultSet r=prepare.executeQuery();//执行数据库查寻 if(r.next()){//以下比较输入的号码于密码是否相同 String pass=r.getString("password").trim(); if(passwd.regionMatches(0,pass,0,pass.length())){ if(r.getString("status").trim().equals("上线")){ out.println("上线"); jInfoTextArea.append(" Already in line\n"); } else{ out.println("ok"); //如果相同就告诉客户ok String nickname=r.getString("nickname").trim(); out.println(nickname); //返回给客户一个udp发送端口号 out.println(udpport+clientNum); //返回客户的昵称,并且更新数据库用户为在线,以及注册用户的ip 地址,和udp发送端口 String setip="update icq set ip=?,sendport=?,status='上线' where icqno=?"; PreparedStatement prest=c.prepareCall(setip); prest.clearParameters(); prest.setString(1,socket.getInetAddress().getHostAddress()); prest.setInt(2,udpport+clientNum);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -