본문 바로가기

JAVA

[JAVA] 서버 소켓 닫기(Server) 서버 소켓의 사용이 끝났으면 해당 소켓을 닫아야 한다. 특히 프로그램이 서버 소켓 사용 후에 바로 종료하지 않고 한동안 계속 실행되어야 할 경우 더 중요하다. 사용이 끝난 서버소켓을 닫지 않으면 다른 프로그램이 해당 포트를 사용할 수 없다. ServerSocket을 닫는 것과 Socket을 닫는 것을 혼동해서는 안 된다. ServerSocekt을 닫으면 사용중인 로컬 호스트의 포트가 해제되며 다른 서버가 해당 포트를 바인드 할 수 있게 된다. 또한 해당 ServerSocket을 통해 수용된 모든 소켓의 연결이 끊어진다. 서버 소켓은 프로그램이 종료될 때 자동으로 닫힌다. 그래서 ServerSocket의 사용이 끝나고 곧바로 프로그램을 종료할 예정이라면 꼭 닫아야 할 필요는 없다. 하지만 종료한다고 문제가.. 더보기
[JAVA] 소켓으로 서버에 쓰기(Server) 대부분의 프로토콜이 서버에게 읽기와 쓰기를 모두 요구하기 때문에, 이를 구현할 줄 알아야 한다. 이전과 동일하게 연결을 받아들이지만, 이번에는 InputStream과 OutputStream을 모두 요청한다. InputStream을 이용하여 클라이언트가 보내는 내용을 읽고, OutputStream을 사용하여 클라이언트에게 쓴다. 이 과정에서 중요한 점은 프로토콜을 잘 이해하고, 읽어야 할 때와 써야 할 때를 잘 구분하는 것이다. RFC 862에 정의된 에코프로토콜은 서버와 클라이언트가 데이터를 주고 받는 가장 간단한 서비스 중의 하나이다. 클라이언트는 에코 서버의 포트 7번에 대해 소켓을 열고 데이터를 보낸다. 그리고 서버는 받은 데이터를 다시 돌려보낸다. 에코 프로토콜은 라우터나 방화벽의 오동작으로 인해.. 더보기
[JAVA] 서버 소켓 ② Binary Data 보내기 텍스트 대신 바이너리 데이터를 보내는 방법은 Writer를 사용하여 문자열을 전송하는 것 대신에 OutputStream을 사용하여 바이트 배열을 전송하면 된다. 아래의 예제는 RFC 868에 기술된 타임 프로토콜을 따르는 반복 시간 서버이다. 클라이언트가 연결되면, 서버는 1900년 1월 1일 자정 이후의 시간을 초로 표현한 4바이트, 빅엔디안, 부호 없는 정수 값을 보낸다. 또다시, 현재 시간은 Date 객체를 생성하여 구한다. 그러나 자바의 Date 클래스는 1970년 1월 1일 자정 이후의 시간을 밀리초 단위로 세기 때문에 변환이 필요하다. package network; import java.io.*;import java.net.*;import java.util.Date; public class T.. 더보기
[JAVA] 서버 소켓 사용하기 ① 위는 time-a.nist.gov에 연결하여 시간을 받아 온 것이다. 나만의 daytime 서버를 만들어보자. 우선 포트 13번에 대기하는 서버 소켓을 만든다. ServerSocket server = new ServerSocket(13); 다음, 연결을 수용한다. Socket connection = server.accept(); accept()가 호출되면 프로그램은 여기서 실행을 멈추고 클라이언트 포크가 13번으로 연결할 때까지 무한 대기 한다. 클라이언트가 연결되면 accept() 메소드는 Socket 객체를 반환한다. 반환된 연결은 java.net.Socket 객체 형태로 반환되며 클라이언트에서 사용한 것과 같다. daytime 프로토콜은 대화할 서버가 필요하므로 소켓에서 OutputStream 을 .. 더보기
[JAVA] 출장비 지급액 화폐 단위별 매수 계산 문제 직원 개인별로 지급되는 충장비 지급액에 대한 화폐 단위별 매수를 구한 후 결과를 출력하는 알고리즘을 구성하라. 화폐는 고액권을 우선으로 한다.화폐 단위는 5만원권 부터 1원권 까지 10종류로 한다.성명과 출장비지급액을 입력받는다. 성명에 quit가 입력될 경우 종료한다.출력은 성명, 출장비지급액, 개인별 각 화폐 매수로 하며, 마지막에 화폐 단위별 전체 매수를 출력한다.변수 설명은 주석으로 대체 출력 예시 콘솔창으로 입력과 출력을 동시에 하기 때문에 결과를 출력하기 여의치 않음.(AWT로 출력창을 만들어 보기.)(또는 2차원 배열로 출력해 보기) 기본적인 로직은 다음과 같다.package jungbo; import java.util.InputMismatchException;import java.util... 더보기
[JAVA] 화폐 단위별 매수 계산 금액을 입력하여 화폐 단위별로 화폐의 매수를 계산하는 순서도를 작성하시오.(단, 금액은 10,000원 이상이 입력되며, 화폐의 단위는 1원 권에서 50,000원 권 까지이다.) 실행 결과 package jungbo; import java.util.InputMismatchException;import java.util.Scanner; public class P225MoneyCounter {public static void main(String[] args) {int i=50000; //화폐 단위를 저장할 변수(총 10가지)//50000->10000->5000->1000->500->100->50->10->5->1 로 변화int sw=0; //단위를 바꿔줄 때 사용할 변수int money=0; //계산될 금액.. 더보기
[JAVA] 부호있는 8비트 2진수를 10진수로 변환 부호를 포함하는 8비트 2진수 값을 10진수로 변환하는 알고리즘을 작성하라 8비트 2진수 값의 최상위 비트는 부호비트이다.부호비트가 0일 경우 양수, 1일 경우 음수이다.(단, 음수의 경우 2의 보수로 표현) 실행 결과 1회 2회 3회 package jungbo; import java.util.Random; public class P114SignedBinaryToDegree {public static void main(String[] args) {int sbin[] = new int[8]; //최상위비트가 부호비트인 8비트 2진수를 받을 배열Random random = new Random();int i; // 반복문을 돌리기 위한 변수for(i=0;i 더보기
[JAVA] 소수로 삼각형 찍기 아래 실행 결과 처럼 2차원 배열에 직각 삼각형 형태로 1000까지의 자연수 중 2부터 시작하여 순차적으로 소수를 15개 까지 저장하는 알고리즘을 작성하라. package javalesson.com.javalesson.ch01test; public class T06PrimeTriangle {public static void main(String[] args) {int pri[] = new int[15]; //소수 15개를 넣을 배열int array[][] = new int[5][5]; //삼각형을 출력하기 위한 2차원배열int cnt; //소수인지 판별하기 위해 이전에 구해진 소수로 나누어 줄 횟수int P,Q; //P : 소수 Q: 소수 판별 반복문을 위한 변수int mok,na; //소수를 판별하기 .. 더보기
[JAVA] 7에 가장 가까운 정수 찾기 10개의 정수가 배열에 기억되어 있다. 10개의 정수 중에서 7에 가장 가까운 정수를 찾아 그 정수를 출력하고자 한다. 배열에 기억되어 있는 순서에 따라 10개의 정수와 7과의 차이값을 구하여 그 차이값 중 가장 최소값을 가지는 정수를 7에 가장 가까운 값으로 선택하여 출력하라. 배열에 기억된 10개의 데이터는 절대값이 500이하의 정수라고 가정한다. 실행 결과 1회 2회 3회 package jungbo; import java.util.Random; public class P118TheNumberColsestTo7 {public static void main(String[] args) {int i; //반복문 돌리기 위한 변수int number[] = new int[10]; //임의 정수 10개를 받기 .. 더보기
[JAVA] 8bit 2진수의 2의 보수 구하기 크기가 8인 배열에 입력되어 있는 이진수 8자리에 대하여 2의 보수를 구하여 출력하라.(단, 부호비트는 없는 것으로 간주) 실행 결과 1회 2회 3회 package jungbo; import java.util.Random; public class P119ComplementOf2 {public static void main(String[] args) {int bin[] = new int[8];//이진수 8자리를 받을 배열int i;//반복문 돌리기 위한 변수for(i=0;i 더보기