윈도우10 시작프로그램을 설정하는 방법은 아래와 같다.


1. 키보드의 윈도우 + R을 눌러 '실행 프로그램'을 실행한다.

2. '실행 프로그램'에 shell:startup을 실행한다.

3. 시작 프로그램 폴더에 필요한 바로가기 파일(.lnk)을 넣는다.


클라이언트 코드

package com.blog.naver.fiesta77.client;

import java.net.Socket;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;

public class ClientTest {
  private static final String CONN_HOST = "www.host.com";
  private static final int    CONN_PORT = 12345;
  public static void main(String[] args) {
    Socket socket = null;
    try {
      socket = new Socket(CONN_HOST, CONN_PORT);
      DataInputStrean in = new DataInputStream(socket.getInputStream());
      DataOutputStream out = new DataOutputStream(socket.getOutputStream());

      int message = in.readInt();
      System.out.printf("recv message is %d\n", message);
      message *= 10;
      out.writeInt(message);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (socket != null) try { socket.close(); } try (IOException e) {}
    }
  }
}


코드 분석


클라이언트 소켓 프로그래밍은 서버 소켓 프로그래밍과 별반 차이가 없다.
자바의 net 패키지가 워낙에 쉽게 소켓 프로그래밍을 할 수 있도록 만들어서인데
ServerSocket 대신 Socket 객체를 생성할 때 접속할 호스트와 포트만 넘겨주면 끝이다.
그 이후는 서버 프로그래밍과 마찬가지로 InputStream과 OutputStream으로 데이터를 넘겨주면 끝이다.
(Stream은 바이너리 형식이므로 만약 String을 사용할 예정이라면 Reader를 사용하면 된다.)

ServerSocket 소스

package com.blog.naver.kmdigit.server;

import java.net.ServerSocket;
import java.net.Socket;
import java.io.IOException;
import java.io.DataInputStream;
import java.io.DataOutputStream;

public class TestServer {
  private static final int SERVER_PORT = 12345;

  public static void main(String[] args) {
    ServerSocket server = null;
    Socket       socket = null;
    try {
      server = new ServerSocket(SERVER_PORT);
      DataInputStream  in = null;
      DataOutputStream out = null;
      System.out.printf(">> server open port(%d)\n", SERVER_PORT);
      while ((socket = server.accept()) != null) {
        System.out.printf(">> accept socket host(%s)\n", socket.getInetAddress());
        int recv_message = in.readInt();
        int send_message = recv_message * 10;
        out.writeInt(send_message);
        socket.close();
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if (server != null) try { server.close(); } catch (IOException e) {}
    }
  }
};


소스 분석

JAVA에서 서버 프로그래밍을 하기 위해선 미리 만들어진 net 패키지의 ServerSocket과 Socket을 사용하면 된다.
ServerSocket의 생성자는 다양하지만 일반적으로 Listen 하는 PORT만 입력하여 사용한다.
후엔 accept 함수로 Listen 상태가 되어 클라이언트가 접속할 수 있는 준비를 한다.

accept 함수의 리턴 값은 접속한 클라이언트와 따로 통신할 수 있는 Socket 객체이다.
이제부터는 ServerSocket이 아닌 Socket 객체로 접속한 클라이언트와 통신하게 된다.
String을 주고받을 땐 Reader를 활용하면 되지만 일반적으로 String보단 Binary 통신을 훨씬 많이 하기 때문에
예제로 DataInputStream과 DataOutputStream을 사용하였다.

DataInputStream은 readXXX 함수를 통해 필요한 크기만큼의 값을 수신할 수 있으며
DataOutputStream은 writeXXX 함수를 통해 필요한 크기만큼의 값을 송신할 수 있다.
이때 DataInputStream이나 DataOutputStream을 close 시키면 안 되는데
이유는 Socket의 송/수신 채널이 막히기 때문이다.
더 이상 사용을 하지 않을 땐 DataInputStream과 DataOutputStream 대신 Socket 객체를 close 시키면 마무리된다.

자바에 없는 unsigned int 없다


자바에는 char를 제외하고 unsigned 키워드를 아예 없애버렸다.

그 이유는 자바를 만든 제임스 고슬링이 c++에서 unsigned로 인한 오류를 너무 많이 보고 겪었기 때문에

포함시키지 않기로 하였다.


자바 자체로는 unsigned를 사용하지 않아 문제없지만

네트워크를 통해 다른 언어와 통신하다보면 자연스럽게 unsigned 문제는 고스란히 나온다.

자바에서는 unsigned int를 지원하지 않으니 한 번에 캐스팅이 불가하여

자체적으로 처리를 해야하며 그 처리 방법은 아래와 같다.


public long unsigned32(int n) {
  return n & 0xFFFFFFFFL;
}

signed int로 넘어온 값을 long형으로 캐스팅하여 사용하는 방법이다.

42억정도의 값을 int로 받게 되면 앞자리가 1로 변경되어 자바에서는 자연스럽게 -20억대 값이 나오므로

이를 long형으로 형변환하여 정확히 원하는 값을 볼 수 있도록 하는 것이다.

String to int

String str_val = "123"
int int_val = 0;
int_val = Integer.parseInt(str_val);

int의 wrapper 클래스인 Integer의 parseInt 함수를 사용하면 String을 int로 쉽게 형변환 할 수 있다.


int to String

int int_val = 123;
String str_val = "";
str_val = Integer.toString(int_val);

String to int와 마찬가지로 Integer의 toString 함수를 사용하면 String으로 쉽게 형변환이 가능하다.

소스코드:

func maxParallelism() int 
  maxProcs := runtime.GOMAXPROCS(0)
  numCPU := runtime.NumCPU()
  if maxProcs < numCPU {
    return maxProcs
  }
  return numCPU
} 

설명:

기본으로 설정되어 있는 고루틴 개수와 CPU 개수와 비교하여 많은 걸 반환하는 함수.

만약 CPU 개수보다 더 많이 사용하고 싶다면 runtime.GOMAXPROCS 파라미터를 설정하면 된다.

'Nam Site > Go' 카테고리의 다른 글

[Go] File ReadLine (1)  (0) 2016.08.08
[Go] 변수타입 알아보기  (0) 2016.08.04

소스 코드 :

package main

import (
  "bufio"
  "fmt"
  "os"
)

func main() {
  fo, err := os.Open("test.txt")
  if err != nil {
    panic(err)
  }
  defer fo.Close()

  reader := bufio.NewReader(fo)
  for {
    line, isPrefix, err := reader.ReadLine()
    if isPrefix || err != nil {
      break
    }
    fmt.Println(line)
  }
}


설명 :

func (b *Reader) ReadLine() (line []byte, isPrefix bool, err error)

isPrefix는 line(byte)로 담을 수 없는 길이일 경우 true로 설정되고, err는 특수한 경우 발생하므로

위 소스 코드처럼 isPrefix와 err를 함께 검사하도록 한다.

line은 byte타입이므로 string으로 변환하여 사용하면 된다.

'Nam Site > Go' 카테고리의 다른 글

[Go] 고루틴(goroutine) 개수 설정하기  (0) 2016.09.02
[Go] 변수타입 알아보기  (0) 2016.08.04

Code :

package main

import (
  "fmt"
  "reflect"
  "time"
)

func main() {
  var now time.Time = time.Now().UTC()
  fmt.Println("now is a type of: ", reflect.TypeOf(now))
  var name string = "Carl Johannes"
  fmt.Println("name is a type of: ", reflect.TypeOf(name))
  var age int = 5
  fmt.Println("age is a type of: ", reflect.TypeOf(age))
}


Output:

$ go run type_of.go
now is:  time.Time
name is:  string
age is:  int

'Nam Site > Go' 카테고리의 다른 글

[Go] 고루틴(goroutine) 개수 설정하기  (0) 2016.09.02
[Go] File ReadLine (1)  (0) 2016.08.08

+ Recent posts