簡體   English   中英

我無法在Java套接字程序中將多個傳感器連接到服務器

[英]I can't connect more than one sensor to the server in my java socket program

我已經實現了使用套接字的服務器和客戶端。 在那多個客戶端必須能夠連接。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Set;

import sensors.FireAlarmSensor;

public class SensorServer {
    private static final int port = 9000;
    private static HashMap<String, PrintWriter> fireSensorPrintersList = new HashMap<String, PrintWriter>();
    private static HashMap<String,FireAlarmSensor> fireSensorsList = new HashMap<String,FireAlarmSensor>();

    private static String sensorIDNumber;
    private static double temperatureLevel;
    private static double CO2Level;
    private static double batteryLevel;
    private static double smokeLevel;

    public static void main(String args[]){
        System.out.println("Sensor Server Is Running");
        ServerSocket clientListener = null;
        try {
            clientListener = new ServerSocket(port);
            new sensorHandler(clientListener.accept()).start();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            try {
                clientListener.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }   
    }

    public static class sensorHandler extends Thread{
        private String sensorID;
        private Socket socket;
        private BufferedReader receiver;
        private PrintWriter sender;

        public sensorHandler(Socket socket) {
            this.socket = socket;
            try {
                this.receiver = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                this.sender = new PrintWriter(socket.getOutputStream(),true);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        @Override
        public void run(){
            while(true){
                sender.println("REQUESTID");
                try {
                    sensorID = receiver.readLine();             
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                if(sensorID == null){
                    System.out.println("Empty Sensor ID");
                }

                synchronized (fireSensorPrintersList) {
                    if(!fireSensorPrintersList.containsKey(sensorID)){
                        fireSensorPrintersList.put(sensorID,sender);
                        break;
                    }   
                }               
            }

            sender.println("SENSORACCEPTED");
            try{
                while(true){
                    //Set<String> sensorIDList= fireSensorPrintersList.keySet();
                    /*for(PrintWriter writer:fireSensorPrintersList.values()){
                        sensorIDNumber = fireSensorsList.get(sensorIDList).getSensorID();
                        temperatureLevel = fireSensorsList.get(sensorIDList).getTemperatureLevel();
                        batteryLevel = fireSensorsList.get(sensorIDList).getBatteryLevel();
                        CO2Level = fireSensorsList.get(sensorIDList).getCO2Level();
                        smokeLevel = fireSensorsList.get(sensorIDList).getSmokeLevel();
                    }*/

                    /*try {
                        Thread.sleep(3000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }*/
                }   
            }
            finally {
                try {
                    socket.close();
                    System.out.println("Sensor server closed");
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
}

這是客戶端(傳感器)的代碼。

package sensors;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.Serializable;
import java.net.Socket;
import java.util.Scanner;

public class FireAlarmSensor implements Serializable{
    BufferedReader lineIn;
    PrintWriter lineOut;

    private String sensorID = "Not Set";
    private BatterySensor batterySensor;
    private TemperatureSensor temperatureSensor;
    private SmokeSensor smokeSensor;
    private CO2Sensor co2Sensor;

    public FireAlarmSensor(String sensorID){
        this.sensorID = sensorID;
        this.batterySensor = new BatterySensor();   
        this.temperatureSensor = new TemperatureSensor();
        this.smokeSensor = new SmokeSensor();
        this.co2Sensor = new CO2Sensor();
    }

    public FireAlarmSensor(){
        /*JFrame frame = new JFrame();
        frame.setSize(500, 500);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);*/
    }

    public String getSensorID(){
        return this.sensorID;
    }

    public double getBatteryLevel(){
        return batterySensor.getSensorData();
    }

    public double getTemperatureLevel(){
        return temperatureSensor.getSensorData();
    }

    public double getSmokeLevel(){
        return smokeSensor.getSensorData();
    }

    public double getCO2Level(){
        return co2Sensor.getSensorData();
    }

    public void run(){
        String serverAddress = "localhost";
        Socket socket = null;

        try {
            socket = new Socket(serverAddress,9000);
            lineIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            lineOut = new PrintWriter(socket.getOutputStream(),true);

            while(true){
                String serverInput = lineIn.readLine();
                if(serverInput.startsWith("REQUESTID")){
                    Scanner userInput = new Scanner(System.in);
                    System.out.print("Enter the Sensor ID : ");
                    String sensorID = userInput.nextLine();
                    lineOut.println(sensorID);
                }
                else if(serverInput.startsWith("SENSORACCEPTED")){
                    System.out.println("Sensor Is Accepted");
                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        /*finally{
            try {
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }*/
    }

    public static void main(String args[]){
        FireAlarmSensor sensor = new FireAlarmSensor();
        sensor.run();
    }
}

服務器在我的程序中運行正常。 它不會隨時崩潰,並且第一個傳感器也可以與服務器連接,也永遠不會崩潰。 但是,當嘗試通過運行FireAlarmSensor.class文件將另一個傳感器連接到服務器時,第二個傳感器給我以下異常並崩潰。

java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sensors.FireAlarmSensor.run(FireAlarmSensor.java:64)
at sensors.FireAlarmSensor.main(FireAlarmSensor.java:96)

我正在使用Eclipse Neon在同一台計算機上運行服務器和所有傳感器。

Client(Sensor)中從16到27的行會導致錯誤,因為我尚未上傳該Java文件。請在運行時注釋或刪除它們。

main方法僅調用一次accept一次,因此只有一個客戶端可以連接也就不足為奇了。 嘗試循環接受客戶端:

private static boolean shouldExit = false;

public static void main(String args[]) {
    System.out.println("Sensor Server Is Running");

    try (ServerSocket listener = new ServerSocket(port)) {
        acceptLoop(listener);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private static void acceptLoop(ServerSocket listener) throws IOException {
    while (!shouldExit) {
        // accept() blocks until a connection is made
        Socket client = listener.accept();
        new sensorHandler(client).start();
    }
}

這將永遠循環下去,接受新客戶,直到您將shouldExit設置為true為止。 主線程,即。

我已經自由使用了Java 7 try -with-resources語句( try (ServerSocket listener = ...) )。 它實際上完成了令人費解的try-catch-finally所做的工作-自動關閉ServerSocket。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM