- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
- <TextView
- android:layout_width="match_parent"
- android:layout_height="100dp"
- android:text=""
- android:id="@+id/textView"
- android:layout_alignParentLeft="true"
- android:layout_marginLeft="0dp"
- android:layout_above="@+id/linearLayout"
- android:layout_alignParentTop="true" />
- <LinearLayout
- android:orientation="horizontal"
- android:layout_width="match_parent"
- android:layout_height="46dp"
- android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true"
- android:layout_alignParentStart="true"
- android:id="@+id/linearLayout"
- android:weightSum="1">
- <EditText
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/editText"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true"
- android:layout_weight="1.00" />
- <Button
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="전송"
- android:id="@+id/button"
- android:layout_alignParentLeft="true"
- android:layout_alignParentTop="true" />
- </LinearLayout>
- </RelativeLayout>
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.example.webnautes.client" >
- <uses-permission android:name="android.permission.INTERNET"/>
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:supportsRtl="true"
- android:theme="@style/AppTheme" >
- <activity android:name=".MainActivity" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- </manifest>
package com.example.webnautes.client;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class MainActivity extends Activity {
private EditText textField;
private Button button;
private TextView textView;
private Socket client;
private PrintWriter printwriter;
private BufferedReader bufferedReader;
//Genymotion에서 가상머신의 IP대역이 192.168.56.X이고
//PC의 vboxnet0 인터페이스 아이피가 192.168.56.1임...
private String SERVER_IP = "192.168.56.1";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textField = (EditText) findViewById(R.id.editText);
button = (Button) findViewById(R.id.button);
textView = (TextView) findViewById(R.id.textView);
ChatOperator chatOperator = new ChatOperator();
chatOperator.execute();
}
private class ChatOperator extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
try {
client = new Socket(SERVER_IP, 9999); // Creating the server socket.
if (client != null) {
//자동 flushing 기능이 있는 PrintWriter 객체를 생성한다.
//client.getOutputStream() 서버에 출력하기 위한 스트림을 얻는다.
printwriter = new PrintWriter(client.getOutputStream(), true);
InputStreamReader inputStreamReader = new InputStreamReader(client.getInputStream());
//입력 스트림 inputStreamReader에 대해 기본 크기의 버퍼를 갖는 객체를 생성한다.
bufferedReader = new BufferedReader(inputStreamReader);
} else {
System.out.println("Server has not bean started on port 9999.");
}
} catch (UnknownHostException e) {
System.out.println("Faild to connect server " + SERVER_IP);
e.printStackTrace();
} catch (IOException e) {
System.out.println("Faild to connect server " + SERVER_IP);
e.printStackTrace();
}
return null;
}
/**
* Following method is executed at the end of doInBackground method.
*/
@Override
protected void onPostExecute(Void result) {
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String text = textField.getText().toString();
final Sender messageSender = new Sender(); // Initialize chat sender AsyncTask.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
messageSender.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, text);
} else {
messageSender.execute(text);
}
}
});
if ( client != null) {
Receiver receiver = new Receiver(); // Initialize chat receiver AsyncTask.
receiver.execute();
}
}
}
/**
* This AsyncTask continuously reads the input buffer and show the chat
* message if a message is availble.
*/
private class Receiver extends AsyncTask<Void, Void, Void> {
private String message;
@Override
protected Void doInBackground(Void... params) {
while (true) {
try {
//스트림으로부터 읽어올수 있으면 true를 반환한다.
if (bufferedReader.ready()) {
//'\n', '\r'을 만날 때까지 읽어온다.(한줄을 읽어온다.)
message = bufferedReader.readLine();
publishProgress(null);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
Thread.sleep(500);
} catch (InterruptedException ie) {
}
}
}
//publishProgress(null)에 의해서 호출된다. '
//서버에서 전달받은 문자열을 읽어서 화면에 출력해준다.
@Override
protected void onProgressUpdate(Void... values) {
textView.append("Server: " + message + "\n");
}
}
/**
* This AsyncTask sends the chat message through the output stream.
*/
private class Sender extends AsyncTask<String, String, Void> {
private String message;
@Override
protected Void doInBackground(String... params) {
message = params[0];
//문자열을 스트림에 기록한다.
printwriter.write(message + "\n");
//스트림을 플러쉬한다.
printwriter.flush();
return null;
}
//클라이언트에서 입력한 문자열을 화면에 출력한다.
@Override
protected void onPostExecute(Void result) {
textField.setText(""); // Clear the chat box
textView.append("Client: " + message + "\n");
}
}
}
'Android > 개념 및 예제' 카테고리의 다른 글
Android의 LinearLayout 정리 (0) | 2016.07.14 |
---|---|
안드로이드 센서를 로봇 제어에 사용하기 (가속도 센서, 자기장 센서 ) (4) | 2015.11.23 |
안드로이드 백그라운드 서비스 예제 - IntentService (0) | 2015.02.21 |
Android WebView 예제 (0) | 2014.07.09 |
android.os.NetworkOnMainThreadException (0) | 2014.06.29 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!