마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

소켓 통신시 한글 전송할 때 깨짐 현상

0 추천

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.StringTokenizer;

import org.apache.lucene.analysis.kr.morph.MorphAnalyzer;
import org.apache.lucene.analysis.kr.KoreanTokenizer;
import java.io.StringReader;
import org.apache.lucene.analysis.Token;
import org.apache.lucene.analysis.kr.morph.AnalysisOutput;

public class TCPServer {   //nstart 대신에 사용하시는 클래스 이름을 적으셔요
	public static void main(String[] args) throws IOException {  // 메인함수, IOException
		ServerSocket serverSocket = null; //서버소켓 생성
		Socket clientSocket = null; // 서버소켓이 지정한 포트를 타고온 상대 ip를 저장할 수 있다.
		PrintWriter out = null;  // String 타입의 문자를 보낼수 있는 함수.
		BufferedReader in = null;//stream 타입의 문자를 읽어서 저장할 수 있는 함수.

		serverSocket = new ServerSocket(5555); //서버소켓 생성

		try {
			// 서버 소켓을 만들고 연결을 기다린다.
			clientSocket = serverSocket.accept(); //클라이언트로부터 데이터가 오는것을 감지한다.
			System.out.println("클라이언트 연결");

			// 클라이언트로 부터 데이터를 받는다.
			out = new PrintWriter(clientSocket.getOutputStream(), true); //String 타입을 stream 형태로 변환하여 전송한다는 뜻.
			in = new BufferedReader(new InputStreamReader(
					clientSocket.getInputStream(),"utf-8")); //소켓에서 넘오는 stream 형태의 문자를 얻은 후 읽어 들어서                                                                                               //bufferstream 형태로 in 에 저장.

			while (true) {
				String inputLine = null; //in 으로 받아들인 데이터를 저장할 string 생성
				inputLine = in.readLine(); //in에 저장된 데이터를 String 형태로 변환 후 읽어들어서 String에 저장
				System.out.println("클라이언트로 부터 받은 문자열:" + inputLine); //저장된값 콘솔 출력
				out.println(inputLine); //돌아온값을 다시 되돌려 보낸다. //String이 stream으로 변환되어 전송됨.
				if (inputLine.equals("quit")) //만약 받은 값이 quit 일경우 종료
					break;
			}
			out.close();
			in.close();
			clientSocket.close();
			serverSocket.close();  //열린 모든것을 닫아준다.
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

이게 서버 이구요

 

package com.example.ex01_client;
import java.io.BufferedReader;  //우와 많다 ㅎㅎ..
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {    //메인 activity 시작!

 private Socket socket;  //소켓생성
 BufferedReader in;      //서버로부터 온 데이터를 읽는다.
 PrintWriter out;        //서버에 데이터를 전송한다.
 EditText input;         //화면구성
 Button button;          //화면구성
 TextView output;        //화면구성
 String data;            //

 @Override
 protected void onCreate(Bundle savedInstanceState) {   //앱 시작시  초기화설정
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  //start
  input = (EditText) findViewById(R.id.input); // 글자입력칸을 찾는다.
  button = (Button) findViewById(R.id.button); // 버튼을 찾는다.
  output = (TextView) findViewById(R.id.output); // 글자출력칸을 찾는다.
  
  
  
// 버튼을 누르는 이벤트 발생, 이벤트 제어문이기 때문에 이벤트 발생 때마다 발동된다. 시스템이 처리하는 부분이 무한루프문에 
//있더라도 이벤트가 발생하면 자동으로 실행된다.
 button.setOnClickListener(new OnClickListener() { 
   public void onClick(View v) {
    //버튼이 클릭되면 소켓에 데이터를 출력한다.
    String data = input.getText().toString(); //글자입력칸에 있는 글자를 String 형태로 받아서 data에 저장
    Log.w("NETWORK", " " + data);
    if (data != null) { //만약 데이타가 아무것도 입력된 것이 아니라면
     out.println(data); //data를   stream 형태로 변형하여 전송.  변환내용은 쓰레드에 담겨 있다.
    }
   }
  });
  
  
  
  

  Thread worker = new Thread() {    //worker 를 Thread 로 생성
   public void run() { //스레드 실행구문
    try {
     //소켓을 생성하고 입출력 스트립을 소켓에 연결한다.
     socket = new Socket("192.168.0.7", 5555); //소켓생성
     out = new PrintWriter(socket.getOutputStream(), true); //데이터를 전송시 stream 형태로 변환하여 전송한다.
     in = new BufferedReader(new InputStreamReader(
       socket.getInputStream(),"utf-8")); //데이터 수신시 stream을 받아들인다.

    } catch (IOException e) {
     e.printStackTrace();
    }

    //소켓에서 데이터를 읽어서 화면에 표시한다.
    try {
     while (true) {
      data = in.readLine(); // in으로 받은 데이타를 String 형태로 읽어 data 에 저장
      Log.i("App", data);
      output.post(new Runnable() {
       public void run() {
        output.setText(data); //글자출력칸에 서버가 보낸 메시지를 받는다.
       }
      });
     }
    } catch (Exception e) {
    }
   }
  };
  
  
  
  
  worker.start();  //onResume()에서 실행.
  
  
  
 }

 @Override
 protected void onStop() {  //앱 종료시
  super.onStop();
  try {
   socket.close(); //소켓을 닫는다.
  } catch (IOException e) {
   e.printStackTrace();
  }
 }
  

}

이게 MainActivity.java 입니다.

 

이대로 실행을 해보면

 

이런식으로 한글이 깨져서 나옵니다... UTF-8로 설정을 했는데... 제가 뭐를 빠뜨린건가요?

 

영어랑 숫자는 잘 나옵니다;;

알려주세요~ ㅠㅠ

김윤섭 (150 포인트) 님이 2013년 11월 7일 질문
김윤섭님이 2013년 11월 7일 수정

1개의 답변

0 추천
 
채택된 답변

이게 맞는지는 모르겠는데요....

음.. in.readLine 은 utf 8 로 변환 안하시는 듯 해서요... 

혹시 이게 도움이 되실까해서요...

 

http://stackoverflow.com/questions/6370808/datainputstream-and-readline-with-utf8

그냥 달아 보고 갑니다. 

화이팅 하세요.

미래갑부인택 (1,040 포인트) 님이 2013년 11월 8일 답변
김윤섭님이 2013년 11월 12일 채택됨
...