2015-02-09 62 views
0

我制作了客户机服务器应用程序,它将每个新线程连接到新客户机。我想发送信息给服务器,如在拍卖系统中竞价上涨。如何检查客户端类中的线程是否与服务器类中的线程相同?如果不能如何检查服务器端的哪个线程是客户端?客户机/服务器应用程序中的线程

package com.multi; 


import java.io.IOException; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

import oracle.jdbc.driver.OracleDriver; 

public class Server { 

    public static final int PORT = 5545; 
    public static int I = 1; 
    public static String[] users = null; 
    private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE"; 
    Connection conn = null; 
    Statement stmt = null; 
    private static final String DB_USER = "DBDEMO"; 
    private static final String DB_PASSWORD = "******"; 
    private ResultSet res; 
    private String sql = null; 
    public void startDataBase() { 
     try { 
      DriverManager.registerDriver(new OracleDriver()); 
      conn = DriverManager.getConnection(URL, DB_USER, DB_PASSWORD); 
      System.out.println("conn done"); 
      conn.setAutoCommit(false); 
      conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void runQuery(){ 
     try { 
      stmt = conn.createStatement(); 
      res = stmt.executeQuery("select * from ITEAMS"); 
      System.out.println("query works"); 
      while(res.next()){ 
       System.out.println(res.getString("DESCRIBE")); 
      } 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void startServer() { 
     try { 
      ServerSocket server = new ServerSocket(PORT); 
      System.out.println("Server is waiting for connetions..."); 
      startDataBase(); 
      runQuery(); 
      while (true) { 

       Socket socket = server.accept(); 
       if (socket.isBound()) { 

        System.out.println("user" + I + " connected"); 
        ++I; 
       } 
       new ServerThread(socket).start(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     new Server().startServer(); 
    } 

} 

// serverthreads

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 

public class ServerThread extends Thread { 
    Socket socket; 
    String message = null; 


    ServerThread(Socket socket) { 
     this.socket = socket; 
    } 
    public void run(){ 
     try { 

      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      while ((message = bufferedReader.readLine()) != null){ 
       System.out.println(message); 
      } 
      socket.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

} 

//客户

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTextField; 

public class Client extends JFrame{ 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    private static String[] names = new String[]{ "Sara", "Jessica", "Tom", "Emanuel", "Joshua", 
      "Kristin", "Kirito", "Goku", "Bulma" }; 
    private JTextField chatWindow; 
    private static int c = 0; 

    public void clientJoin(String name) { 


      try { 
       chatWindow = new JTextField(); 
       add(new JScrollPane(chatWindow)); 
       setSize(300, 150); 
       setVisible(true); 
       Socket socket = new Socket("localhost", 5545); 
       chatWindow.setText(name); 
       PrintWriter printWriter = new PrintWriter(
         socket.getOutputStream(), true); 
       BufferedReader bufferedReader = new BufferedReader(
         new InputStreamReader(System.in)); 
       // System.out.println(name); 

       // System.out.println(name); 
//    while (true) { 
//     String readerInput = bufferedReader.readLine(); 
       for(int i = 0 ; i < 3;i++){ 
       printWriter.print(name+":"); 
       printWriter.println(c+=5+10*Math.random()); 
        } 
//    } 

      } catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 

      } 

    } 

    public static void main(String[] args) { 
     for(String name : names) { 
      Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        new Client().clientJoin(name); 
       } 
      }; 
      new Thread(r).start(); 
      // System.out.println("ges here"); 
      c++; 
     } 

    } 

} 

回答

1

我如何检查,如果线程在客户端类是相同服务器类?

除非ClientServer类在同一JVM(在相同的机器相同的工艺上和即)运行时,它们不能共享线程。他们不可能是一样的。

此外,由于客户端和服务器线程是不同类的实例:分别为ThreadServerThread。这意味着,即使ClientServer在同一个JVM中实例化,各个线程仍然不能相同。

(不同类的两个对象不能是相同的。特别是线程,因为线程平等是由物体的身份确定。)


正如你所看到的,这个问题没有什么意义,如果你理解它的字面。如果你真的想要问一些不同的东西......你需要澄清这个问题。

相关问题