1. 구현 결과 화면
2. SocketServer 프로젝트의 AndroidManifest.xml
인터넷 권한을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="qlyh8.tistory.com.socketserver"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" 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> | cs |
3. SocketServer 프로젝트의 MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package qlyh8.tistory.com.socketserver; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ServerThread thread = new ServerThread(); thread.start(); } }); } class ServerThread extends Thread { int port = 5001; @Override public void run() { try { // 서버 소켓을 생성하고 5001번 포트를 연다. ServerSocket serverSocket = new ServerSocket(port); Log.d("asd", "[Server] 서버 실행됨"); while (true){ // 클라이언트 접속 전까지 대기 상태로 들어간다. // 클라이언트 접속 시 소켓 객체가 리턴된다. // 이 소켓 객체를 통해 클라이언트가 요청한 정보를 받을 수 있다. Socket socket = serverSocket.accept(); // 들어오는 데이터를 읽는다. ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream()); Object inObject = inStream.readObject(); Log.d("asd", "[Server] 들어온 데이터: " + inObject); // 클라이언트에게 데이터를 보낸다. ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream()); outStream.writeObject(inObject); outStream.flush(); // 버퍼에 남아있을 수 있는 outStream 을 버림 Log.d("asd", "[Server] 클라이언트에 데이터 보냄"); socket.close(); // 소켓 연결 종료 } } catch (Exception e) { e.printStackTrace(); } } } } | cs |
4. SocketClient 프로젝트의 AndroidManifest.xml
인터넷 권한을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="qlyh8.tistory.com.socketclient"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" 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> | cs |
5. SocketClient 프로젝트의 MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | package qlyh8.tistory.com.socketclient; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ClientThread thread = new ClientThread(); thread.start(); } }); } class ClientThread extends Thread { String host = "localhost"; int port = 5001; @Override public void run() { try { // 호스트 정보와 포트 정보를 넣고 소켓을 생성한다. Socket socket = new Socket(host, port); // 요청을 위한 통로를 생성한다. ObjectOutputStream outStream = new ObjectOutputStream(socket.getOutputStream()); outStream.writeObject("Hello!"); outStream.flush(); Log.d("asd", "[Client] 서버로 보냄"); // 데이터가 들어오는 통로를 생성한다. ObjectInputStream inStream = new ObjectInputStream(socket.getInputStream()); Object inObject = inStream.readObject(); Log.d("asd", "[Client] 받은 데이터: " + inObject); socket.close(); // 소켓 연결 종료 } catch (Exception e) { e.printStackTrace(); } } } } | cs |
출처: https://www.edwith.org/boostcourse-android/lecture/17088/
'Android' 카테고리의 다른 글
HTTP - 1. HTTP란 (0) | 2018.07.30 |
---|---|
소켓 (Socket) - 3. 소켓 사용하기 (2) (0) | 2018.07.28 |
소켓 (Socket) - 1. 소켓이란 (0) | 2018.07.25 |
AsyncTask (0) | 2018.07.25 |
스레드 (Thread) - 3. 핸들러를 이용한 스레드 구현 (2) (0) | 2018.07.24 |