반응형
SMALL

'분류 전체보기'에 해당되는 글 209건

반응형
LIST
반응형
SMALL

이번시간엔 리눅스 다운됐을시에 어떻게 해야하는지에 대해 포스팅하려고한다. 본인은 zsh라는 리눅스 파일을 uninstall을 시켜서 리눅스 프로세스정지되고 아무것도 안쳐져서 많이 당황했고 os도 다시 깔아보고 그랬지만 소용이 없었다. 그래서 해결방안은 다음과 같다.


1. 사진은 포스팅 못하지만 터미널을 실행시키면 맨아래에 프로세스정지라고 뜨면서 분명 아무것도 안쳐질 것이다. 그럼 그땐 터미널 환경설정에 들어가서 일반탭에 셀열기쪽으로 가서 명령(절대경로)를 체크표시하고 경로를 /bin/bash로  바꿔준다. 


2. 설정이 되고 다시 터미널을 실행시키면 정상적으로 작동이 될것이다.


3. iterm도 똑같이 실행이 안될 것이다. 터미널을 켜서 chsh –s /usr/local/bin/zsh라고 치면 iterm도 아주 잘 실행될 것이다.


진짜 이거 하다 진땀 뺐다-_-;; zsh파일은 절대로 함부로 삭제하면 안된다!!!

반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

이번시간엔 채팅프로그램에 대해서 포스팅해보려고한다. 사실 채팅프로그램 만드는게 쉽지 않았다. 컴퓨터 환경맞춰야하지, 구글링 해봐야하지. 구글링에서 찾아도 또 리눅스 환경 설치해야하고 정말 어려움이 많았다. 하지만 이걸 만들어봄으로써 node.js에 대해서도 많이 배울 수 있었다. 본 포스팅은 맥북 기준 포스팅이다. 




1. node.js의 설치





일단 node.js를 설치해줘야 한다. 맥북같은 경우는 브루로 금방 깔 수 있을 것이다.


2. express 프레임워크의 설치

npm install --save express를 리눅스에 입력해서 설치한다.


3. 서버 구동 확인

var app = require('express')();

var http = require('http').Server(app);

var io = require('socket.io')(http);


app.get('/', function(req, res){

  res.sendFile(__dirname + '/index.html');

});


http.listen(3000, function(){

  console.log('listening on *:3000');

});


이걸 그대로 Sublime Text에 입력해서 서버가 잘 동작하는지 테스트해본다.  만약에 ^327 에러가 나온다면 express 프레임워크에 var에 관련된 항목들이 설치가 안된것이다. 그땐 npm install http, npm install socket.io를 쳐서 설치해주고 실행해본다. 그러면 아마 서버가 잘 동작할 것이다. 만약 다 됐으면 localhost:3000을 인터넷 주소에다 쳐서 확인해본다. 



이렇게 나오면 정상이다.


4. index.js 파일 만들기

Sublime Text에다 다음과 같은 코드를 입력하고 index.js로 저장해준다.


var app = require('express')();

var http = require('http').Server(app);

var io = require('socket.io')(http);


app.get('/', function(req, res){

  res.sendFile(__dirname + '/index.html');

});


http.listen(5000, function(){

  console.log('listening on *:5000');

});




var userList = [];



io.on('connection', function(socket){

  var joinedUser = false;

  var nickname;


  // 유저 입장

  socket.on('join', function(data){

    if (joinedUser) { // 이미 입장 했다면 중단

      return false; 

    }


    nickname = data;

    userList.push(nickname);

    socket.broadcast.emit('join', { 

      nickname : nickname

      ,userList : userList

    });


    socket.emit('welcome', { 

      nickname : nickname

      ,userList : userList

    });


    joinedUser = true;

  });



  // 메시지 전달(내가 치면 나오는 메시지)

  socket.on('msg', function(data){

    console.log('msg: ' + data);

    io.emit('msg', { 

      nickname : nickname

      ,msg : data

    });

  });



  // 접속 종료

  socket.on('disconnect', function () {

    // 입장하지 않았다면 중단

    if ( !joinedUser) { 

      console.log('--- not joinedUser left'); 

      return false;

    }


    // 접속자목록에서 제거

    var i = userList.indexOf(nickname);

    userList.splice(i,1);


    socket.broadcast.emit('left', { 

      nickname : nickname 

      ,userList : userList

    });    

  });

});


5. index.html이라고 파일명을 저장하고 다음과 같이 코딩한다.


<!doctype html>

<html>

<head>

  <title>Socket.IO chat</title>

  <style>

    * { margin: 0; padding: 0; box-sizing: border-box; }

    body { font: 13px Helvetica, Arial; }

    form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }

    form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }

    form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }

    #messages { list-style-type: none; margin: 0; padding: 0; }

    #messages li { padding: 5px 10px; }

    #messages li:nth-child(odd) { background: #eee; }


    #messages span.nickname { font-weight: bold; font-size: 120%; display: inline-block; width: 100px; }



    div.userList { text-align: center; width: 200px; min-height: 200px; border: 1px solid #999;}

    #userList { list-style-type: none; margin: 0; padding: 0; }

    #userList li { }


    #before { text-align: center; margin-top: 50%; }

    #after { display: none; }

    .noti { text-align: center; color: blue; }

  </style>

</head>

<body>


<section id="before">

  <p>닉네임을 입력하세요</p>

  <input id="nickname"><button id="joinBtn">들어가기</button>

</section>



<section id="after">

  <div class="userList">

    <h2>현재 접속자</h2>

    <ul id="userList"></ul>

  </div>


  <hr>

  <ul id="messages"></ul>

  <form>

    <input id="m" autocomplete="off" /><button>Send</button>

  </form>

</section>


<script src="/socket.io/socket.io.js"></script>

<script src="http://code.jquery.com/jquery-1.11.1.js"></script>

<script>


var nickname;

var socket = io();


// 이벤트: join 클릭 

$('#joinBtn').click(function(e){  

  fnNickname(e);

});


// 이벤트: nickname 엔터키 

$('#nickname').keypress(function(e) { 

  if (e.which == 13) {

    fnNickname(e);

  }

});


// 송신: 닉네임

function fnNickname(e) {

  if ($('#nickname').val().trim() == '') {

    alert('Input your nickname!');

    return false;

  }

  nickname = $('#nickname').val().trim();

  socket.emit('join', nickname);  // 접속 이벤트

}




// 수신: 환영인사

socket.on('welcome', function(data){

  // 유저리스트 업데이트

  fnUpdateUserList(data.userList);


  $('#before').hide();

  $('#after').show();

  $('#messages').append($('<li class="noti">').text(nickname + '님 환영합니다.'));  

});



// 유저리스트 업데이트

function fnUpdateUserList(userList) {

  $('#userList').text('');

  for (i = 0; i < userList.length; i++) {

    $('#userList').append($('<li>').text(userList[i]));

  };

}


// 수신: 신규자 접속

socket.on('join', function(data){

  // 입장 알림

  $('#messages').append($('<li class="noti">').text(data.nickname + '님이 입장하셨습니다'));

  

  // 유저리스트 업데이트

  fnUpdateUserList(data.userList);

});


// 수신: 퇴장

socket.on('left', function(data){

  // 종료 알림

  $('#messages').append($('<li class="noti">').text(data.nickname + '님이 퇴장하셨습니다'));

  

  // 유저리스트 업데이트

  fnUpdateUserList(data.userList);

});



// 송신: 메시지

$('form').submit(function(){

  socket.emit('msg', $('#m').val());

  $('#m').val('');

  return false;

});

  


// 수신: 메시지

socket.on('msg', function(data){

  var span = $('<span class="nickname">').text(data.nickname);

  var li = $('<li>').append(span).append(data.msg);

  $('#messages').append(li);

});


</script>


</body>


6. 서버를 구동시키고 닉네임 달아서 로그인하면 다음과 같이 나올 것이다.


출저: 개발::[Express.js] Node.js


간단해 보이지만 환경구축하고 설치하고 고생많이했다... 다음번에는 귓속말까지 가능한 채팅프로그램을 만들어볼 생각이다. 


반응형
LIST

'javascript' 카테고리의 다른 글

casper.js를 이용한 날씨프로그램  (0) 2016.08.30
블로그 이미지

만년필석사

,

DeadLock 특징들

운영체제 2016. 8. 19. 22:29
반응형
SMALL

이번시간엔 교착상태에 대해서 설명해 보려고한다. 사실 os에서 가장 중요하다고 봐도 과언이 아니다. 학교 시험이나 나중에 대학원 컴퓨터공학과 구술면접때도 교착상태에 대해서 단골로 질문하곤 한다고 한다. 그만큼 중요하니깐 질문하는것이겠지..ㅎㅎ 





1. DeadLock(교착상태)란?

어떤 집합 내에 있는 모든 프로세스가 대기상태이며, 이 집합내에 있는 프로세스가 이 집합내에 다른 프로세스가 가지고 있는 자원을 기다리고 있는 현상을 교착상태라고 한다. 한마디로 이야기해서  두개이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있고 아무런 작업도 하지 못한채 계속 무한정 대기하는 상태이다. 



사진출저: google



2. 교착상태가 일어나기 위한 조건


① 상호배제: 프로세스들이 필요로하는 자원에 대해 배타적인 통제권을 요구한다.

② 점유대기: 프로세스가 할당한 자원을 가진 상태에서 다른자원을 기다린다.

③ 비선점: 프로세스가 어떤 자원의 사용을 끝낼 때까지 그 자원을 뺏을 수 없다.

순환대기; 각 프로세스는 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있다.


--> 이 조건을 모두 만족해야 교착상태가 일어난다. 


3. 교착상태의 예방조건


  • 상호배제 조건의 제거
교착 상태는 두 개 이상의 프로세스가 공유 불가능한 자원을 사용하니 발생하는 것이므로 공유 불가능한, 즉사 상호 배제 조건을 제거하면 교착 상태를 해결할 수 있다.

  • 점유와 대기 조건의 제거
한 프로세스에 수행되기 전에 모든 자원을 할당시키고 나서 점유하지 않을 때에는 다른 프로세스가 자원을 요구하도록 하는 방법이다. 자원 과다 사용으로 인한 효율성, 프로세스가 요구하는 자원을 파악하는 데에 대한 비용, 자원에 대한 내용을 저장 및 복원하기 위한 비용, 기아상태, 무한 대기 등의 문제점이 있다.

  • 비선점 조건의 제거
 비선점 프로세스에 대해 선점 가능한 프로토콜을 만들어 준다.

  • 환형 대기 조건의 제거
 자원 유형에 따라 순서를 매긴다.

이 교착 상태의 해결 방법들은 자원 사용의 효율성이 떨어지고 비용이 많이 드는 문제점이 있다.

출저: Lael's World

4. 교착상태 회피

-> 교착상태 발생시 피해나가는 방법. 은행원 알고리즘이 가장 대표적이다.

※ 은행원 알고리즘

E,J,Dijkstra가 제안한 방법으로, 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는 데서 유래한 기법이다

프로세스가 자원을 요구할 때 시스템은 자원을 할당한 후에도 상태로 남아있게 되는지를 사전에 검사하여 교착 상태를 회피하는 기법

안정 상태에 있으면 자원을 할당하그렇지 않으면 다른 프로세스들이 자원을 해지할 때까지 대기함


출저: #include <stdio.h>


5. 교착상태 회복법??

- 교착상태를 일으킨 프로세스를 종료하거나, 할당된 자원을 해제함으로써 회복하는 것을 말한다.

- 프로세스 종료법

1. 교착상태의 프로세스를 모두 중지

2. 교착상태가 제거될 때까지 한 프로세스씩 중지

- 자원선점법

1. 교착상태의 프로세스가 점유하고 있는 자원을 선점해 다른프로세스에게 할당하며, 해당프로세스를 일으킬 시 정지시키는 방법

2. 우선순위가 낮은 프로세스등을 위주로 프로세스의 자원을 선점한다.

출저: #include <stdio.h>



반응형
LIST

'운영체제 ' 카테고리의 다른 글

이중동작모드(Dual-Mode operation)  (0) 2017.01.15
멀티프로세싱(Multi Processing)이란?  (0) 2016.09.20
임계구역(Critical section)  (0) 2016.09.11
Context Switching  (0) 2016.09.08
가상메모리  (0) 2016.08.10
블로그 이미지

만년필석사

,
반응형
SMALL

원하는 포맷의 파일의 갯수를 확인하는 방법이다. 유용하긴한데 외워서 딱 쓰기엔 시간이 많이 걸려보인다. 많이 써봐야 잘 쓸수 있을듯한 명령어다.

  find. name '*.extention ' | wc -1


반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

아래의 명령어는 Javascript 포맷만 code line을 카운팅 한다.


find . -name '*.js' | xargs wc -l


이건 그냥.. 포스팅해놓고 그때그때 유용하게 쓰는게 좋은거같다. 계속 써봐야 외워지는 명령어같다. 


반응형
LIST
블로그 이미지

만년필석사

,
반응형
SMALL

이번 포스팅은 트로이목마바이러스에 대해 써보려고 한다. 현재 전 세계는 컴퓨터,IT가 너무나도 많이 발달해서 이것들이 없는 삶은 생각지도 못하게 되었다. 문명의 발달이 너무 빠르다고 해야할까? 산업혁명 이후 현재시대는 대부분이 IT하고 연관이 깊다. 이번에 이세돌이 알파고하고 바둑세기의 대결을 했을때도 마찬가지고 이제 로봇의 시대가 오는 길도 그렇게 크게 멀어보이지만은 않다. 이렇게 살기가 편해지고 발달한 세대여도 골칫거리들이 생기기 마련이다. 컴퓨터 하면 또하나가 뭐가 떠오르는가? 바로 컴퓨터 바이러스다. 모든게 컴퓨터로 통한다고 말해도 과언이 아닐정도로 많이 이용하고 있기때문에 그만큼 정보도 많다. 그러기때문에 호시탐탐 해커들은 바이러스를 침투시켜 정보를 빼내기 위해 안간힘을 쓴다. 제일 많이 이슈화가 되고 있는것도 바로 컴퓨터보안이다. 컴퓨터 보안이 더 발달해야 하는 이유도 다 앞서 말한 점에 있다. 그럼 트로이목마바이러스는 뭘까?





1. 트로이 목마 바이러스



그리스 트로이목마를 보면 무엇이 떠오르는가? 그리스가 트로이를 무너뜨릴때 썼었다. 그리스가 항복의 표시로 트로이에게 목마를 선물을 했고 트로이는 그를 받아들여 술에 완전히 취해서 놀던중 갑자기 목마에서 그리스 병사들이 덮쳐서 트로이를 크게 무찔렀다. 겉으로 보기에는 그냥 나무로 만든 목마처럼 보였으나 그 안엔 그리스 병사들이 숨어있었던 것이다. 컴퓨터바이러스도 마찬가지다. 트로이목마 바이러스는 아무렇지도 않게 정상인 파일인 척하면서 이메일, 다운로딩 파일등에 숨어있는다. 하지만 그 파일들은 모두 바이러스가 숨어져있다. 바로 이런 점이 유사했기 때문에 트로이목마 바이러스라고 이름이 붙여졌다. 이메일이나 이런곳에서 함부로 모르는 파일 열어보지 말라는 것도 모두 트로이목마 바이러스가 숨어져있기 때문이다. 정상파일인척하면서 몰래 사용자 컴퓨터에 들어와 모든 걸 감염시키고 망가뜨려놓는다. 이런점이 트로이목마의 무서운 점이다. 처음 80년대에는 백도어방식으로 네트워크에 접근했었다. 그 당시엔 기술도 없어 네트워크로 트로이목마 바이러스 침투 시키는건 어렵지 않은 일이었다. 하지만 90년대, 2000년대에 들어와서는 방화벽이라고 하는 프로그램도 만들어지고 여러가지 보안프로그램이 만들어지면서 점점 네트워크로 침입하기는 힘들어졌다. 그래서 해커들은 리버스커넥션 방법으로 트로이목마 바이러스를 심기 시작했다. 리버스 커넥션 방법이란 방화벽을 우회해서 공격하는 기법을 말한다. 그 전에 만들어진 보안프로그램들은(최근에 만들어진것도 좀  포함되는듯) 내부에서 외부로 인터넷접속을 시도하는 방법을 모두 통과시켜 놓게 만들어놨다고 한다. 이래서 해커들은 주로 우회해서 공격하는 기법을 많이 사용한다고 한다. 보안 프로그램을 우회하기 위한 방법도 5가지 이상이 있다. 프로세스를 강제종료시키는 방법, 보안프로그램 윈도우 비활성화 등등.. 진짜 많다. 이렇게 우회해서 공격을 하니 정말 공격대응 방법은 수도 없이 많아질 수 밖에 없는 구조이다. 그래도 요즘은 이러한 점을 알기때문에 우회하지 못하도록 하는 프로그램도 개발되고 있다는데 앞으로도 트로이목마 바이러스는 웜바이러스 같이 자기 복제가 가능한 바이러스로 진화가 될 수 있다고도 한다.  그렇게 되지 않도록 트로이목마바이러스를 막기위한 연구 활동은 계속 되어야 할 것이다.

반응형
LIST

'보안동향 > 컴퓨터 바이러스 ' 카테고리의 다른 글

웜바이러스  (0) 2016.08.23
블로그 이미지

만년필석사

,
반응형
SMALL

grep String  -r
(현 디렉토리 기준)하위 디렉토리 구조에서 String 매칭 되는 파일을 찾아아줍니다. 내용 중에 String이 매칭되는 파일 또한 찾습니다.

find  -name String
(현 디렉토리 기준)하위 디렉토리 구조에서 String 매칭 되는 파일을 찾아줍니다.

find  | grep String
(현 디렉토리 기준)하위 디렉토리 구조에서 String에 매칭되는 모든 파일을 찾아줍니다. (find . -name String으로 결과가 나오지 않을 시 사용합니다.)

ps aux | grep String
String 매칭 되는 프로세스 목록을 보여줍니다.


근데 알면 편하지만 처음에 외워서 막 쓰기엔 어려움이 많았다...-_-;;

반응형
LIST
블로그 이미지

만년필석사

,

Proactor의 특징

Server/Proactor 2016. 8. 12. 23:23
반응형
SMALL

이번시간엔 Proactor기능에 대해 포스팅해보려고 한다. Proactor pattern은 비동기식 프로세스가 가능한 일들을 demultiplexing한 뒤, 작업까지 전부 비동기로 처리한다. 작업이 완료되면 비동기 프로세스가 completion dispatch에게 이벤트를 넘기고 dispatcher는 적절한 completion handler에 이벤트를 dispatch한다. completion handler에 event가 dispatch되면 completion handler는 미리 정해진 콜백을 호출하여 process event를 처리한다. 전체적인 프로엑터 그림은 아래와 같다.




1. Demultiplex class를 만들어 다음과 같이 코딩한다.

import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.channels.AsynchronousSocketChannel;

import java.nio.channels.CompletionHandler;


public class Demultiplexer implements CompletionHandler<Integer, ByteBuffer> 

{

private AsynchronousSocketChannel channel;

private NioHandleMap handleMap;

public Demultiplexer(AsynchronousSocketChannel channel, NioHandleMap handleMap)

{

this.channel = channel;

this.handleMap = handleMap;

}

@Override

public void completed(Integer result, ByteBuffer buffer

{

if (result == -1) 

{

try {

   channel.close();

catch (IOException e

{

  e.printStackTrace();

}

else if (result > 0) 

{

  buffer.flip();

  String header = new String(buffer.array()); 

  NioEventHandler handler = handleMap.get(header);

  ByteBuffer newBuffer = ByteBuffer.allocate(handler.getDataSize());

  handler.initialize(channel, newBuffer);

  channel.read(newBuffer, newBuffer, handler);

}

}

@Override

public void failed(Throwable exc, ByteBuffer buffer

{

}


}


2. Dispatch class파일을 만들고 다음과 같이 코딩한다.


import java.nio.ByteBuffer;

import java.nio.channels.AsynchronousServerSocketChannel;

import java.nio.channels.AsynchronousSocketChannel;

import java.nio.channels.CompletionHandler;


public class Dispatcher implements CompletionHandler<AsynchronousSocketChannel, AsynchronousServerSocketChannel> 

{


private int HEADER_SIZE = 6;

private NioHandleMap handleMap;

public Dispatcher(NioHandleMap handleMap

{

this.handleMap = handleMap;

}


@Override

public void completed(AsynchronousSocketChannel channel, AsynchronousServerSocketChannel listener

{

   listener.accept(listener, this);


   ByteBuffer buffer = ByteBuffer.allocate(HEADER_SIZE);

   channel.read(buffer, buffer, new Demultiplexer(channel, handleMap));

}


@Override

public void failed(Throwable exc, AsynchronousServerSocketChannel listener

{


}


}  


3. NioEventHandler interface파일을 만들어 다음과 같이 코딩한다.


import java.nio.ByteBuffer;

import java.nio.channels.AsynchronousSocketChannel;

import java.nio.channels.CompletionHandler;


public interface NioEventHandler extends CompletionHandler<Integer, ByteBuffer> 

{


  public String getHeader();


  public int getDataSize();


  public void initialize(AsynchronousSocketChannel channel, ByteBuffer buffer);


}


4. NioHandleMap class파일을 만들고 다음과 같이 코딩한다.


import java.util.HashMap;



public class NioHandleMap extends HashMap<String, NioEventHandler> 

{


}


5. NioSayEventHandler class파일을 만들고 다음과 같이 코딩한다.


import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.channels.AsynchronousSocketChannel;

import java.util.StringTokenizer;


public class NioSayHelloEventHandler implements NioEventHandler 

{

  private static final int NUM_TOKEN = 2;


  private AsynchronousSocketChannel channel;

  private ByteBuffer buffer;


@Override

public String getHeader() 

{

  return "0x5001";

}

@Override

public int getDataSize() 

{

  return 512;

}

@Override

public void initialize(AsynchronousSocketChannel channel, ByteBuffer buffer

{

  this.channel = channel;

  this.buffer = buffer;

}


@Override

public void completed(Integer result, ByteBuffer attachment

{

if (result == -1) 

{

try {

channel.close();

catch (IOException e

{

  e.printStackTrace();

}

else if (result > 0) 

{

  buffer.flip();

  String message = new String(buffer.array());

  String[] params = new String[NUM_TOKEN];

  StringTokenizer token = new StringTokenizer(message, "|");

  int i = 0;

  while (token.hasMoreTokens()) {

  params[i] = token.nextToken();

  i++;

}

sayHello(params);


buffer.clear();

try

{

  channel.close();

catch (IOException e

{

  e.printStackTrace();

}

}

}


@Override

public void failed(Throwable exc, ByteBuffer attachment

{

}

private void sayHello(String[] params

{

System.out.println("SayHello / NAME: " + params[0] + " / AGE: " + params[1]);

}


6. NioUpdateProfileEventHandler class파일을 만들고 다음과 같이 코딩한다.


import java.io.IOException;

import java.nio.ByteBuffer;

import java.nio.channels.AsynchronousSocketChannel;

import java.util.StringTokenizer;


public class NioUpdateProfileEventHandler implements NioEventHandler 

{

private static final int NUM_TOKEN = 6;


private AsynchronousSocketChannel channel;

private ByteBuffer buffer;


@Override

public String getHeader() 

{

  return "0x6001";

}


@Override

public int getDataSize() 

{

  return 1024;

}


@Override

public void initialize(AsynchronousSocketChannel channel, ByteBuffer buffer

{

  this.channel = channel;

  this.buffer = buffer;

}


@Override

public void completed(Integer result, ByteBuffer attachment

{

if (result == -1) 

{

try {

channel.close();

catch (IOException e

{

  e.printStackTrace();

}

else if (result > 0) 

{

  buffer.flip();

  String message = new String(buffer.array());

  String[] params = new String[NUM_TOKEN];

  StringTokenizer token = new StringTokenizer(message, "|");

  int i = 0;

while (token.hasMoreTokens()) 

{

  params[i] = token.nextToken();

  i++;

}

  updateProfile(params);

  buffer.clear();

try 

{

  channel.close();

} catch (IOException e

{

  e.printStackTrace();

}

}

}


@Override

public void failed(Throwable exc, ByteBuffer attachment

{

}

private void updateProfile(String[] params

{

System.out.println("UpdateProfile / " + "ID: " + params[0] + " / " + "PASSWORD: " + params[1] + " / "

+ "NAME: " + params[2] + " / " + "AGE: " + params[3] + " / " + "GENDER: " + params[4]);

}

}


7. Serverinitializer class파일을 만들고 다음과 같이 코딩한다.

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.channels.AsynchronousChannelGroup;

import java.nio.channels.AsynchronousServerSocketChannel;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;


public class ServerInitializer 

{


private static int PORT = 5000;

private static int threadPoolSize = 30;

private static int initialSize = 20;

private static int backlog = 50;


public static void main(String[] args

{

  System.out.println("SERVER START at PORT: " + PORT + "!");

  NioHandleMap handleMap = new NioHandleMap();

  NioEventHandler sayHelloHandler = new NioSayHelloEventHandler();

  NioEventHandler updateProfileHandler = new NioUpdateProfileEventHandler();

  handleMap.put(sayHelloHandler.getHeader(), sayHelloHandler);

  handleMap.put(updateProfileHandler.getHeader(), updateProfileHandler);


  ExecutorService executor = Executors.newFixedThreadPool(threadPoolSize);


try 

{

  AsynchronousChannelGroup group = AsynchronousChannelGroup.withCachedThreadPool(executor,   initialSize);

  AsynchronousServerSocketChannel listener = AsynchronousServerSocketChannel.open(group);

  listener.bind(new InetSocketAddress(PORT), backlog);

  listener.accept(listener, new Dispatcher(handleMap));

catch (IOException e

{

  e.printStackTrace();

}

}


}


9. TestClient class파일을 만들고 다음과 같이 코딩한다.


import java.io.IOException;

import java.io.OutputStream;

import java.net.Socket;

import java.net.UnknownHostException;


public class TestClient {


public static void main(String[] args

{

   System.out.println("Client ON");

   try

   {

      String message;

      Socket socket = new Socket("127.0.0.1", 5000);

      OutputStream out = socket.getOutputStream();

      message = "0x5001|이건주|26";

      out.write(message.getBytes());

      socket.close();


      Socket socket2 = new Socket("127.0.0.1", 5000);

      OutputStream out2 = socket2.getOutputStream();

      message = "0x6001|Lee|1234|이건주|26|남성";

      out2.write(message.getBytes());

      socket2.close();

    } 

    catch (UnknownHostException e)

    {

        e.printStackTrace();

    } 

    catch (IOException e)

   {

       e.printStackTrace();

   }

  }

}


10. 모든 파일을 컴파일링 하면 다음과 같이 실행된다는 걸 볼 수 있다.




정상적으로 서버를 잘 형성하며 받고 있다.

반응형
LIST
블로그 이미지

만년필석사

,