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

+ Recent posts