소켓을 이용한 통신 프로그래밍
클라이언트와 서버간의 일대일 통신
소켓(socket) - 프로세스간의 통신에 사용되는 양쪽 끝단을 의미함
서로 멀리 떨어진 두 사람이 통신하기 위해서 전화기가 필요한 것처럼, 프로세스간의 통신을 위해서는 소켓이필요함
java.net 패키지 이용

 

1. 서버 프로그램에서는 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결 요청을 처리할 준비를 한다.
2. 클라이언트 프로그램은 접속할 서버의 IP 주소와 포트정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다.
3. 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다.
4. 이제 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다.

 

• Socket - 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 가지고 있다.
이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어진다.
• ServerSocket - 포트와 연결(bind)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다. 한 포트에 하나의 ServerSocket만 연결할 수 있다.

'java' 카테고리의 다른 글

Thread synchronized  (0) 2016.05.09
thread  (0) 2016.05.09
이뮤터블/뮤터블  (0) 2016.04.29
printf()  (0) 2016.04.28
hashcode()  (0) 2016.04.28
public synchronized void withdraw(int money){
if(balance >= money) {
try { Thread.sleep(1000);} catch(Exception e) {}
balance -= money;
}//if
} // withdraw

 

public void withdraw(int money){
synchronized(this){
if(balance >= money) {
try { Thread.sleep(1000);} catch(Exception e) {}
balance -= money;
}//if
}
} // withdraw

'java' 카테고리의 다른 글

TCP 소켓 프로그래밍  (0) 2016.05.09
thread  (0) 2016.05.09
이뮤터블/뮤터블  (0) 2016.04.29
printf()  (0) 2016.04.28
hashcode()  (0) 2016.04.28

멀티 태스킹(Multi-tasking, 다중작업) - 여러 개의 프로세스가 동시에 실행되는 것처럼 보이는 것

멀티 쓰레딩 - 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행하는 것

 

멀티 쓰레딩의 장점
- CPU의 사용률을 향상시킨다
- 자원을 보다 효율적으로 사용할 수 있다
- 사용자에 대한 응답성이 향상된다
- 작업이 분리되어 코드가 간결해진다

 

멀티쓰레딩의 단점
-멀티쓰레드 프로세스는 여러 쓰레드가 같은 프로세스 내에서 자원
을 공유하면서 작업을 하기 때문에 발생할 수 있는 동기화
(synchronization), 교착상태(deadlock)와 같은 문제들을 고려해서
신중히 프로그래밍해야 함
- 교착상태 : 두 쓰레드가 자원을 점유한 상태에서 서로 상대편이 점
유한 자원을 사용하려고 기다리느라 진행이 멈춰있는 상태를 말함

 

쓰레드를 구현하는 방법

1. Thread 클래스를 상속받는 방법
2. Runnable 인터페이스를 구현하는 방법
 쓰레드 클래스가 상속해야 할 또 다른 클래스가 존재하는 경우 사용

 

실행중인 thread 이름과 개수 구하기

public class TreadTest {
    public static void main(String[] args) {
        System.out.println("main 메서드입니다");
        Thread current =Thread.currentThread();
        System.out.println("현재 실행중인 스레드 이름:"+current.getName());
        int cnt=Thread.activeCount();
        System.out.println("실행중인 스레드 갯수="+cnt);
        
        Thread.currentThread().setName("Prime");
        System.out.println("변경된 쓰레드 이름:"+Thread.currentThread().getName());
    }
}

 

thread 클래스 상속

public class MyThread1 extends Thread {

    public MyThread1(String name){
        super(name);//setName(name);
    }
    public void run(){
        for(int i=0;i<5;i++){
            System.out.println(getName());//Thread 상속받아서 조상인 thread의 메서드 getName()을 직접 호출
        }
        
    }
}

 

runnable 인터페이스 구현

public class MyThread2 implements Runnable{
    public void run(){
        for (int i = 0; i < 5; i++) {
            //thread.currentThread() - 실행중인 Thread를 반환
            System.out.println(Thread.currentThread().getName());
           //runnable 구현하면 Thread클래스의 static메서드인 currentThred()를 호출하여 쓰레드에 대한 참조를 얻어와야만 
//Tread클래스의 메서드를 호출 가능 } } }

 

thread 실행

public class ThreadEx1 {

    public static void main(String[] args) {

        MyThread1 t1=new MyThread1("나의 쓰레드1");
        MyThread2 r=new MyThread2();
        Thread t2=new Thread(r);//thread의 생성자:Thread(Runnable Target)
        
        t1.start();
        t2.start();
        //t1.start(); //exeption 발생, 새로운 쓰레드 생성후 start()할 것
        
        System.out.println("main 쓰레드 종료");
    }
}

 

*start() 메모리 공간의 할당 등 쓰레드의 실행을 위한 기반을 마련한 다음에 run 메서드를 대신 호출해 줌

**모든 쓰레드는 자신의 스택을 할당 받는다. 그러나 힙과 메소드 영역은 모든 쓰레드가 공유한다.

- CPU 이외의 자원을 사용하는 경우 - 싱글쓰레드 프로세스보다 멀티쓰레드 프로세스가 더 효율적
   
***int getPriority() : 쓰레드의 우선순위를 반환
    void setPriority(int newPriority) :쓰레드의 우선순위를 지정한 값으로 변경
    public static final int MAX_PRIORITY=10 //최대 우선순위
    static int MIN_PRIORITY=1 //최소 우선순위
    static int NORM_PRIORITY=5 //보통 우선순위

'java' 카테고리의 다른 글

TCP 소켓 프로그래밍  (0) 2016.05.09
Thread synchronized  (0) 2016.05.09
이뮤터블/뮤터블  (0) 2016.04.29
printf()  (0) 2016.04.28
hashcode()  (0) 2016.04.28
immutable object; immutable
이뮤터블
mutable object; mutable
뮤터블

    이뮤터블

    • 변경불가 객체
    • 상태를 바꿀 수 없는 객체
    • 최초 생성(인스턴스화) 이후로는 값 변경 불가

    뮤터블

    • 변경가능 객체
    • 상태를 바꿀 수 있는 객체
    • 최초 생성 이후에도 자유롭게 값 변경 가능


    출처:제타위키

    'java' 카테고리의 다른 글

    TCP 소켓 프로그래밍  (0) 2016.05.09
    Thread synchronized  (0) 2016.05.09
    thread  (0) 2016.05.09
    printf()  (0) 2016.04.28
    hashcode()  (0) 2016.04.28

    printf(format,arguments)

    %d: int

    %f: double

    %c: char


    %%->%


    %h,%x: int->16진수

    %o: int->8진수


    %te: 1~31

    %td: 01~31

    %tY: yyyy

    %ty: yy


    %tb,%th: Jan,Feb...

    %tB: January

    %ta: Sun,Mon

    %tA: Sunday


    %tI: 1시~12시

    %tK: 0시~23시

    %tH: 00시~23시


    %1$d: 첫번째 arg를 int로 출력



    'java' 카테고리의 다른 글

    TCP 소켓 프로그래밍  (0) 2016.05.09
    Thread synchronized  (0) 2016.05.09
    thread  (0) 2016.05.09
    이뮤터블/뮤터블  (0) 2016.04.29
    hashcode()  (0) 2016.04.28
    • Hashing 기법에 사용되는 hash function을 구현한 메서드
    • 해시함수: 찾고자하는 값을 입력하면 그 값이 저장된 위치를 알려주는 해시코드를 반환
    • 해시코드가 같은 두 객체가 존재하는 것이 가능하지만 Object class에 정의된 메서드는 객체의 주소값을 이용해서 해시코드를 만들어 반환하기 때문에 한번의 실행에서 서로 다른 두 객체는 결코 같은 해시코드를 가질 수 없음
    • String 클래스는 문자열의 내용이 같으면, 동일한 해시코드를 반환하도록 hashCode메서드를 오버라이딩했기 때문에, 문자열의 내용이 같은 객체에 대해 hashCode()를 호출하면 항상 동일한 해시코드값을 얻는다.
      반면, System.identityHashCode(Object x)는 Object클래스의 hashCode메서드처럼 객체의 주소값으로 해시코드를 생성하기 때문에 모든 객체에 대해 항상 다른 해시코드값을 반환할 것을 보장한다. 그래서 문자열의 내용이 같은 String 객체가 해시코드는 같지만 서로다른 객체라는 것을 알 수 있다.
    • a.equals(b)가 true이면 a.hashcode()==b.hashcode()도 성립
      그러나 a.hashcode()==b.hashcode()가 성립해도 a.equals(b)가 반드시 true는 아님
      또 서로다른 객체들에 대해 같은 hashcode값을 만들어낼 수 있기 때문에 객체가 다르더라도 hashcode는 같을 수 있음
    • 1방향으로 해시암호화 적용
    • 다른 객체와의 충돌방지(100%는불가함)
    • 인코딩시 CPU COST 발생하지 않음

    code>>>

    String a = “aaa”;
    String b = a;
    String c = new String(“aaa”);

    System.out.println(a.equals(b)); //대상의 내용자체를 비교 -true
    System.out.println(a==b); //대상의 주소값 비교 – true
    System.out.println(a==c); //false
    System.out.println(a.equals(c)); //true

    System.out.println(a.hashCode()); //96321
    System.out.println(b.hashCode()); //96321
    System.out.println(c.hashCode()); //96321

    String bb = new String(“abcd”);

    System.out.println(“\n”);
    System.out.println(bb);
    System.out.println(bb.hashCode()); //2987074
    System.out.println(System.identityHashCode(bb)); //366712642

    String bb2 = new String(“abcd”);

    System.out.println(bb2);
    System.out.println(bb2.hashCode()); //2987074
    System.out.println(System.identityHashCode(bb2)); //1829164700

    System.out.println(bb==bb2); //false
    System.out.println(bb.equals(bb2)); //true

    'java' 카테고리의 다른 글

    TCP 소켓 프로그래밍  (0) 2016.05.09
    Thread synchronized  (0) 2016.05.09
    thread  (0) 2016.05.09
    이뮤터블/뮤터블  (0) 2016.04.29
    printf()  (0) 2016.04.28

    + Recent posts