⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clientthread.java

📁 java多人版服务器
💻 JAVA
字号:
package serverframe;
import java.io.*;
import java.awt.*;
import java.net.*;
import java.util.*;
import java.awt.event.*;
import javax.swing.*;
import java.sql.*;
/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2006</p>
 * <p>Company: </p>
 * @author not attributable
 * @version 1.0
 */
class ClientThread extends Thread
{
   Socket          cSocket;
   PrintStream     write;//输出流
   BufferedReader  read;//输入流
   ServerThread    sThread;//服务器线程
   public  String[] biaoshi=new String[4];
   JTextArea        sStatus;
   String          m;
   int i=0;
   public String Message;
   public static int ConnectNumber = 0;//连机数目
   ServerFrame frame;
   String[] A={"A","A","B","C","D","E","F"};
   Connection conn=null;//申明一对象便于与特定数据库的连接
   Statement sttm=null;//用于执行静态 SQL 语句并返回它所生成结果的对象。
   String sql="";//用来装sql语句
   ResultSet rs=null;//游标
   String username;//用户名
   String userscore;//分数
   public String name[]=new String[6];//姓名数组
  public String score[]=new String[6];//分数数组
   public ClientThread(Socket cSocket,ServerThread sThread)
   {
      this.cSocket = cSocket;//把serverthread中调用是的直传过来给本地变量
      this.sThread = sThread;

      sStatus      = sThread.frame.ServerStatus;//让文本在同一窗体空件显示

      ConnectNumber++;//客户机人数加一,当在有客户连接时调用该类则人数加1
      //accessinput();

     sThread.messages.addElement(m);
      try
      {

         write = new PrintStream(cSocket.getOutputStream());//得到输出流
         read  = new BufferedReader(
                     new InputStreamReader(cSocket.getInputStream()));//得到输入流
      }
      catch(IOException E)
      {
         System.out.println("发生例外: " + E);
         System.out.println("建立I/O管道失败!");
         System.exit(0);
      }


      m = "talk:"+"="+ "战斗人数: " + ConnectNumber + "请选择"+A[ConnectNumber]+" 区域"+" \n\n";
      sThread.messages.addElement(m);
      sThread.messages.addElement("XUAN="+"请选择"+A[ConnectNumber]+"区域!"+"\n");
   }

   public void run()
   {
      while(true)
      {
         try
         {
             Message = read.readLine();//放在run里一直读取客户端发来的信息
            //并把消息放在message 中
            if(Message!=null)
            if(Message.startsWith("ACNAME"))
            {
              username = Message.substring(6, Message.length());//从读来的数据的地6个开始不他放进username中

            }
            if(Message.startsWith("ACSCORE"))
           {
             userscore = Message.substring(7, Message.length());//从读来的数据的地6个开始不他放进username中
             acceptname();
           }
          if(Message.equals("重新"))
          {
            m="重新";
           sThread.messages.addElement(m);
          }
             sentscore();//向请求看分数的玩家发送分数消息
             synchronized(sThread.messages)
            {
               if(Message != null)
               {
                  if(Message.equals("gameover"))
                  {
                     ConnectNumber--;

                     Message = "talk"+getClientName() + ":" + getClientAddress() +
                               "已离开 ";

                     sStatus.append(Message + " ");
                     sStatus.append("目前连线数: " + ConnectNumber + "\n");

                     sThread.messages.addElement(Message);//让serverthread中的message加上接收到的消息

                     synchronized(sThread.Clients)
                     {
                        sThread.Clients.removeElement(this);//把该线程移出该处
                     }

                     break;
                  }

                  else
                  {
                    /* Message = "来自" + getClientName() + ":" +
                               getClientAddress() + "\n=> " + Message + "\n";*/
                      Message =  Message +"<=>"+ "来自" + getClientName() + ":"+"\n";

                     sThread.messages.addElement(Message);//让serverthread中的message加上接收到的消息
                  }
               }
            }
         }
         catch(IOException E)
         {
            break;
         }
      }
   }

   public String getClientName()//得到客户机名字
   {
      return cSocket.getInetAddress().getHostName();
   }

   public String getClientAddress()//得到客户机地址
   {
      return cSocket.getInetAddress().getHostAddress();
   }

   public void accessinput()//显示数据库
{
  try
 {
   Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
   try
   {
     conn=DriverManager.getConnection("jdbc:odbc:game");
     sttm=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
   }
   catch(SQLException eu)
   {
     System.out.println(eu.getMessage());
   }
 }
 catch(ClassNotFoundException ey)
 {
   System.out.println(ey.getMessage());
 }

 sql="select top 10 * from paihangbang order by score desc";
   try{
     rs=sttm.executeQuery(sql);
     rs.absolute(1);
for(int i=0;i<6;i++)
    {
    name[i]=rs.getString("name");
    score[i]=rs.getString("score");
    rs.next();
 //ServerStatus.append(name[i]+"======="+score[i]+"\n");
    }

     }
  catch(SQLException e){e.printStackTrace();}

 }

 public void sentscore()
 {

if(Message!=null)
   if(Message.equals("AVIEW"))//如果客户断请求看成绩
  { accessinput();
   for(int i=0;i<6;i++)
    { //frame.accessinput();
       m="A成绩:"+name[i]+"====="+score[i]+"\n";
       sThread.messages.addElement(m);
     }
  }
  else    if(Message.equals("BVIEW"))//如果客户断请求看成绩
  {accessinput();
   for(int i=0;i<6;i++)
    { //frame.accessinput();
       m="B成绩:"+name[i]+"====="+score[i]+"\n";
       sThread.messages.addElement(m);
     }
  }

  else    if(Message.equals("CVIEW"))//如果客户断请求看成绩
{accessinput();
 for(int i=0;i<6;i++)
  { //frame.accessinput();
     m="C成绩:"+name[i]+"====="+score[i]+"\n";
     sThread.messages.addElement(m);
   }
}

 else    if(Message.equals("DVIEW"))//如果客户断请求看成绩
 {accessinput();
  for(int i=0;i<6;i++)
   { //frame.accessinput();
      m="D成绩:"+name[i]+"====="+score[i]+"\n";
      sThread.messages.addElement(m);
    }
 }


 else    if(Message.equals("EVIEW"))//如果客户断请求看成绩
 {accessinput();
  for(int i=0;i<6;i++)
   { //frame.accessinput();
      m="E成绩:"+name[i]+"====="+score[i]+"\n";
      sThread.messages.addElement(m);
    }
 }


 else    if(Message.equals("FVIEW"))//如果客户断请求看成绩
 {accessinput();
  for(int i=0;i<6;i++)
   { //frame.accessinput();
      m="F成绩:"+name[i]+"====="+score[i]+"\n";
      sThread.messages.addElement(m);
    }
 }
}

  public void acceptname()
  {
    try
  {
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    try
    {
      conn=DriverManager.getConnection("jdbc:odbc:game");
      sttm=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
    }
    catch(SQLException eu)
    {
      System.out.println(eu.getMessage());
    }
  }
  catch(ClassNotFoundException ey)
  {
    System.out.println(ey.getMessage());
  }
/////////////////////////////////////////////////////
  try
  {
   sql="select * from paihangbang where name='"+username.trim()+"'";//判断此用户是否已经存在于本数据库中
   //sql="select * from paihangbang where name="+"'"+username.getText().trim()+"'";
    rs=sttm.executeQuery(sql);
    rs.absolute(1);
    if(!rs.isFirst())//如果不存在此用户,则插入数据
    {
     sql="insert into paihangbang values ('"+username.trim()+"','"+userscore.trim()+"')";
     int i=sttm.executeUpdate(sql);
     if(i==1)
     {
       m="talk===进入排行榜成功!";
      sThread.messages.addElement(m);

     }
     else
     {
       m="talk===进入排行榜成功!";
      sThread.messages.addElement(m);
     }
    }
    else//如果此用户已经存在,则更新用户的成绩
    {

      int newscore=Integer.parseInt(userscore.toString());
      int oldscore=rs.getInt(2);
      //System.out.println(score);
      if(oldscore<newscore)//当用户已经存在是,我们要判断此次分数是否比原来的分数高
      {
        sql = "update paihangbang set score='" + newscore + "'where name='" +
            username.trim() + "'";
        int i = sttm.executeUpdate(sql);
        if (i == 1) {
          m="talk===进入排行榜成功!";
       sThread.messages.addElement(m);

        }
        else {
          m="talk===进入排行榜成功!";
      sThread.messages.addElement(m);
        }
      }
      else
      {
        m="talk===你还要加油哦!";
       sThread.messages.addElement(m);

      }

    }
  }
  catch(SQLException ee)
  {
    System.out.println(ee.getMessage());
  }

  try
  {
    conn.close();
    sttm.close();
    rs.close();
  }
  catch(SQLException er)
  {
    System.out.println(er.getMessage());
  }

  }
   public void finalize()//关闭各个流
   {
      try
      {
         read.close();
         write.close();
         cSocket.close();
      }
      catch(IOException E){}

      cSocket = null;
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -