안드로이드 에뮬레이터를 이용하여 소켓통신을 해보도록 하겠습니다.
서버는 php 로 작성되어 있고
클라이언트는 안드로이드로 접속해보겠습니다.
서버의 포트는 25003 포트를 이용하겠습니다.
server.php
<?php $host = "0.0.0.0"; $port = 25003; set_time_limit(0); // no timeout $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Could not create socket\n"); $result = socket_bind($socket, $host, $port) or die("Could not bind to socket\n"); $result = socket_listen($socket, 3) or die("Could not set up socket listener\n"); do { $spawn = socket_accept($socket) or die("Could not accept incoming connection\n"); do { $input = socket_read($spawn, 1024) or die("Could not read input\n"); $input = trim($input); echo "Client Message : " . $input . "\n"; //$response = 'received' . "\n"; $response = $input ."\n"; socket_write($spawn, $response, strlen($response)) or die("Could not write output\n"); if ($input == 'quit') { break; } if ($input == 'shutdown') { socket_close($spawn); break 2; } } while (true); } while (true); socket_close($socket);
클라이언트 안드로이드 입니다.

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application android:allowBackup="true" android:dataExtractionRules="@xml/data_extraction_rules" android:fullBackupContent="@xml/backup_rules" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/Theme.Socket_example" tools:targetApi="31"> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="android.app.lib_name" android:value="" /> </activity> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> </manifest>
uses-permission 추가해줍니다.
MainActivity.java
package com.example.socket_example; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.Socket; public class MainActivity extends AppCompatActivity { String str; String addr; String response; //서버 응답 Handler handler = new Handler(); // 토스트를 띄우기 위한 메인스레드 핸들러 객체 생성 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(getApplicationContext(), "Button Clicked", Toast.LENGTH_SHORT).show(); SocketThread thread = new SocketThread(); thread.start(); } }); } class SocketThread extends Thread { String host; String data; public SocketThread() { this.host = "220.72.212.247"; this.data = " 1Hello World~~~~"; } @Override public void run() { try{ int port = 25003; //포트 번호는 서버측과 똑같이 Socket socket = new Socket("220.72.212.247", port); // 소켓 열어주기 ObjectOutputStream outstream = new ObjectOutputStream(socket.getOutputStream()); //소켓의 출력 스트림 참조 outstream.writeObject(data); // 출력 스트림에 데이터 넣기 outstream.flush(); // 출력 ObjectInputStream instream = new ObjectInputStream(socket.getInputStream()); // 소켓의 입력 스트림 참조 response = (String) instream.readObject(); // 응답 가져오기 /* 토스트로 서버측 응답 결과 띄워줄 러너블 객체 생성하여 메인스레드 핸들러로 전달 */ handler.post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "서버 응답 : " + response, Toast.LENGTH_LONG).show(); } }); socket.close(); // 소켓 해제 }catch(Exception e){ e.printStackTrace(); } } } }
'프로그래밍 > Android' 카테고리의 다른 글
안드로이드 TCP Socket + Webview bridge 샘플 (0) | 2023.02.27 |
---|---|
[안드로이드] 웹뷰 + 카카오톡 적용 (0) | 2022.02.04 |
[android] net::ERR_UNKNOWN_URL_SCHEME (0) | 2022.02.04 |
안드로이드 원격 json 읽어 화면에 출력하기 (이미지 포함) (0) | 2021.10.22 |
안드로이드 Recyclerview + php json 사용시 오류 (0) | 2021.10.21 |