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

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

글쓴이 : 카이로 날짜 : 2013-05-12 (일) 10:08 조회 : 12395
글주소 : http://www.androidside.com/B56/24085
 
  임베디드 개발 마이크로비젼
임베디드 개발용역, 개발보드, 에뮬레이터.
www.mvtool.co.kr
  앱개발 전문교육기관 에이콘
고용노동부 지정 우수훈련기관, 100%전액무료, 안드로이드, 실무교육, 취업지원
acornedu.co.kr
  재능을 거래하는 문화 재능넷
저렴한 비용으로 안드로이드 재능을 거래하는 신개념 재능거래 오픈마켓
www.jaenung.net
신청하기


출처 : 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 1 1047
1104 강좌  100 Days Google Dev, 3: Google Play Services 7.5 StanleyKou 01-24 1 1454
1103 강좌  100 Days Google Dev, 2: The Magic of LRU Cache StanleyKou 01-20 0 1419
1102 강좌  100 Days Google Dev, 1: Android Design Support Library 2 StanleyKou 01-18 0 1658
1101 TIP&TECH  리스트뷰에서 스위치,체크박스사용시 5 에찌 05-08 5 3357
1100 TIP&TECH  뷰(RecyclerView/...)에 Max Height 주기/[Android] 1 김병희라고요 04-26 0 3206
1099 TIP&TECH  TabLayout ClickEvent 1 에찌 04-21 1 2770
1098 TIP&TECH  현재 사용하고 있는 어플 foreground인지 backgroun… 4 에찌 04-14 2 4210
1097 TIP&TECH  안드로이드 Drawble 에 해상도 마다 이미지를 … 1 에찌 04-14 2 2679
1096 TIP&TECH  fragment 에서 ButterKnife 사용 시 resource가져올 때… 1 에찌 04-12 0 2224
1095 TIP&TECH  Youtube 및 facebook 동영상 업로드 할때 1 희망과꿈을 03-28 0 2723
1094 TIP&TECH  google service lib 가져올 때 3 에찌 03-20 3 2760
1093 소스코드  CentralRV 프로젝트 - RecyclerView 가로/세로 가운… 1 김병희라고요 01-30 2 4861
1092 TIP&TECH  번개검색 시스템/[Android] 2 김병희라고요 12-29 2 3233
1091 TIP&TECH  RecyclerView 특정 포지션으로 스크롤 - smoothScroll… 1 김병희라고요 12-12 1 3581
1090 강좌  왕앱따 107. 자바/C++ 파일읽기 속도 비교/[Androi 김병희라고요 11-26 0 3429
1089 강좌  왕앱따 106. C++ 동영상 강좌/[Android] 1 김병희라고요 11-23 0 4290
1088 소스코드  AOSP용 한글 키보드 입력키 엘카이저 11-17 1 4180
1087 강좌  addDrawerListener, setDrawerListener(deprecated)/[Android] 김병희라고요 11-02 2 3936
1086 강좌  왕앱따 103. 아이콘 반복클릭 테스트/[Android] 1 김병희라고요 11-01 0 3220
 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 변경사항 보러가기 챗방이 잘 안보이면 크롬에서 접속해주세요
챗방 숨기기 |  챗방 보이기