편집 기록

편집 기록
  • 프로필 엽토군님의 편집
    날짜2019.11.14

    자바 소켓 프로그래밍 간단한 문제 질문입니다


    자바 소켓 프로그래밍으로 멀티쓰레드 계산기를 만드는 중입니다.. 그런데 어느 이유에선지 서버에서 읽어오는 부분에서 진행이 되지 않아요... 문제가 무엇일까요? 삼일동안 구글링했는데 원인을 모르겠습니다. 단 UTF 말고 아스키코드로 발신수신해야 합니다.

    서버

    import java.io.*;
    import java.net.*;
    
    public class Server implements Runnable 
    {
        static int max = 5; //maximum thread's number
        static int i = 0, count = 0; //i for for-loop, count for count number of threads
    
        public static void main(String args[]) throws IOException 
        {
            ServerSocket serverSocket = new ServerSocket(6789); //open new socket
            File file = new File("src/serverinfo.dat"); //make data file to save server info.
            System.out.println("Maximum 5 users can be supported.\nWaiting...");
    
            for(i=0; i <= max; i++) { new Connection(serverSocket); } //make sockets - loop for max(=5) times
    
            try //server information file writing
            { 
                String dataString = "Max thread = 5\nServer IP = 127.0.0.1\nServer socket = 6789\n";
                @SuppressWarnings("resource")
                FileWriter dataFile = new FileWriter(file);
                dataFile.write(dataString);
            }
            catch(FileNotFoundException e) { e.printStackTrace(); }
            catch(IOException e) { e.printStackTrace(); }
        }
    
    
        static class Connection extends Thread
        {
            private ServerSocket serverSocket;
    
            public Connection(ServerSocket serverSock)
            {
                this.serverSocket = serverSock;
                start();
            }
    
            public void run()
            { 
                Socket acceptSocket = null;
                BufferedReader inFromClient = null;
                DataOutputStream msgToClient = null;
                String receiveString = null;
                String result = "", sys_msg = "";
    
                try
                {
                    while(true)
                    {
                        acceptSocket = serverSocket.accept(); // 접속수락 소켓
                        count++;
    
                        inFromClient = new BufferedReader(new InputStreamReader(acceptSocket.getInputStream()));
                        msgToClient = new DataOutputStream(acceptSocket.getOutputStream());
                        System.out.println(count + "th client connected: " + acceptSocket.getInetAddress().getHostName() + "    " + count + "/" + max);
                        System.out.println("Waiting response...");
    
                        while(true)
                        {
    
                            if (count >= max+1) // if 6th client tries to access
                            {
                                System.out.println("Server is too busy. " + max + " clients are already connected. Client access denied.");
                                sys_msg = "DENIED";
                                msgToClient.writeBytes(sys_msg);
                                acceptSocket.close();
                                count--;
                                break;
                            }
    
                            try{ msgToClient.writeBytes(result); }
                            catch(Exception e) {}
    
                            try{ receiveString = inFromClient.readLine(); }
                            catch(Exception e) // if receiveString = null
                            {
                                System.out.println("Connection Close");
                                count--;
                                break;
                            }
    
                            System.out.println("Input from client : " + receiveString);
    
                            try
                            {       
    
                                if(receiveString.indexOf("+") != -1) { result = cal("+", receiveString); }
                                else if(receiveString.indexOf("-") != -1) { result = cal("-", receiveString); }
                                else if(receiveString.indexOf("/") != -1) { result = cal("/", receiveString); }
                                else if(receiveString.indexOf("*") != -1) { result = cal("*", receiveString); }
                                else if(receiveString.indexOf("+") == -1 || receiveString.indexOf("-") == -1 || receiveString.indexOf("*") == -1 || receiveString.indexOf("/") == -1) { result = "No INPUT or Invalid operation"; }
                            }
                            catch(Exception e){ result = "Wrong INPUT"; }
    
                            try{ msgToClient.writeBytes(result); }
                            catch(Exception e) {}
                        }
                    }
                }
                catch(IOException e) { e.printStackTrace(); }
            }
        }
    
        private static String cal(String op, String recv) //function for calculating
        {
            double digit1, digit2; //first number, second number
    
            String result = null;
    
            digit1 = Integer.parseInt(recv.substring(0, recv.indexOf(op)).trim());
            digit2 = Integer.parseInt(recv.substring(recv.indexOf(op)+1, recv.length()).trim());
    
            if(op.equals("+")) { result = digit1 + " + " + digit2 + " = " + (digit1 + digit2); }
            else if(op.equals("-")) { result = digit1 + " - " + digit2 + " = " + (digit1 - digit2); }
            else if(op.equals("*")) { result = digit1 + " * " + digit2 + " = " + (digit1 * digit2); }
            else if(op.equals("/"))
            {
                if(digit2 == 0){ result = "ERROR OCCURRED: Cannot be divided by ZERO"; }
                else{ result = digit1 + " / " + digit2 + " = " + (digit1 / digit2); }
            }
            return result;
        }
    
        @Override
        public void run() {
      //    TODO Auto-generated method stub
        }
    }
    

    클라이언트

    import java.io.*;
    import java.net.*;
    
    public class Client {
        public static void main(String args[]) throws IOException
        {
            Socket clientSocket = null;
    
            BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
            BufferedReader inFromServer = null;
            DataOutputStream msgToServer = null;
    
            String sendString = "", receiveString = "";
    
            try
            {
                clientSocket = new Socket("127.0.0.1", 6789); //make new clientSocket
                inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                msgToServer = new DataOutputStream(clientSocket.getOutputStream());
    
                System.out.println("Input exit to terminate");
                System.out.println("Connection Success... Waiting for permission");
    
                while(true)
                {
                    receiveString = inFromServer.readLine();
                    if(receiveString.equals("DENIED"))
                    {
                        System.out.println("Server is full. Try again later.");
                        break;
                    }
                    else { System.out.println("Connection permitted."); }
    
                    System.out.print("Input an expression to calculate(ex. 3+1): ");
                    sendString = userInput.readLine();
    
                    if(sendString.equalsIgnoreCase("exit")) //when user input is "exit" -> terminate
                    {
                        clientSocket.close();
                        System.out.println("Program terminated.");
                        break;
                    }
    
                    try { msgToServer.writeBytes(sendString); }
                    catch(Exception e) {}
    
                    try { receiveString = userInput.readLine(); }
                    catch(Exception e) {}
    
                    System.out.println("Result: " + receiveString); //print result
                }
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }
    
  • 프로필 알 수 없는 사용자님의 편집
    날짜2019.10.28

    자바 소켓 프로그래밍 간단한 문제 질문입니다


    자바 소켓 프로그래밍으로 멀티쓰레드 계산기를 만드는 중입니다.. 그런데 어느 이유에선지 서버에서 읽어오는 부분에서 진행이 되지 않아요... 문제가 무엇일까요? 삼일동안 구글링했는데 원인을 모르겠습니다. 단 UTF 말고 아스키코드로 발신수신해야 합니다.

    서버

    import java.io.*;
    import java.net.*;
    
    public class Server implements Runnable 
    {
        static int max = 5; //maximum thread's number
        static int i = 0, count = 0; //i for for-loop, count for count number of threads
    
        public static void main(String args[]) throws IOException 
        {
            ServerSocket serverSocket = new ServerSocket(6789); //open new socket
            File file = new File("src/serverinfo.dat"); //make data file to save server info.
            System.out.println("Maximum 5 users can be supported.\nWaiting...");
    
            for(i=0; i <= max; i++) { new Connection(serverSocket); } //make sockets - loop for max(=5) times
    
            try //server information file writing
            { 
                String dataString = "Max thread = 5\nServer IP = 127.0.0.1\nServer socket = 6789\n";
                @SuppressWarnings("resource")
                FileWriter dataFile = new FileWriter(file);
                dataFile.write(dataString);
            }
            catch(FileNotFoundException e) { e.printStackTrace(); }
            catch(IOException e) { e.printStackTrace(); }
        }
    
    
        static class Connection extends Thread
        {
            private ServerSocket serverSocket;
    
            public Connection(ServerSocket serverSock)
            {
                this.serverSocket = serverSock;
                start();
            }
    
            public void run()
            { 
                Socket acceptSocket = null;
                BufferedReader inFromClient = null;
                DataOutputStream msgToClient = null;
                String receiveString = null;
                String result = "", sys_msg = "";
    
                try
                {
                    while(true)
                    {
                        acceptSocket = serverSocket.accept(); // 접속수락 소켓
                        count++;
    
                        inFromClient = new BufferedReader(new InputStreamReader(acceptSocket.getInputStream()));
                        msgToClient = new DataOutputStream(acceptSocket.getOutputStream());
                        System.out.println(count + "th client connected: " + acceptSocket.getInetAddress().getHostName() + "    " + count + "/" + max);
                        System.out.println("Waiting response...");
    
                        while(true)
                        {
    
                            if (count >= max+1) // if 6th client tries to access
                            {
                                System.out.println("Server is too busy. " + max + " clients are already connected. Client access denied.");
                                sys_msg = "DENIED";
                                msgToClient.writeBytes(sys_msg);
                                acceptSocket.close();
                                count--;
                                break;
                            }
    
                            try{ msgToClient.writeBytes(result); }
                            catch(Exception e) {}
    
                            try{ receiveString = inFromClient.readLine(); }
                            catch(Exception e) // if receiveString = null
                            {
                                System.out.println("Connection Close");
                                count--;
                                break;
                            }
    
                            System.out.println("Input from client : " + receiveString);
    
                            try
                            {       
    
                                if(receiveString.indexOf("+") != -1) { result = cal("+", receiveString); }
                                else if(receiveString.indexOf("-") != -1) { result = cal("-", receiveString); }
                                else if(receiveString.indexOf("/") != -1) { result = cal("/", receiveString); }
                                else if(receiveString.indexOf("*") != -1) { result = cal("*", receiveString); }
                                else if(receiveString.indexOf("+") == -1 || receiveString.indexOf("-") == -1 || receiveString.indexOf("*") == -1 || receiveString.indexOf("/") == -1) { result = "No INPUT or Invalid operation"; }
                            }
                            catch(Exception e){ result = "Wrong INPUT"; }
    
                            try{ msgToClient.writeBytes(result); }
                            catch(Exception e) {}
                        }
                    }
                }
                catch(IOException e) { e.printStackTrace(); }
            }
        }
    
        private static String cal(String op, String recv) //function for calculating
        {
            double digit1, digit2; //first number, second number
    
            String result = null;
    
            digit1 = Integer.parseInt(recv.substring(0, recv.indexOf(op)).trim());
            digit2 = Integer.parseInt(recv.substring(recv.indexOf(op)+1, recv.length()).trim());
    
            if(op.equals("+")) { result = digit1 + " + " + digit2 + " = " + (digit1 + digit2); }
            else if(op.equals("-")) { result = digit1 + " - " + digit2 + " = " + (digit1 - digit2); }
            else if(op.equals("*")) { result = digit1 + " * " + digit2 + " = " + (digit1 * digit2); }
            else if(op.equals("/"))
            {
                if(digit2 == 0){ result = "ERROR OCCURRED: Cannot be divided by ZERO"; }
                else{ result = digit1 + " / " + digit2 + " = " + (digit1 / digit2); }
            }
            return result;
        }
    
        @Override
        public void run() {
      //    TODO Auto-generated method stub
        }
    }
    

    클라이언트

    import java.io.*;
    import java.net.*;
    
    public class Client {
        public static void main(String args[]) throws IOException
        {
            Socket clientSocket = null;
    
            BufferedReader userInput = new BufferedReader(new InputStreamReader(System.in));
            BufferedReader inFromServer = null;
            DataOutputStream msgToServer = null;
    
            String sendString = "", receiveString = "";
    
            try
            {
                clientSocket = new Socket("127.0.0.1", 6789); //make new clientSocket
                inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                msgToServer = new DataOutputStream(clientSocket.getOutputStream());
    
                System.out.println("Input exit to terminate");
                System.out.println("Connection Success... Waiting for permission");
    
                while(true)
                {
                    receiveString = inFromServer.readLine();
                    if(receiveString.equals("DENIED"))
                    {
                        System.out.println("Server is full. Try again later.");
                        break;
                    }
                    else { System.out.println("Connection permitted."); }
    
                    System.out.print("Input an expression to calculate(ex. 3+1): ");
                    sendString = userInput.readLine();
    
                    if(sendString.equalsIgnoreCase("exit")) //when user input is "exit" -> terminate
                    {
                        clientSocket.close();
                        System.out.println("Program terminated.");
                        break;
                    }
    
                    try { msgToServer.writeBytes(sendString); }
                    catch(Exception e) {}
    
                    try { receiveString = userInput.readLine(); }
                    catch(Exception e) {}
    
                    System.out.println("Result: " + receiveString); //print result
                }
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }