AppServer.java
上传用户:tendy5003
上传日期:2022-07-16
资源大小:210k
文件大小:9k
源码类别:

ICQ/即时通讯

开发平台:

Java

  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import java.io.*;
  4. import java.net.*;
  5. import java.util.*;
  6. import javax.swing.*;
  7. import java.util.*;
  8. /**
  9.  * <p>Title: HappyChat聊天系统服务器程序</p>
  10.  * <p>Description: 聊天服务器</p>
  11.  * <p>Copyright: Copyright (c) 2006</p>
  12.  * <p>Filename: AppServer.java</p>
  13.  * @author 刘志成
  14.  * @version 1.0
  15.  */
  16. //封装登录信息
  17. class Customer implements Serializable
  18. {
  19. String custName;
  20. String custPassword;
  21. }
  22. //封装注册信息
  23. class Register_Customer extends Object implements java.io.Serializable
  24. {
  25.      String custName;
  26.      String custPassword;
  27.      String age;
  28.      String sex;
  29.      String email;
  30. }
  31. //用于发送聊天和在线用户的信息  
  32. class Message implements Serializable
  33. {
  34.    Vector userOnLine;
  35.    Vector chat;
  36. }
  37. //聊天信息序列化
  38. class Chat implements Serializable
  39. {
  40. String  chatUser;
  41. String  chatMessage;
  42. String  chatToUser;
  43. boolean whisper;
  44. }  
  45. //退出信息序列化
  46. class Exit1 implements Serializable
  47. {
  48.     String exitname;
  49. }
  50. //////////*创建服务器*//////////
  51. public class AppServer extends Thread
  52. {
  53. ServerSocket serverSocket;
  54. ServerFrame sFrame;
  55. static Vector u=new Vector(1,1);
  56. static Vector v=new Vector(1,1);
  57. public AppServer()
  58. {
  59.   sFrame=new ServerFrame();
  60.   try
  61.   {
  62. serverSocket = new ServerSocket(1001);
  63. //获取服务器的主机名和IP地址
  64. InetAddress address = InetAddress.getLocalHost();      
  65.     sFrame.txtServerName.setText(address.getHostName());
  66.     sFrame.txtIP.setText(address.getHostAddress());
  67.     sFrame.txtPort.setText("1001");
  68. }
  69. catch(IOException e)
  70. {
  71. fail(e,"不能启动服务!");
  72. }
  73. sFrame.txtStatus.setText("已启动...");
  74. this.start();    //启动线程
  75. }
  76. public static void fail(Exception e,String str)
  77. {
  78. System.out.println(str+" 。"+e);
  79. }
  80. //////////*监听客户的请求*//////////
  81. public void run()
  82. {
  83. try
  84. {
  85. while(true)
  86. {
  87. //监听并接受客户的请求
  88. Socket client = serverSocket.accept();
  89.     Connection con = new Connection(client,u,v);   //支持多线程
  90. }
  91. }
  92. catch(IOException e)
  93. {
  94. fail(e,"不能监听!");
  95. }
  96.     }
  97.     
  98.     
  99.     //////////*启动服务器*//////////
  100.     public static void main(String args[])
  101.     {
  102.      new AppServer();
  103.     }
  104. }
  105. //////////*处理线程*//////////
  106. class Connection extends Thread
  107. {
  108. protected Socket netClient;
  109. Vector userOnline;
  110. Vector userChat;
  111. protected ObjectInputStream fromClient;  //从客户到服务器
  112. protected PrintStream toClient; //传导客户端
  113. static Vector  vList = new Vector();
  114. Object obj;
  115. public Connection(Socket client,Vector u,Vector c)
  116. {
  117. netClient = client;
  118. userOnline=u;
  119. userChat=c;
  120. try
  121. {
  122. //发生双向通信
  123.                                    //检索客户输入
  124. fromClient = new ObjectInputStream(netClient.getInputStream());
  125.                                    //服务器写到客户
  126. toClient = new PrintStream(netClient.getOutputStream());
  127. }
  128. catch(IOException e)
  129. {
  130. try
  131. {
  132. netClient.close();
  133. }
  134. catch(IOException e1)
  135. {
  136. System.out.println("不能建立流"+e1);
  137. return;
  138. }
  139. }
  140. this.start();
  141. }
  142. public void run()
  143. {
  144.  try
  145. {//obj是Object类的对象
  146. obj = (Object)fromClient.readObject();
  147. if(obj.getClass().getName().equals("Customer"))
  148. {
  149.     serverLogin();
  150. }
  151. if(obj.getClass().getName().equals("Register_Customer"))
  152. {
  153.     serverRegiste();
  154. }
  155.     if(obj.getClass().getName().equals("Message"))
  156.     {
  157.         serverMessage();
  158.     }
  159.     if(obj.getClass().getName().equals("Chat"))
  160.     {
  161.         serverChat();
  162.     }
  163.     if(obj.getClass().getName().equals("Exit1"))
  164.     {
  165.         serverExit();
  166.     }
  167. }
  168. catch(IOException e)
  169. {
  170. System.out.println(e);
  171. }
  172. catch(ClassNotFoundException e1)
  173. {
  174. System.out.println("读对象发生错误!"+e1);
  175. }
  176. finally
  177. {
  178. try
  179. {
  180. netClient.close();
  181. }
  182. catch(IOException e)
  183. {
  184. System.out.println(e);
  185. }
  186. }
  187. }
  188. /**********登录处理**********/
  189. public void serverLogin()
  190. {
  191.     
  192.     try
  193.     {
  194.     Customer clientMessage2 = (Customer)obj;
  195.          
  196.             //读文件
  197.             FileInputStream file3 =new FileInputStream("user.txt");
  198.     ObjectInputStream objInput1 = new ObjectInputStream(file3);
  199.     vList=(Vector)objInput1.readObject(); 
  200.     
  201.     int find=0;  //查找判断标志
  202.     System.out.println(find);
  203.     for(int i=0;i<vList.size();i++)
  204.     {     
  205.        Register_Customer reg=(Register_Customer)vList.elementAt(i);
  206.           
  207.        if ( reg.custName.equals(clientMessage2.custName) )
  208.        {
  209.            find=1; 
  210.            if( !reg.custPassword.equals(clientMessage2.custPassword) )
  211.            {
  212.                toClient.println("密码不正确");
  213.                break;
  214.            }
  215.            else
  216.            {
  217.                //判断是否已经登录
  218.                int login_flag=0;
  219.                for(int a=0;a<userOnline.size();a++)
  220.                {
  221.                    if( clientMessage2.custName.equals(userOnline.elementAt(a)))
  222.                    {
  223.                     login_flag=1;
  224.                     break;
  225.                    }
  226.                }
  227.                
  228.                if (login_flag==0)
  229.                {
  230.                    userOnline.addElement(clientMessage2.custName);  //将该用户名何在
  231.                    toClient.println("登录成功");
  232.                    Date t=new Date();
  233.                    System.out.println("用户"+clientMessage2.custName+"登录成功,"+
  234.                                       "登录时间:"+t.toLocaleString()+"n");
  235.                     break;
  236.                 }
  237.                 else
  238.                 {
  239.                     toClient.println("该用户已登录");
  240.                 }
  241.            } 
  242.        }
  243.        else
  244.        {
  245.            continue;
  246.        }    
  247.     }
  248.     if (find == 0)
  249.     {
  250.        toClient.println("没有这个用户,请先注册");
  251.         }
  252.         
  253.         file3.close();
  254.     objInput1.close();
  255.     fromClient.close();
  256.     }
  257.     catch(ClassNotFoundException e)
  258.    {
  259.    System.out.println(e);
  260.    }
  261.    catch(IOException e)
  262.    {
  263.    System.out.println(e);
  264.    }
  265. }
  266. /**********注册处理**********/
  267.      public void serverRegiste()
  268.     {
  269.      try
  270.      {
  271.         int flag=0;  //是否重名判断标志
  272. Register_Customer clientMessage =(Register_Customer)obj;
  273.         File fList=new File("user.txt");
  274.        if(fList.length()!= 0)//判断是否是第一个注册用户
  275.        {
  276.          ObjectInputStream objInput = new ObjectInputStream(new FileInputStream(fList));
  277. vList=(Vector)objInput.readObject(); 
  278. //判断是否有重名
  279. for(int i=0;i<vList.size();i++)
  280. {
  281.   Register_Customer reg=(Register_Customer)vList.elementAt(i);
  282.       if(reg.custName.equals(clientMessage.custName))
  283.           {
  284.            toClient.println("注册名重复,请另外选择");
  285.             flag=1;
  286.               break;
  287.            }
  288. }
  289.        }
  290.       if (flag==0)
  291.       {
  292. //添加新注册用户
  293. vList.addElement(clientMessage);
  294. //将向量中的类写回文件
  295. FileOutputStream file = new FileOutputStream(fList);
  296. ObjectOutputStream objout = new ObjectOutputStream(file);
  297. objout.writeObject(vList);
  298.      
  299. //发送注册成功信息
  300.         toClient.println(clientMessage.custName+"注册成功");
  301.         Date t=new Date();
  302.         //append("用户"+clientMessage.custName+"注册成功!;注册时间:"+t.toLocaleString()+"n");
  303.         System.out.println("用户"+clientMessage.custName+"注册成功, "+
  304.                            "注册时间:"+t.toLocaleString()+"n");
  305.     
  306.         file.close();
  307.         objout.close();
  308.         fromClient.close();
  309.     }
  310.     }
  311.     catch(ClassNotFoundException e)
  312.    {
  313.    System.out.println(e);
  314.    }
  315.    catch(IOException e)
  316.    {
  317.    System.out.println(e);
  318.    }
  319.     }
  320.     
  321.     /**********发送信息处理**********/
  322.     public void serverMessage()
  323.     {
  324.         try
  325.         {
  326.          Message mess=new Message();
  327.             mess.userOnLine=userOnline;
  328.             mess.chat=userChat;
  329.         
  330.             ObjectOutputStream outputstream=new ObjectOutputStream(netClient.getOutputStream());
  331.             outputstream.writeObject((Message)mess);
  332.             
  333.             netClient.close();
  334.             outputstream.close();
  335.         }    
  336.         catch(IOException e)
  337.       {
  338.       }
  339.         
  340.     }
  341.     
  342.     /**********增加信息处理**********/
  343. public void serverChat()
  344.    {
  345.    //将接收到的对象值赋给聊天信息的序列化对象
  346.    Chat cObj = new Chat();
  347.    cObj = (Chat)obj;
  348.   
  349.    //将聊天信息的序列化对象填加到保存聊天信息的矢量中
  350.    userChat.addElement((Chat)cObj);
  351.    return;
  352.    }    
  353.   
  354.    /**********用户退出处理**********/
  355.    public void serverExit()
  356.    {
  357.    Exit1  exit1=new Exit1();
  358.    exit1=(Exit1)obj;
  359.      
  360.    userOnline.removeElement(exit1.exitname);  //将该用户删除
  361.    Date t=new Date();
  362.   
  363.    System.out.println("用户"+exit1.exitname+"已经退出, "+
  364.                       "退出时间:"+t.toLocaleString()+"n");
  365.    }
  366. }