네이버 후스콜 – 스팸차단 세계 1위

만 3세 이상
기기와 호환되는 앱입니다.
 


안드로이드는 NinePatch 그래픽이라고 하는 비트맵 이미지를 지원합니다.  PNG 이미지로 되어있는데 Stretchable(늘어나는) 영역을 정의할 수 있습니다. 이 나인패치 이미지는 보통 뷰(View)의 배경이미지로 사용됩니다. 실제 버튼의 디폴트 배경 이미지가 9 Patch 이미지로 되어있습니다. 

일반 PNG 이미지에서 1pixel의 보더를 가지는 형태로 구성되어있습니다. 이 보더가 늘어나는 영역과 늘어나지 않는 영역을 정의하게 됩니다. 왼쪽과 위쪽의 1 pixel 검은색 선은 늘어날 수 있는 부분을 정의합니다. 늘어날 수 있는 부분은 여러개가 될 수 있습니다. 

오른쪽과 아래쪽의 1 pixel 검은색 선은 뷰가 그려질 영역을 정하는 일을 합니다. 다시 말해 패딩 영역을 결정합니다. 만약 이 선을 그리지 않는다면 왼쪽과 위쪽의 선이 사용됩니다. 예를 들어 텍스트뷰의 경우 그려질 텍스트가 이 선이 그려진 영역안에서 표시됩니다.

나인패치 이미지를 쉽게 만들기 위해서 SDK의 Tools디렉토리에 draw9patch라고 하는 이미지 에디터가 들어있습니다. 아니면 그냥 일반적인 그래픽 에디터에서 그려도 상관없습니다.

ninepatch_raw.png

파일이름은 반드시 .9.png라고 끝나도록 저장해주어야 합니다. 



res/drawable/some_name.9.png 와 같은 형태가 되겠지요. 만약 그냥 png라고 끝난다면 



일반 이미지 파일로 처리가 됩니다.



centos 버전 확인

cat /etc/issue.net


아파치 버전 확인

httpd -v


php 버전 확인

php -v

'server > 리눅스' 카테고리의 다른 글

서버 에러 ? There are stopped jobs.  (0) 2016.03.08
리눅스 명령어 모음  (0) 2016.02.24
vi 편집기 명령어  (0) 2016.02.22
출저 : http://gnujava.com/board/article_view.jsp?article_no=7193&menu_cd=16&sch_field=TITLE&idx_notice=NOTICE_FLAG+DESC%2C&board_no=3&sch_word=CAPTCHA

JSP example - Google Recaptcha validation using jquery (AJAX)

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
<%
String remoteip = request.getRemoteAddr();
%>
<!doctype html>
<html>
<head>
<title> Recaptcha validation using jquery ajax </title>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script type="text/javascript" src="recaptcha_ajax.js"></script>
<script type="text/javascript">
function reloadRecaptcha() {
var publicKey = "your_public_key";
var div = "recap";
Recaptcha.create(publicKey,div,{theme: "white"});
return false;
}
function validate() {
var challenge = Recaptcha.get_challenge();
var response = Recaptcha.get_response();
var remoteip = "<%=remoteip%>";
$.ajax({
type: "POST",
url: "validateRecaptcha.jsp",
async: false,
data: {
remoteip: remoteip,
challenge: challenge,
response: response
},
success: function(resp) {
if(resp == "true") {
document.getElementById("message").innerHTML = "Perfect!";
}
else {
document.getElementById("message").innerHTML = "Incorrect Recaptcha! Please try again!";
reloadRecaptcha();
}
}
});
return false;
}
</script>
</head>
<body onload="return reloadRecaptcha();">
<form method="post" onsubmit="return validate();">
<table>
<tr>
<td colspan="2">
<div id="message" style="color:#ff0000; "></div>
<div id="recap"></div>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="Submit">
</td>
</tr>
</table>
</form>
</body>
</html>




sing reCAPTCHA with Java/JSP

Important: This is an old version of reCAPTCHA API. For the latest version, please refer to Version 2.0.

The reCAPTCHA Java Library provides a simple way to place a CAPTCHA on your Java-based website, helping you stop bots from abusing it. The library wraps the reCAPTCHA API.

To use reCAPTCHA with Java/JSP, you can download the reCAPTCHA Java Library here (contributed by Soren) and unzip it. Typically the only thing you'll need is the jar file (recaptcha4j-X.X.X.jar), which you have to copy to a place where it can be loaded by your java application. For example, if you are using Tomcat to run JSP, you may put the jar file in a directory called WEB-INF/lib/.

Quick Start

After you've signed up for your API keys and downloaded the reCAPTCHA Java Library, below are basic instructions for installing reCAPTCHA on your site.

Client Side (How to make the CAPTCHA image show up)

If you want to use the Java plugin to display the reCAPTCHA widget, you'll need to import the appropriate reCAPTCHA classes. In JSP, you would do this by inserting these lines near the top of the file with the form element where the reCAPTCHA widget will be displayed:

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
   
<%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

Then, you need to create an instance of reCAPTCHA:

    ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);

Finally, the HTML to display the reCAPTCHA widget can be obtained from the following function call:

    c.createRecaptchaHtml(null, null)

So, in JSP your code may look something like this:

    <%@ page import="net.tanesha.recaptcha.ReCaptcha" %>
   
<%@ page import="net.tanesha.recaptcha.ReCaptchaFactory" %>

   
<html>
     
<body>
       
<form action="" method="post">
       
<%
         
ReCaptcha c = ReCaptchaFactory.newReCaptcha("your_public_key", "your_private_key", false);
         
out.print(c.createRecaptchaHtml(null, null));
        %>
       
<input type="submit" value="submit" />
       
</form>
     
</body>
   
</html>

Don't forget to replace your_public_key and your_private_key with your API key values.

Server Side (How to test if the user entered the right answer)

In the application that verifies your form, you'll first need to import the necessary reCAPTCHA classes:

    import net.tanesha.recaptcha.ReCaptchaImpl;
   
import net.tanesha.recaptcha.ReCaptchaResponse;

Next, you need to insert the code that verifies the reCAPTCHA solution entered by the user. The example below (in JSP) shows how this can be done:

    <%@ page import="net.tanesha.recaptcha.ReCaptchaImpl" %>
   
<%@ page import="net.tanesha.recaptcha.ReCaptchaResponse" %>

   
<html>
     
<body>
     
<%
       
String remoteAddr = request.getRemoteAddr();
       
ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
        reCaptcha
.setPrivateKey("your_private_key");

       
String challenge = request.getParameter("recaptcha_challenge_field");
       
String uresponse = request.getParameter("recaptcha_response_field");
       
ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse);

       
if (reCaptchaResponse.isValid()) {
         
out.print("Answer was entered correctly!");
       
} else {
         
out.print("Answer is wrong");
       
}
      %>
     
</body>
   
</html>


자동가입방지 CAPTCHA 


CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart, 완전 자동화된 사람과 컴퓨터 판별,캡차)는 HIP(Human Interaction Proof) 기술의 일종으로, 어떠한 사용자가 실제 사람인지 컴퓨터 프로그램인지를 구별하기 위해 사용되는 방법이다. 사람은 구별할 수 있지만 컴퓨터는 구별하기 힘들게 의도적으로 비틀거나 덧칠한 그림을 주고 그 그림에 쓰여 있는 내용을 물어보는 방법이 자주 사용된다. 이것은 기존의 텍스트와 이미지를 일그러뜨린 형태로 변형한 후 인식 대상이 변형된 이미지로부터 기존 이미지를 도출해 낼 수 있는지를 확인하는 방식의 테스트이다. 컴퓨터 프로그램이 변형시킨 이미지는 사람이 쉽게 인식 할 수 있지만 컴퓨터 프로그램은 변형된 이미지를 인식하지 못하므로 테스트를 통과하지 못한다면 테스트 대상이 사람이 아님을 판정할 수 있다. 흔히 웹사이트 회원가입을 할 때 뜨는 자동가입방지 프로그램 같은 곳에 쓰인다. (위치백과)


CAPTCHA는 기기가 사람을 대상으로 하는 테스트이므로 사람에 가까운 기기를 대상으로 하는 테스트인 튜링 테스트(Turing test)에서 용어를 따와 리버스 튜링 테스트(Reverse Turing test)라고 부르기도 한다.


다양한 자동가입방지 Open Source들이 있다.

PHP를 응용한 것들은 더 많았지만 Java/JSP를 활용한 CAPTCHA들은 몇가지 안되었다.


1. reCaptcha ( http://www.google.com/recaptcha/intro/index.html )

구글에서 제공해주는 리캡차, 음성지원을 해준다. API Key 신청후 사용해야 함.

 


2. jCaptcha ( http://jcaptcha.sourceforge.net )

오픈소스로 심플한 화면 제공


3. jQuery Real Person ( http://keith-wood.name/realPerson.html )

jQueryr Plugin을 활용, 오픈소스

 


4. SimpleCaptcha http://simplecaptcha.sourceforge.net )

음성, 한글음성 지원, 심플한 UI 제공, 오픈소스

 


출저 : http://gnujava.com/board/article_view.jsp?board_no=11&article_no=5634




질문
운전면허 종류(1종,2종)와 운전면허 취득방법 알려주세요?
답변
일반적으로 취득하는 1종 보통과 2종 보통(만 18세이상인자)에 대해서만 설명합니다. 
 (그외에도 1종 대형, 소형, 특수/ 2종 소형, 원동기장치자전거 면허 등이 있음) 
 또, 1종 보통은 수동(스틱)만 있고 2종 보통에는 수동(스틱)과 자동(오토)이 있습니다.
제1종 보통면허로 운전할 수 있는 차량 
 ① 승용자동차 
 ② 승차정원 15인 까지의 승합자동차 
 ③ 승차정원 12인 까지의 긴급자동차(승용 및 승합자동차에 한한다.)
 ④ 적재중량 12톤 미만의 화물자동차 
 ⑤ 건설기계(도로를 운행하는 3톤 미만의 지게차에 한한다) 
 ⑥ 총중량 10톤 미만의 특수자동차(트레일러 및 레커는 제외한다)
 ⑦ 원동기장치자전거 
제2종 보통면허로 운전할 수 있는 차량 
 ① 승용자동차
 ② 승차정원 10인이하의 승합자동차
 ③ 적재중량 4톤 까지의 화물자동차
 ④ 총중량 3.5톤 이하의 특수자동차(트레일러 및 레커는 제외한다)
 ⑤ 원동기장치자전거

면허 취득방법 
 (본인의 운전능력과 금전적 문제 고려하여 신중히 선택)

 개인교습을 통한 방법(운전면허시험장 시험) 
 * 교통안전교육(1시간) →신체검사 및 학과시험 →기능시험 → 연습면허발급 → 도로주행시험 → 본면허발급
 * 전국 26개 면허시험장 어디에서나 시험가능(시험수수료 63000원)
 * 면허취소자나 운전경험자.특별히 운전감각이 뛰어난 사람
 * 완전초보자라면 신중히 고려하여 선택
 * 금전적으로 아끼려다가 시간과 돈 낭비하는 경향 있음 

 일반학원 등록밥법(운전면허시험장 시험) 
 * 기능 및 주행연습은 학원에서하고, 시험은 면허시험장에서 실시 수강료 약간 저렴(20~30만원)
 * 면허취소자나 시간적 여유부족하거나 불규칙한분

 전문학원 등록방법(학원 지체시험) 
 * 기능시험준비 및 주행 연습 및 학원자체에서 시험실시 초보자나 여자분에게 안정적
 * 수강료 약간 비쌈(40~50만원) 의무교육시간 완전 이수후 시험가능 
 * 1.2종 보통 기능:2시간 주행:6시간 의무교육(2011년 6월부터 실시) 

출저 : 클릭북


질문
전문학원과 일반학원이 어떻게 다른가요?
답변
자동차학원은 경찰청으로부터 정식으로 인가를 받아야 운영할 수 있습니다.
자동차운전전문학원과 자동차운전학원 두 가지가 있습니다.
【명칭】자동차운전전문학원 : 보통 "전문학원"으로 부릅니다.
            자동차운전학원 : 보통 "일반학원" 또는 "속성학원"으로 부릅니다.
              (일반학원은 "전문"이란 용어를 사용하지 못하도록 되어 있습니다)
【특징】전문학원 : 학원에서 연습뿐만 아니라 자체시험(검정)도 실시합니다. 보통 학원 
                         규모가 크고 자체시험이므로 합격률이 높습니다(합격률 95% 이상).
            일반학원 : 학원에서는 연습만¸ 시험은 면허시험장에서 봐야 합니다. 면허 취득
                        기간이 다소 짧아질 수 있으며 합격률은 전문학원에 비해 낮습니다
                        (합격률 50% 이하).
【교육시간¸수강료】전문학원 : 기능 2시간 + 주행 6시간 = 40~50만원
                            일반학원 :  30~40만원
【기타】전문학원 : 연습한 장소에서 시험보기 때문에 합격률이 높고 시설이 대체로 좋은 
                         편입니다. 학원에서 교통안전교육도 받을 수 있어 편리하고요.
            일반학원 : 수강료는 저렴하나 교육시간도 적어 시간당 수강료는 전문학원 대비
                          비슷합니다.
                          단¸ 교육시간이 적기 때문에 비용도 적고 잘만 하신다면 면허취득 기간도
                          줄일 수 있겠지요.
▶ 장 점
* 저렴하다 : 전체 수강료만 놓고 보면 일반학원이 전문학원보다 저렴.
                 교육시간에 상관없이 취득비용을 절약하고자 할 경우 선택. 
* 빠르다 : 기본적인 교육시간이 전문학원보다 일반학원이 짧음.
               기본적인 교육시간을 다 채우지 않아도 시험을 볼 수 있음.
▶ 단 점
* 학원시설 : 시설은 전문학원보다 상대적으로 떨어짐.
* 검정(시험)방법 : 전문학원과 달리 일반학원은 연습만 가능하고 시험은 면허시험장에서
                          치뤄야 하기 때문에 운전환경에 익숙치 않아 합격률이
                          전문학원 대비해 다소 떨어짐.
【 학원 명칭으로 일반학원과 전문학원을 구분 】
▶정식명칭 : 자동차운전학원(일반학원)¸ 자동차운전전문학원(전문학원) 
▶다른명칭 : 속성학원(일반학원)¸ 운전전문학원(전문학원)  
▶구분방법 : 일반학원은 학원이름에 "전문"이라는 명칭을 사용할 수가 없다.
                 "전문"이란 명칭이 들어가지 않았으면 일반학원이라고 보시면 됩니다.  
전문학원이라고 해서 모든 면허를 취득할 수 있는 것은 아닙니다.
기본적으로 1종 보통과 2종 보통면허의 취득은 가능합니다. 
1종 대형¸ 특수와  2종 소형¸ 원동기면허는 시설을 추가로 갖춘 학원에서만 가능합니다.

출저 : http://clickbook.co.kr/gongji/faq.asp?page=1&idxn=149&kinds=%B8%E9%C7%E3%B0%FC%B7%C3&no1=6


package com.example.androidserversocket;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

 TextView info, infoip, msg;
 String message = "";
 ServerSocket serverSocket;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  info = (TextView) findViewById(R.id.info);
  infoip = (TextView) findViewById(R.id.infoip);
  msg = (TextView) findViewById(R.id.msg);
  
  infoip.setText(getIpAddress());

  Thread socketServerThread = new Thread(new SocketServerThread());
  socketServerThread.start();
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();

  if (serverSocket != null) {
   try {
    serverSocket.close();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
 }

 private class SocketServerThread extends Thread {

  static final int SocketServerPORT = 8080;
  int count = 0;

  @Override
  public void run() {
   try {
    serverSocket = new ServerSocket(SocketServerPORT);
    MainActivity.this.runOnUiThread(new Runnable() {

     @Override
     public void run() {
      info.setText("I'm waiting here: "
        + serverSocket.getLocalPort());
     }
    });

    while (true) {
     Socket socket = serverSocket.accept();
     count++;
     message += "#" + count + " from " + socket.getInetAddress()
       + ":" + socket.getPort() + "\n";

     MainActivity.this.runOnUiThread(new Runnable() {

      @Override
      public void run() {
       msg.setText(message);
      }
     });

     SocketServerReplyThread socketServerReplyThread = new SocketServerReplyThread(
       socket, count);
     socketServerReplyThread.run();

    }
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

 }

 private class SocketServerReplyThread extends Thread {

  private Socket hostThreadSocket;
  int cnt;

  SocketServerReplyThread(Socket socket, int c) {
   hostThreadSocket = socket;
   cnt = c;
  }

  @Override
  public void run() {
   OutputStream outputStream;
   String msgReply = "Hello from Android, you are #" + cnt;

   try {
    outputStream = hostThreadSocket.getOutputStream();
             PrintStream printStream = new PrintStream(outputStream);
             printStream.print(msgReply);
             printStream.close();

    message += "replayed: " + msgReply + "\n";

    MainActivity.this.runOnUiThread(new Runnable() {

     @Override
     public void run() {
      msg.setText(message);
     }
    });

   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    message += "Something wrong! " + e.toString() + "\n";
   }

   MainActivity.this.runOnUiThread(new Runnable() {

    @Override
    public void run() {
     msg.setText(message);
    }
   });
  }

 }

 private String getIpAddress() {
  String ip = "";
  try {
   Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
     .getNetworkInterfaces();
   while (enumNetworkInterfaces.hasMoreElements()) {
    NetworkInterface networkInterface = enumNetworkInterfaces
      .nextElement();
    Enumeration<InetAddress> enumInetAddress = networkInterface
      .getInetAddresses();
    while (enumInetAddress.hasMoreElements()) {
     InetAddress inetAddress = enumInetAddress.nextElement();

     if (inetAddress.isSiteLocalAddress()) {
      ip += "SiteLocalAddress: " 
        + inetAddress.getHostAddress() + "\n";
     }
     
    }

   }

  } catch (SocketException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   ip += "Something Wrong! " + e.toString() + "\n";
  }

  return ip;
 }
}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="http://android-er.blogspot.com/"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/info"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <TextView
        android:id="@+id/infoip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </ScrollView>

</LinearLayout>

출저 : http://android-er.blogspot.kr/2014/02/android-sercerclient-example-server.html


lcd_bt_chat

블루투스를 이용한 아두이노-안드로이드 채팅

1. 아두이노-안드로이드 BT 채팅

블루투스를 이용한 아두이노와 안드로이드 간 채팅 시스템입니다. 아두이노-PC 간 USB 시리얼 연결로 사용자 입력을 받고 BT를 이용해서 안드로이드 폰으로 쏴줍니다. 안드로이드 폰에서도 사용자가 입력한 데이터를 BT를 이용해서 아두이노로 전달하고 전달된 메시지는 LCD 모듈에 표시됩니다. 소스, 구현이 간단하고 여러가지로 응용하기 좋습니다. 카페 공구를 이용하면 부품들도 저렴하게 구할 수 있습니다.

이미 거의 유사한 프로젝트가 GitHub 에 있으니 소스 참고하세요.

https://github.com/pablobuenaposada/arduino-HC-06/tree/master/Android

 

2. 구현 순서 

2-1. 아두이노

아두이노에서는 먼저 블루투스 모듈과 LCD 모듈을 연결합니다. 아래 별도로 작성해 둔 글을 참고해서 연결하시면 됩니다. 배선만 참고해서 연결하시고 소스코드는 이 글에 있는 소스를 사용하세요.

연결이 끝나면 아래 소스를 아두이노에 업로드 합니다.

PC에서 전달된 데이터를 안드로이드로 보내는 코드는 간단합니다. (2) 참고. Serial 연결에서 읽은 데이터를 BT로 넘겨주면 됩니다. 아두이노와 BT는 Software Serial 로 연결되기 때문에 SoftwareSerial.h 파일이 include 되어 있습니다.

안드로이드에서 전달해준 데이터를 LCD에 표시할 때는 약간의 처리를 해줘야 합니다. LCD가 16글자 2줄을 표시하기 때문에 적당히 줄넘김을 해줘야 합니다. Line break 를 식별할 수 있도록 안드로이드에서 처리해주지 않았기 때문에, 1초 이상 입력이 없으면 자동으로 줄넘김을 하도록 코딩 했습니다. (1) 참고. 만약 안드로이드에서 16자 이상을 한번에 보내면 16자 이후는 표시되지 않습니다. 구현하시는 분은 이 부분도 구현해보세요.

2-2. 안드로이드

안드로이드 앱 구현은 GitHub 프로젝트에 있는 소스를 빌드하시면 됩니다. 귀찮으면 아래에서 다운로드 하세요.

GitHub 소스 : https://github.com/pablobuenaposada/arduino-HC-06/tree/master/Android

안드로이드와 아두이노 BT 연결은 아래 순서대로 하세요.

  1. 먼저 아두이노를 켜서 HC-06 슬레이브 모듈이 페어링 대기상태에 들어가도록 합니다. (LED 깜빡깜빡)
  2. 위 GitHub 에서 받은 소스를 빌드하거나 아래 링크에서 APK 파일을 받아서 폰에 설치합니다.
  3. 폰의 설정 > 블루투스 에서 off 상태이면 BT on 으로 바꿉니다.
  4. BluetoothChat 앱을 실행 – 메뉴키 – Connect a device 선택
  5. Device List 에 HC-06 슬레이브 모듈이 보이는지 확인. 안보이면 Scan 버튼을 눌러서 찾아보고 그래도 안되면 1부터 다시합니다.
  6. HC-06 모듈이 보이면 선택 – 연결이 정상적으로 완료되면 챗팅 가능
  7. 폰으로 글 적으면 PC의 Serial Monitor에서 보이는지 확인합니다. 반대도 확인.

여기까지 완료되면 안드로이드와 아두이노 사이에 채팅이 가능합니다.

 

참고자료:


출저  : http://www.hardcopyworld.com/ngine/aduino/index.php/archives/188

Here is the code for the Server.

001package chatappserver;
002 
003import java.net.*;
004import java.io.*;
005import java.util.Vector;
006import java.lang.*;
007 
008public class ChatappServer {
009     
010    private static int port = 1234;
011    private static ServerSocket server = null;
012    private static Socket clientSocket;
013    private static String line;
014    private static BufferedReader streamIn;
015    private static PrintStream streamOut;
016     
017     
018    private static Vector<String> usernames = new Vector<String>();
019    private static Vector<PrintStream> streams = new Vector<PrintStream>();
020     
021    public static void main(String[] args) throws IOException{
022         
023        try{
024            System.out.println("Connecting to port " + port + " ....");
025            server = new ServerSocket(port);
026            System.out.println("Chat application server is now running..");
027            while(true){
028            clientSocket = server.accept();
029            chatHandler c = new chatHandler(clientSocket);
030            c.start();
031            }
032        }
033        catch(IOException e){
034            System.out.println("Couldn't connect to the port!");
035        }
036        finally{
037            server.close();
038        }      
039    }
040     
041    private static class chatHandler extends Thread{
042         
043        private Socket clientSocket;
044         
045        public chatHandler(Socket clientSocket){           
046            super("chatHandler");
047            this.clientSocket = clientSocket;
048        }
049         
050        public void run(){
051            
052            try{
053              streamIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
054              streamOut = new PrintStream(clientSocket.getOutputStream(), true);
055             
056              while(true){
057                streamOut.println("Username");
058                String line = streamIn.readLine();
059                if (line == null){
060                    return;           
061                }
062                try{
063                    synchronized(usernames){
064                        if(!usernames.contains(line)){
065                            usernames.add(line);
066                            break;
067                        }
068                    }
069                }
070                catch(Exception e){
071                    System.out.println(e);
072                }               
073              }
074              streamOut.println("Welcome");
075              streams.add(streamOut);
076               
077              while(true){
078              String message = streamIn.readLine();
079              if(message == null){
080                  return;
081              }
082              for(PrintStream stream : streams){
083                  stream.println("From " + line + ": " + message);
084              }
085               
086            }
087            }
088            catch(IOException e){
089                System.out.println(e);
090                 
091            }
092            finally{
093                if(line != null && streamOut != null){
094                    usernames.remove(line);
095                    streams.remove(streamOut);
096                }
097                try{
098                    clientSocket.close();
099                }
100                catch(IOException e){
101                    System.out.println(e);
102                }
103                 
104            }
105             
106                 
107            }
108             
109             
110        }
111         
112    }




The Client code is here..

01package chatappclient;
02 
03import java.net.*;
04import java.io.*;
05import javax.swing.JFrame;
06import javax.swing.JTextArea;
07import javax.swing.JTextField;
08import javax.swing.JButton;
09import javax.swing.*;
10import java.awt.event.*;
11 
12public class ChatappClient {
13     
14    private static int port = 1234;
15    JFrame window = new JFrame("Chat");
16    JButton sendBox = new JButton("Send");
17    JTextField inputMsg = new JTextField(35);
18    JTextArea outputMsg = new JTextArea(1035);
19    private static BufferedReader streamIn;
20    private static PrintStream streamOut;
21     
22    public static void main(String[] args) throws Exception{
23        ChatappClient client = new ChatappClient();
24        client.window.setVisible(true);
25        client.window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
26        client.run();       
27    }
28     
29    public ChatappClient(){
30         
31        inputMsg.setSize(4020);
32        sendBox.setSize(510);
33        outputMsg.setSize(3550);
34        inputMsg.setEditable(false);
35        outputMsg.setEditable(false);
36        window.getContentPane().add(inputMsg, "South");
37        window.getContentPane().add(outputMsg, "East");
38        window.getContentPane().add(sendBox, "West");
39        window.pack();
40        sendBox.addActionListener(new ActionListener(){
41            public void actionPerformed(ActionEvent e){
42                streamOut.println(inputMsg.getText());
43                inputMsg.setText("");
44            }
45        });
46        inputMsg.addActionListener(new ActionListener(){
47            public void actionPerformed(ActionEvent e){
48                streamOut.println(inputMsg.getText());
49                inputMsg.setText("");
50            }
51        });          
52    }
53     
54    private String getUsername(){
55        return JOptionPane.showInternalInputDialog(window, "Server IP Address:""Welcome to Chat", JOptionPane.QUESTION_MESSAGE);
56    }
57     
58    private void run() throws IOException{
59        Socket clientSocket = new Socket("localhost", port);
60        streamIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
61        streamOut = new PrintStream(clientSocket.getOutputStream(), true);
62     
63        while(true){
64            String line = streamIn.readLine();
65            if(line.startsWith("Username")){
66                streamOut.println(getUsername());
67            }else if(line.startsWith("Welcome")){
68                inputMsg.setEditable(true);
69            }else if(line.startsWith("From")){
70                outputMsg.append(line.substring(10)+ "\n");
71            }
72        }  
73    }
74}


출저 : http://www.dreamincode.net/forums/topic/277518-chat-using-socketssingle-server-with-multiple-clients/

+ Recent posts