package com.morp.android;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class Launcher extends Activity implements OnClickListener {
 public static String SERVER_IP = "221.145.23.169";
 public static int SERVER_PORT = 15464;
 Button sendButton;
 EditText inputField;
 TextView textView;
 String name;
 Socket socket;
 DataInputStream input;
 DataOutputStream output;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  sendButton = (Button) findViewById(R.id.sendButton);
  inputField = (EditText) findViewById(R.id.inputField);
  textView = (TextView) findViewById(R.id.textView);
  sendButton.setOnClickListener(this);
  intro();
 }
 @Override
 public void onDestroy() {
  try {
   socket.close();
   input.close();
   output.close();
  } catch (IOException e) {
  }
 }
 public void intro() {
  print("Morp 채팅에 접속하셨습니다! (v1.0 by 김 현준)\n");
  print("대화명을 입력하시고 전송 버튼을 눌러 주세요.");
 }
 public void print(Object message) {
  textView.append(message + "\n");
 }
 public void onClick(View view) {
  switch (view.getId()) {
  case R.id.sendButton:
   if (inputField.getText().toString() == "")
    return;
   if (name == null) {
    String text = inputField.getText().toString();
    inputField.setText("");
    name = text;
    connect();
   } else {
    String text = inputField.getText().toString();
    inputField.setText("");
    try {
     output.writeUTF("c`" + text);
     output.flush();
    } catch (IOException e) {
     print("메시지 전송을 실패하였습니다.");
    }
   }
   break;
  }
 }
 public void connect() {
  try {
   print(SERVER_IP + ":" + SERVER_PORT + "로 접속 중...");
   socket = new Socket(SERVER_IP, SERVER_PORT);
   input = new DataInputStream(socket.getInputStream());
   output = new DataOutputStream(socket.getOutputStream());
   while (socket != null) {
    if (socket.isConnected()) {
     output.writeUTF("r`1`1`" + name + "`");
     output.flush();
     break;
    }
   }
   MessageReciver messageReceiver = new MessageReciver();
   messageReceiver.start();
  } catch (Exception e) {
   print("서버에 접속할 수 없습니다.");
   this.finish();
  }
 }
 public String chatMessage;
 public class MessageReciver extends Thread {
  public void run() {
   try {
    String received;
    while ((received = input.readUTF()) != null) {
     String[] buffer = received.split("`");
     switch (buffer[0].charAt(0)) {
     case 'n':
      chatMessage = "★★★" + buffer[1] + "★★★";
      break;
     case 'c':
      chatMessage = buffer[1] + ": " + buffer[2];
      break;
     case 'x':
      chatMessage = "☆☆☆" + buffer[1] + "☆☆☆";
      break;
     }
     Message message = handler.obtainMessage(1, received);
     handler.sendMessage(message);
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
 }
 Handler handler = new Handler() {
  public void handleMessage(Message message) {
   super.handleMessage(message);
   print(chatMessage);
  }
 };
}


로그캣은

06-24 16:28:47.597: I/Process(522): Sending signal. PID: 522 SIG: 906-24 16:29:01.418: W/KeyCharacterMap(531): No keyboard for id 00

6-24 16:29:01.418: W/KeyCharacterMap(531): Using default keymap: /system/usr/keychars/qwerty.kcm.bin

 

06-24 16:29:08.067: W/IInputConnectionWrapper(531): showStatusIcon on inactive InputConnection

06-24 16:29:08.477: D/AndroidRuntime(531): Shutting down VM06-24 16:29:08.477: W/dalvikvm(531): threadid=1: thread exiting with uncaught exception (group=0x40015560)

06-24 16:29:08.787: E/AndroidRuntime(531): FATAL EXCEPTION: main

06-24 16:29:08.787: E/AndroidRuntime(531): java.lang.RuntimeException: Unable to destroy activity {com.morp.android/com.morp.android.Launcher}: java.lang.NullPointerException

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2672)

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2690)

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.app.ActivityThread.access$2100(ActivityThread.java:117)

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:964)

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.os.Handler.dispatchMessage(Handler.java:99)

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.os.Looper.loop(Looper.java:123)

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.app.ActivityThread.main(ActivityThread.java:3683)

06-24 16:29:08.787: E/AndroidRuntime(531):  at java.lang.reflect.Method.invokeNative(Native Method)

06-24 16:29:08.787: E/AndroidRuntime(531):  at java.lang.reflect.Method.invoke(Method.java:507)

06-24 16:29:08.787: E/AndroidRuntime(531):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)

06-24 16:29:08.787: E/AndroidRuntime(531):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)

 06-24 16:29:08.787: E/AndroidRuntime(531):  at dalvik.system.NativeStart.main(Native Method)

06-24 16:29:08.787: E/AndroidRuntime(531): Caused by: java.lang.NullPointerException

06-24 16:29:08.787: E/AndroidRuntime(531):  at com.morp.android.Launcher.onDestroy(Launcher.java:49)

06-24 16:29:08.787: E/AndroidRuntime(531):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:2659)

06-24 16:29:08.787: E/AndroidRuntime(531):  ... 11 more06-24 16:34:09.027: I/Process(531): Sending signal. PID: 531 SIG: 9

 

프로그램 실행하니까 중간에 에러뜨네요... 어디가 잘못됐는지 가르쳐주시면 감사하겠습니다. -_-;;;