Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags more
Archives
Today
Total
관리 메뉴

맨땅에 코딩

[안드로이드] 서버에 데이터 요청 및 응답 (소켓 통신) 본문

앱 개발/Java

[안드로이드] 서버에 데이터 요청 및 응답 (소켓 통신)

맨땅 2022. 3. 29. 15:32

목차

    반응형

     

     

    클라이언트와 서버 소켓을 생성

    클라이언트 -> 서버 (데이터 요청)

    서버 -> 클라이언트 (데이터 응답)

     

     

     

     

     

     

    [activity_main.xml]

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#4aa8d8"
            android:orientation="vertical">
    
            <EditText
                android:id="@+id/editText"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ems="10"
                android:hint=""
                android:inputType="textPersonName"
                tools:ignore="SpeakableTextPresentCheck" />
    
            <Button
                android:id="@+id/button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="전송" />
    
            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" >
    
                    <TextView
                        android:id="@+id/textView"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textSize="20sp" />
                </LinearLayout>
            </ScrollView>
        </LinearLayout>
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="#ff7f00"
            android:orientation="vertical">
    
            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="서버 시작" />
    
            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical">
    
                    <TextView
                        android:id="@+id/textView2"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:textSize="20sp"
                        />
                </LinearLayout>
            </ScrollView>
        </LinearLayout>
    </LinearLayout>

     

     

    [MainActivity.java]

    package org.techtown.samplesocket;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.os.Handler;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    import java.io.ObjectInputStream;
    import java.io.ObjectOutput;
    import java.io.ObjectOutputStream;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class MainActivity extends AppCompatActivity {
    
        EditText editText;
        TextView textView, textView2;
        Handler handler = new Handler();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            editText = findViewById(R.id.editText);
            textView = findViewById(R.id.textView);
            textView2 = findViewById(R.id.textView2);
    
            Button button = findViewById(R.id.button);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    final String data = editText.getText().toString();
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            send(data);
                        }
                    }).start();
                }
            });
    
            Button button2 = findViewById(R.id.button2);
            button2.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            startServer();
                        }
                    }).start();
                }
            });
        }
    
        public void printClientLog(final String data) {
            Log.d("MainActivity", data);
    
            handler.post(new Runnable() {
                @Override
                public void run() {
                    textView.append(data + "\n");
                }
            });
        }
    
        public void printServerLog(final String data) {
            Log.d("MainActivity", data);
    
            handler.post(new Runnable() {
                @Override
                public void run() {
                    textView2.append(data + "\n");
                }
            });
        }
    
        public void send(String data) {
            try {
                int portNumber = 5001;
                Socket sock = new Socket("localhost", portNumber);
                printClientLog("소켓 연결함");
    
                ObjectOutputStream outStream = new ObjectOutputStream(sock.getOutputStream());
                outStream.writeObject(data);
                outStream.flush();
                printClientLog("데이터 전송함");
    
                ObjectInputStream insTream = new ObjectInputStream(sock.getInputStream());
                printClientLog("서버로부터 받음 : " + insTream.readObject());
                sock.close();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    
        public void startServer() {
            try {
                int portNumber = 5001;
    
                ServerSocket server = new ServerSocket(portNumber);
                printServerLog("서버 시작함: " + portNumber);
    
                while (true) { // 클라이언트 접속 대기
                    Socket sock = server.accept(); //접속 요청 오면 accept 메서드를 통해 소켓 객체 반환
                    InetAddress clientHost = sock.getLocalAddress(); // 클라이언트 연결 정보 확인 가능
                    int clientPort = sock.getPort(); // 클라이언트 포트 번호 확인
                    printServerLog("클라이언트 연결됨: " + clientHost + " : " + clientPort);
    
                    ObjectInputStream instream = new ObjectInputStream(sock.getInputStream());
                    Object obj = instream.readObject(); // 문자열 받아와
                    printServerLog("데이터 받음: " + obj); //
    
                    ObjectOutputStream outstream = new ObjectOutputStream(sock.getOutputStream());
                    outstream.writeObject(obj + " from Server."); //from server 라는 문자열 붙여서 클라이언트로 다시 보내
                    outstream.flush();
                    printServerLog("데이터 보냄.");
    
                    sock.close();
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

     

     

     

     

    참고 : Do it! 안드로이드 앱 프로그래밍 

    반응형