bc:javaicq\,\ \,\ \); //连接数据库,根据接受的用户号码及好友号码向好友表删除记录 int friendicqno=Integer.parseInt(in.readLine()); System.out.println(friendicqno); int myicqno=Integer.parseInt(in.readLine()); System.out.println(myicqno); String addfriend=\delete from friend where icqno=? and friend=?\; PreparedStatement prepare7=c7.prepareCall(addfriend); prepare7.clearParameters(); prepare7.setInt(1,myicqno); prepare7.setInt(2,friendicqno); int r7=0; r7=prepare7.executeUpdate(); if(r7==1) System.out.println(\ok delfrien\);//成功 else System.out.println(\false delfriend\);//失败 }catch (Exception e){e.printStackTrace();System.out.println(\del false\);} }//end delete friend //执行用户删除好友结束 //以下处理用户退出程序 else if(str.equals(\logout\)){ try{ Class.forName(\sun.jdbc.odbc.JdbcOdbcDriver\); Connection c8=DriverManager.getConnection(\jdbc:odbc:javaicq\,\ \,\ \); //连接数据库,根据接受的用户号码,将其状态字段设为0,及ip地址设为空 int myicqno=Integer.parseInt(in.readLine()); System.out.println(myicqno); String status=\update icq set status=0 , ip=' ' where icqno=?\; PreparedStatement prest8=c8.prepareCall(status); prest8.clearParameters(); prest8.setInt(1,myicqno); int r8=prest8.executeUpdate(); if(r8==1) System.out.println(\ok logout\); else System.out.println(\false logout\); }catch (Exception e){e.printStackTrace();System.out.println(\logout false\);} }//logout end //处理用户退出程序结束 //get who add me as friend //以下处理那些人加了我为好友,以便上线通知他们 else if(str.equals(\getwhoaddme\)){ System.out.println(\getwhoaddme\); try{ Class.forName(\sun.jdbc.odbc.JdbcOdbcDriver\); Connection c9=DriverManager.getConnection(\jdbc:odbc:javaicq\,\ \,\ \); //连接数据库,根据我的号码,从好友表中选择谁加了我 int myicqno=Integer.parseInt(in.readLine()); System.out.println(myicqno); String getwhoaddme=\select icqno from friend where friend=?\; PreparedStatement prepare6=c9.prepareCall(getwhoaddme); prepare6.clearParameters(); prepare6.setInt(1,myicqno); ResultSet r6=prepare6.executeQuery(); Vector who=new Vector(); while(r6.next()){ who.add(new Integer(r6.getInt(1))); }//end while //然后告诉这些好友的ip地址,然后发给用户以便告诉其他客户我上线了 for(int i=0;i<who.size();i++){ String whoinfo=\select ip from icq where icqno=? and status=1\; PreparedStatement prepare=c9.prepareCall(whoinfo); prepare.clearParameters(); prepare.setObject(1,who.get(i)); ResultSet r=prepare.executeQuery(); while(r.next()){ out.println(r.getString(\ip\)); } //while r.close(); }//for out.println(\over\); System.out.println(\over\); c9.close();r6.close(); }catch (Exception e){e.printStackTrace();System.out.println(\false\);} }//end get who add me as friend //处理上线结束 System.out.println(\Echo ing :\+str); } System.out.println(\Close...\); }catch(IOException e){}//捕或异常 finally {try{socket.close();} catch(IOException e){} } }} public class Server{//主服务器类 public static void main(String args[])throws IOException{ ServerSocket s=new ServerSocket(8080);//在8080端口创建套接口 System.out.println(\Server start..\+s); try{ while(true){Socket socket=s.accept();//无限监听客户的请求 System.out.println(\Connectino accept:\+socket); try{new ServerThread(socket);//创建新线程 }catch(IOException e){socket.close();} } }finally{s.close();}//捕或异常 } }//服务器程序结束
客户程序如下(部分)
客户通过Socket(InetAddress,port)建立与服务器的连接。服务器与客户都通过构造BufferedReader,PrintWriter来建立输入输出流,然后双方通过该输入输出流来相互传递信息,一旦收到客户方的连接请求,服务器accept()方法返回一个新建的Socket对象。客户端然后向服务器发送消息,比如注册,登录,查找好友等,服务器收到来自客户的请求后,针对不同的消息处理请求, 虽然UDP不可靠但是对于icq可靠性并不太重要,而且UDP快速,所以客户间发送信息通过UDP。用户登录时通过类DatagramPacket和DatagramSocket创建UDP包括其本地接受端口以及发送端口,默认端口为5000和5001,通过取得的好友的IP地址来向好友发送消息(send(DatagramPacket)和接受消息(receive(DatagramPacket))。当用户通过UDP收到消息后,可以通过DatagramPacket的方法InetAddress getAddress()得到对方的ip地址,通过对好友列表比较以判断是谁并提示用户收到某某的消息,然后用户选择该用户查看消息,如果好友列表没有该人就显示收到陌生人的消息。用户可以按陌生人按钮查看消息。
用户注册。当服务器收到用户的注册请求,便开始接受客户传第的信息,诸如客户的呢称啦,性别,籍贯,头像,个人资料等,接受完毕后,便通过JdbcOdbc与后台数据库连接,然后向数据库添加记录,如果成功,便向客户返回其Jicq号码,并在数据库中注册用户的IP地址,然后更新其Status为1即用户在线。客户收到服务器返回的信息后,便打开主程序窗口,并同时开始创建UDP以便在用户之间建立联系。
******部分程序如下:
void jButton1_mouseClicked(MouseEvent e) { try{ Socket socket=new Socket(InetAddress.getByName(sername),serverport);//连接服务器 BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream())); PrintWriter out=new PrintWriter(new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true); out.println(\new\);//告诉服务器我要注册 out.println(nickname.getText().trim());//告诉服务器我的呢称,密码,email,资料 out.println(password.getPassword());//以及头像号等信息 out.println(email.getText().trim()); out.println(info.getText().trim()); out.println(place.getSelectedItem()); out.println(headpic.getSelectedIndex());//head picindex int no; no=Integer.parseInt(in.readLine()); //System.out.print(no); String str=\ \; str=in.readLine().trim();//从服务器取得状态 if(str.equals(\false\)) JOptionPane.showMessageDialog(this,\对不起,出错了:- (\,\ok\,JOptionPane.INFORMATION_MESSAGE);//失败就警告 else{//成功就打开主程序 JOptionPane.showMessageDialog(this,\your javaicq#is\+no,\ok\,JOptionPane.INFORMATION_MESSAGE); this.dispose(); MainWin f2=new MainWin(no,sername,serverport); f2.setVisible(true);} //System.out.println(); //}while(!str.equals(\ok\)); // socket.close(); }catch(IOException e1){} } }
用户登录。在客户端,信捷职称论文写作发表网,用户输入其jicq号码和密码,然后建立与服务器的连接,告诉服务器我要登录,服务器收到后,开始通过JdbcOdbc读取数据库,然后与用户输入的信息比较,如果相同就向客户返回成功消息并将其Status字段