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




@OverrideOnDestroy() 부분에서 무조껀 close 하지마시고 null check 를 만들어보심이..publicvoid onDestroy() {try {if(socket != null)socket.close();if(input != null)input.close();if(output != null)output.close();} catch (IOException e) {}}