初学socket(ServerThread.java)

/*
 * ServerThread.java
 *
 * Created on 13 November 2006, 16:07
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

import java.io.*;
import java.net.*;
import java.util.*;

/**
 * The threads spun from the NewShop server to process client requests
 * @author dsi06dh Dave Hollowell
 * @version 0.1 23rd November 2006
 */
public class ServerThread implements Runnable
{
    /**
     * reference to the server GUI display
     */
    private ServerGui theDisplay;
    /**
     * Reference to the warehaouse instance to use
     */
    private Warehouse theWarehouse;
    /**
     * reference to the client socket
     */
    private Socket theSocket;
    /**
     * Reference to the client number
     */
    private int theClient;
    /**
     * The incoming object data stream
     */
    private ObjectInputStream in = null;
    /**
     * The outgoing object data stream
     */
    private ObjectOutputStream out = null;
    /**
     * Continue to process the requests
     */
    private boolean process = true;
    /**
     * the customer details
     */
    private Customer cust;
    /**
     * The branch details
     */
    private Branch theBranch;
           
    /**
     * End of line character
     */
    private static final String NEWLINE = System.getProperty("line.separator");
   
    /**
     * Creates a new instance of ServerThread
     * @param clientNo Numeric reference to the client
     * @param clientSocket Socket number for the client
     * @param aWarehouse Reference to the required warehouse instance
     * @param display Reference to the required server GUI display
     */
    public ServerThread(int clientNo, Socket clientSocket,
            Warehouse aWarehouse, ServerGui display)
    {
        theClient = clientNo;
        theSocket = clientSocket;
        theWarehouse = aWarehouse;
        theDisplay = display;
    }
   
    /**
     * Runnable implementation of the server thread
     */
    public void run()
    {
        theDisplay.statusMessage("Client " + theClient +
                        " Thread started" + NEWLINE);
        try
        {
            in = new ObjectInputStream((theSocket.getInputStream()));
        }
        catch (IOException e)
        {
            theDisplay.statusMessage("Client " + theClient +
                    " inbound connection failed" + NEWLINE);
            System.exit(-1);
        }
        try
        {
            out = new ObjectOutputStream((theSocket.getOutputStream()));
        }
        catch (IOException e)
        {
            theDisplay.statusMessage("Client " + theClient +
                    " outbound connection failed" + NEWLINE);
            System.exit(-1);
        }  
        while(process)
        {
            // get incoming details
            TransmissionData mess = null;
            try
            {
                mess = (TransmissionData) in.readObject();
            }
            catch (IOException e)
            {
                theDisplay.statusMessage("Client " + theClient +
                    " read failed" + NEWLINE);
                System.exit(-1);
            }
            catch (ClassNotFoundException e)
            {
                theDisplay.statusMessage(e.getMessage());
            }
            // procees the incoming message
            mess = processRequest(mess);
            if (process)
            {
                try
                {
                    out.writeObject((TransmissionData) mess);
                }
                catch (IOException e)
                {
                    theDisplay.statusMessage("Client " + theClient +
                        " send failed" + NEWLINE);
                    System.exit(-1);
                }
            }
        }
        theDisplay.statusMessage("Client " + theClient +
                        " Thread completed" + NEWLINE);
    }
   
    /**
     * Process requests from the transmission details
     * @param details Incoming transmission details
     * @return Outqoing transmission details
     */
    private TransmissionData processRequest(TransmissionData details)
    {
        TransmissionData input = details;
        TransmissionData output = null;
        // login requested
        if (input.getDataType() == TransmissionData.CLT_LOGIN)
        {
            output = processLogin(input);
        }
        // branch selected
        if (input.getDataType() == TransmissionData.CLT_BRANCH)
        {
            output = processBranch(input);
        }
        // client order completion requested
        if (input.getDataType() == TransmissionData.CLT_COMPLETE)
        {
            output = processOrder(input);
        }
        // client closedown requested
        if (input.getDataType() == TransmissionData.CLT_CLOSE)
        {
            processClose();
            output = null;
        }
        return output;
    }
   
    /**
     * Process a login request
     * @param details incoming transmission details
     * @return Outgoing transmission details
     */
    private TransmissionData processLogin(TransmissionData details)
    {
        TransmissionData input = details;
        TransmissionData output = null;
        // determine customer sent
        String custCode;
        custCode = (String) input.getData();
        theDisplay.statusMessage("Client " + theClient + " Login request "
                + custCode + NEWLINE);
        cust = theWarehouse.getCustomer(custCode);
        // customer exists?
        if (cust == null)
        {
            theDisplay.statusMessage("Client " + theClient +
                    " Customer refused" + NEWLINE);
            output = new TransmissionData(TransmissionData.SRV_ERROR,
                "Customer does not exist.");
        }
        else
        {
            String data1, data2;
            // send branch details
            String branchData = theWarehouse.getBranchCodes_Names();
            StringTokenizer st = new StringTokenizer(branchData, "*");           
            Vector branchList = new Vector();
            while (st.hasMoreTokens())
            {
                data1 = st.nextToken();
                if (!(data1.equals("END")))
                {
                    data2 = st.nextToken();
                    Branch tempBranch = new Branch(data1, data2);
                    branchList.addElement(tempBranch);
                }
            }
            theDisplay.statusMessage("Client " + theClient +
                    " Customer accepted" + NEWLINE);
            output = new TransmissionData(TransmissionData.SRV_BRANCHLIST,
                    branchList);
        }
        return output;
    }
   
    /**
     * Process a branch request
     * @param details incoming transmission details
     * @return Outgoing transmission details
     */
    private TransmissionData processBranch(TransmissionData details)
    {
        TransmissionData input = details;
        TransmissionData output = null;
        String branchRequest = (String) input.getData();
        theDisplay.statusMessage("Client " + theClient +
                    " Branch request " + branchRequest + NEWLINE);
        //theBranch = theWarehouse.getBranch(branchRequest);
        String stockData = theWarehouse.getBranchStockList(branchRequest);
        String data1, data2, data3;
        int data4;
        // send branch item details
        StringTokenizer st = new StringTokenizer(stockData, "*");           
        Vector stockList = new Vector();
        while (st.hasMoreTokens())
        {
            data1 = st.nextToken();
            if (!(data1.equals("END")))
            {
                data2 = st.nextToken();
                data3 = st.nextToken();
                data4 = Integer.parseInt(st.nextToken());
                StockItem tempItem = new StockItem(data1, data2, data3,
                        data4);
                stockList.addElement(tempItem);
            }
        }
        theDisplay.statusMessage("Client " + theClient +
                    " Branch accepted" + NEWLINE);
        output = new TransmissionData(TransmissionData.SRV_STOCKLIST,
                stockList);
        return output;
    }
   
    /**
     * Process a client complete order request
     * @param details incoming transmission details
     * @return outgoing transmission details
     */
    private TransmissionData processOrder(TransmissionData details)
    {
        theDisplay.statusMessage("Client " + theClient +
                " complete Order requested" + NEWLINE);
        TransmissionData input = details;
        TransmissionData output = null;
        String basketDetails;
        basketDetails = cust.getCustomerCode() + "*";
        // warning issued in compilation due to unchecked cast from
        // input.getData() returning an object - see Generics
        Vector items = (Vector) input.getData();
        Iterator it = items.iterator();
        while (it.hasNext())
        {
            BasketItem line = (BasketItem) it.next();
            basketDetails = basketDetails + line.getItemCode() + "*";
            basketDetails = basketDetails + line.getDescription() + "*";
            basketDetails = basketDetails + line.getPrice() + "*";
            basketDetails = basketDetails + line.getNumberOrdered() + "*";
        }
        basketDetails = basketDetails + "END*";
        String orderNo = theWarehouse.processBasket(basketDetails);
        output = new TransmissionData(TransmissionData.SRV_ORDER, orderNo);
        theDisplay.statusMessage("Client " + theClient +
                " Order " + orderNo + " completed" + NEWLINE);
        return output;
    }
    /**
     * Process a client closedown request
     */
    private void processClose()
    {
        theDisplay.statusMessage("Client " + theClient +
                " shutdown requested." + NEWLINE);
        try
        {
            theSocket.close();
        }
        catch (IOException e)
        {
            theDisplay.statusMessage("Client " + theClient +
                " shutdown exception " +e.getMessage() + NEWLINE);
        }
        try
        {
            in.close();
        }
        catch (IOException e)
        {
            theDisplay.statusMessage("Client " + theClient +
                " read close exception " +e.getMessage() + NEWLINE);
        }
        try
        {
            out.close();
        }
        catch (IOException e)
        {
            theDisplay.statusMessage("Client " + theClient +
                " write close exception " +e.getMessage() + NEWLINE);
        }
        process = false;
    }
}
 

你可能感兴趣的:(初学socket(ServerThread.java))