총 게시물 1,105건, 최근 0 건 안내 RSS 글쓰기
이전글  다음글  목록 글쓰기
[소스코드]

소스공개 - 안드로이드 채팅 소스, 자바 서버 및 클라이언트 포함 (Android Chatting Source) [출처] 소스공개 - 안드로이드 채팅 소스, 자바 서버 및 클라이언트 포함 (Android Chatting Source)|작성자 넷플

글쓴이 : 카이로 날짜 : 2013-05-12 (일) 10:08 조회 : 12142
글주소 : http://www.androidside.com/B56/24085
 
  구로 오라클자바교육센터
개발회사 부설 교육기관, 현업강사 단기속성 실무강좌, 재직자환급, 구직자 무료취업
www.oraclejava.co.kr
  임베디드 개발 마이크로비젼
임베디드 개발용역, 개발보드, 에뮬레이터.
www.mvtool.co.kr
  서울게임아카데미
추천게임학원, 2018년 한국 소비자만족지수 1위, 고용노동부국비지원, 수강료조회
www.seoulgame.co.kr
신청하기


출처 : http://show.ideatree.kr/pages/index.php3?asp_board_idx=359&board_content_idx=2320

 

** 안드로이드 공부하면서 수집한 정보를 토대로 
 최대한 이해하기 쉽게 소스를 정리해 보았습니다.
 안드로이드 클라이언트는 소스를 최소화 하기 위해 서버 접속과 메시지 수신부만 구현하였습니다.
 송신부는 PrintWriter를 사용하여 직접한 번 구현해 보시기 바랍니다. ^^

 

1.구성

  • 자바 채팅서버
  • 자바 채팅클라이언트
  • 안드로이드 채팅클라이언트

2.목적

자바 채팅클라이언트와 안드로이드 채팅클라이언트 간의 메시지 송수신 확인

3.실행방법

3-1.서버구동




3-2.자바클라이언트 구동







3-3.테스트 방법



4.소스


4-1. 자바 서버 소스

package chap8;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;

public class ChatServer {
 private final static int SERVER_PORT = 10001;
 public static void main(String[] args) {
  try{
   ServerSocket server = new ServerSocket(SERVER_PORT);
   HashMap hm = new HashMap();
   System.out.println("waiting connection..");
   while(true){
    Socket sock = server.accept();
    ChatThread chatthread = new ChatThread(sock, hm);
    chatthread.start();
   }
  }
  catch(Exception e){
   System.out.println(e);
  }
 }
}

class ChatThread extends Thread{
 private final Socket sock ; 
 private final HashMap hm ; 
 private String id;   

 private BufferedReader br;
 private boolean initFlag = false;
 public ChatThread(Socket sock, HashMap hm){
  this.sock = sock;
  this.hm = hm;
  
  try{
   PrintWriter pw = new PrintWriter( new OutputStreamWriter(sock.getOutputStream()) );
   br = new BufferedReader( new InputStreamReader(sock.getInputStream()) );
   id = br.readLine();
   broadcast(id + " is connected");
   System.out.println("connected user id is "+id);
   synchronized(hm){
    hm.put(this.id, pw);
   }
   initFlag = true;
   
  }
  catch(Exception ex){ System.out.println(ex); }
 }
 public void run(){
  try{
   String line = null;
   while( (line=br.readLine() )!= null ) {
    if(line.equals("/quit"))break;
    
    if(line.indexOf("/to")==0)sendmsg(line);
    else broadcast(id+":"+line);
   }
  }
  catch(Exception ex){}
  finally{
   synchronized(hm){
    hm.remove(id);
   }
   broadcast(id+" is terminated");
   try { if(sock != null)sock.close();}
   catch(Exception ex){}
  }
 }
 public void sendmsg(String msg){
  int start = msg.indexOf(" ")+1;
  int end = msg.indexOf(" ",start);
  
  if(end != -1){
   String to = msg.substring(start,end);
   String msg2 = msg.substring(end+1);
   Object obj = hm.get(to);
   if(obj != null){
    PrintWriter pw = (PrintWriter)obj;
    pw.println(id+" tells : " + msg2);
    pw.flush();
   }
  }
 }
 public void broadcast(String msg){
  synchronized(hm){
   Collection collection = hm.values();
   Iterator iter = collection.iterator();
   while(iter.hasNext()){
    PrintWriter pw = (PrintWriter)iter.next();
    pw.println(msg);
    pw.flush();
   }
  }
 }
}


4-2. 자바 클라이언트 소스

package chap8;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

public class ChatClient {

 public static void main(String[] args) {
  if(args.length != 2){
   System.out.println("Usage : java ChatClient {Your Id} {Server IP}");
   System.exit(1);
  }
  
  Socket sock = null;
  BufferedReader br = null;
  PrintWriter pw = null;
  boolean endflag = false;
  try{
   sock = new Socket(args[1],10001);
   pw = new PrintWriter( new OutputStreamWriter( sock.getOutputStream() ) );
   br = new BufferedReader( new InputStreamReader( sock.getInputStream() ) );
   BufferedReader keyboard = new BufferedReader( new InputStreamReader(System.in) );
   
   pw.println(args[0]) ;
   pw.flush();
   
   InputThread it = new InputThread(sock, br);
   it.start();

   String line = null;
   while( (line = keyboard.readLine()) != null){
    pw.println(line);
    pw.flush();
    if(line.equals("/quit")){
     endflag = true;
     break;
    }
   }
   System.out.println("Terminating.");
  }
  catch(Exception ex){
   if(!endflag)System.out.println(ex);
  }
  finally {
   try{
    if(pw != null)pw.close();
   }
   catch(Exception ex){}
   try {
    if(br != null)br.close();
   }
   catch(Exception ex){}
   try {
    if(sock != null)sock.close();
   }
   catch(Exception ex){}   
  }
 }
}

class InputThread extends Thread {
 private Socket sock = null;
 private BufferedReader br = null;
 public InputThread(Socket sock, BufferedReader br){
  this.sock = sock;
  this.br = br;
 }
 
 public void run(){
  try{
   String line = null;
   while( (line=br.readLine()) != null){
    System.out.println(line);
   }
  }
  catch(Exception ex){}
  finally {
   try {
    if(br != null)br.close();
   }catch(Exception ex){}
   try{
    if(sock != null)sock.close();
   }catch(Exception ex){}
  }
 }
}


4-3. 안드로이드 클라이언트 소스

package Soket.test;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Window;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class SoketChat extends Activity {
 private final static String IP = "10.0.2.2";
 private final static int PORT = 10001;
 private final static String LOGIN_ID="AndroidClient";
 
 private TextView lblReceive;
 private String txtReceive;
 private Socket socket;
 private InputStream in;
 private OutputStream out;
 private final Handler handler = new Handler();
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        
        RelativeLayout layout = new RelativeLayout(this);
        layout.setBackgroundColor(Color.rgb(255, 255, 255));
        setContentView(layout);

        // -- label for messages
        lblReceive = new TextView(this);
        lblReceive.setId(1);
        lblReceive.setText("");
        lblReceive.setTextSize(16.0f);
        lblReceive.setTextColor(Color.rgb(0,0,0));
        RelativeLayout.LayoutParams param1 = new RelativeLayout.LayoutParams(320,400);
        lblReceive.setLayoutParams(param1);
        layout.addView(lblReceive);

        // -- Thread for Connection
        Thread cThread = new Thread(){public void run(){
         try{
          connect(IP,PORT);
         } catch(Exception e){} }
        };
        cThread.start();
    }
    private void connect(String ip, int port){
     int size;
     byte[] w = new byte[10240];
     txtReceive="";
     try{
      socket = new Socket(ip,port);
      if(socket != null) {
       in = socket.getInputStream();
       out = socket.getOutputStream();

       PrintWriter pw = new PrintWriter( new OutputStreamWriter( out ) );
       pw.println(LOGIN_ID);
       pw.flush() ;
       
       while(socket != null && socket.isConnected()){
        size = in.read(w);
        if(size<=0)continue;
        txtReceive = new String(w,0,size,"UTF-8");
        handler.post(new Runnable(){
         public void run() {
          lblReceive.setText( lblReceive.getText()+txtReceive );
         }
        });
       }
      }
     } catch (Exception ex) {Log.e("socket",ex.toString());}
    }
}




로그인 창이 있는 "정보 수정"에서
서명 이쁘게 등록해보세요 ^^

추천 버튼을 클릭하면 추천한 자와 추천받은 자 모두에게 포인트가 지급됩니다.

개발자신종진 2015-01-05 (월) 15:53
유용한 정보 감사해요 ~!
댓글주소
키도리 2015-01-18 (일) 11:01
어떻게 적용해야 할진 잘 모르겠지만..
좋은 정보 감사합니다..^^

댓글주소
fickup 2016-10-22 (토) 14:35
유용한 정보 감사합니다.
댓글주소
광영란 2019-02-02 (토) 15:18
적용하는 방법좀 알려주실수 있나요!
서버는 있는데 
자바서버랑 클라이언트 서버 두개 서버쪽에서 켠 후
안드로이드 클라이언트 열면되는 건가요 ??
한번 구동되는지 확인해보고싶은데..
댓글주소
처음  1  2
이전글  다음글  목록 글쓰기

총 게시물 1,105건, 최근 0 건 안내 RSS
번호 분류 제목 글쓴이 날짜 추천 조회
1105 소스코드  안드로이드 두더지게임 (랭킹, 두더지 종류 -… 홍훙훙 10-04 0 813
1104 강좌  100 Days Google Dev, 3: Google Play Services 7.5 StanleyKou 01-24 1 1319
1103 강좌  100 Days Google Dev, 2: The Magic of LRU Cache StanleyKou 01-20 0 1280
1102 강좌  100 Days Google Dev, 1: Android Design Support Library 2 StanleyKou 01-18 0 1511
1101 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 5 에찌 05-08 5 3166
1100 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 1 김병희라고요 04-26 0 2922
1099 TIP&TECH  TabLayout ClickEvent 1 에찌 04-21 1 2577
1098 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 4 에찌 04-14 2 3889
1097 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 2 2525
1096 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 2071
1095 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 2577
1094 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 3 2609
1093 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 2 4558
1092 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 3092
1091 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 3302
1090 강좌  왕앱따 107. 자바/C++ 파일읽기 속도 비교/[Androi 김병희라고요 11-26 0 3254
1089 강좌  왕앱따 106. C++ 동영상 강좌/[Android] 1 김병희라고요 11-23 0 4025
1088 소스코드  AOSP용 한글 키보드 입력키 엘카이저 11-17 1 3850
1087 강좌  addDrawerListener, setDrawerListener(deprecated)/[Android] 김병희라고요 11-02 2 3766
1086 강좌  왕앱따 103. 아이콘 반복클릭 테스트/[Android] 1 김병희라고요 11-01 0 3005
 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  다음  맨끝
 


Copyright ⓒ www.androidside.com. All rights reserved.
채팅 권한: 글쓰기 1개
2레벨 이상만 대화 가능
공개 채팅: 평일 !(9시 ~ 17시),토,일
안사2 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기