2015-02-09 106 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中實例化,各個線程仍然不能相同。

(不同類的兩個對象不能是相同的。特別是線程,因爲線程平等是由物體的身份確定。)


正如你所看到的,這個問題沒有什麼意義,如果你理解它的字面。如果你真的想要問一些不同的東西......你需要澄清這個問題。

相關問題