Socket

python 서버 android 클라이언트

섭섭입니다 2020. 2. 23. 03:21

https://blog.naver.com/rhrkdfus/221406909355

 

위의 블로그를 참고해 구현해 보았다.

 

간단하게 안드로이드에서 python서버에 접속해 데이터 값을 한번 받는 코드이다.

 

 

 

activity_main.xml

 

 

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout 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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="15px"
tools:context=".MainActivity">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:id="@+id/linearLayout">
<!--android:layout_centerInParent="true"-->


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="IP :"
android:textSize="25dp"
tools:text="IP :" />

<EditText
android:id="@+id/ip_edit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10" />
</LinearLayout>

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<Button
android:id="@+id/connect_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="CONNECT" />
</LinearLayout>

<TextView
android:id="@+id/show_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="25dp" />
</LinearLayout>

</RelativeLayout>

 

 

MainActivity.java

 

 

package com.example.androidpython;

import android.os.Handler;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.io.DataInputStream;
import java.io.DataOutputStream;

import java.io.IOException;
import java.net.Socket;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

Button connect_btn; // ip 받아오는 버튼

EditText ip_edit; // ip 에디트
TextView show_text; // 서버에서온거 보여주는 에디트
// 소켓통신에 필요한것
private String html = "";
private Handler mHandler;

private Socket socket;

private DataOutputStream dos;
private DataInputStream dis;

private String ip = "121.127.180.189"; // IP 번호
private int port = 8080; // port 번호

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

connect_btn = (Button)findViewById(R.id.connect_btn);
connect_btn.setOnClickListener(this);

ip_edit = (EditText)findViewById(R.id.ip_edit);
show_text = (TextView)findViewById(R.id.show_text);

}

@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.connect_btn: // ip 받아오는 버튼
connect();
}
}

// 로그인 정보 db에 넣어주고 연결시켜야 함.
void connect(){
mHandler = new Handler();
Log.w("connect","연결 하는중");
// 받아오는거
Thread checkUpdate = new Thread() {
public void run() {
// ip받기
String newip = String.valueOf(ip_edit.getText());

// 서버 접속
try {
socket = new Socket(newip, port);
Log.w("서버 접속됨", "서버 접속됨");
} catch (IOException e1) {
Log.w("서버접속못함", "서버접속못함");
e1.printStackTrace();
}

Log.w("edit 넘어가야 할 값 : ","안드로이드에서 서버로 연결요청");

try {
dos = new DataOutputStream(socket.getOutputStream()); // output에 보낼꺼 넣음
dis = new DataInputStream(socket.getInputStream()); // input에 받을꺼 넣어짐
dos.writeUTF("안드로이드에서 서버로 연결요청");

} catch (IOException e) {
e.printStackTrace();
Log.w("버퍼", "버퍼생성 잘못됨");
}
Log.w("버퍼","버퍼생성 잘됨");

// 서버에서 계속 받아옴 - 한번은 문자, 한번은 숫자를 읽음. 순서 맞춰줘야 함.
try {
String line = "";
int line2;
while(true) {
line = (String)dis.readUTF();
line2 = (int)dis.read();
Log.w("서버에서 받아온 값 ",""+line);
Log.w("서버에서 받아온 값 ",""+line2);
}
}catch (Exception e){

}
}
};
// 소켓 접속 시도, 버퍼생성
checkUpdate.start();
}
}


위의 블로그가 예전 안드로이드 버전이라 [ import android.support.v7.app.AppCompatActivity ]

이 부분에서 오류가 나는데 이 줄을 삭제하고 AppCompatActivity 부분의 오류에서

< Alt + Enter >를 이용해 새 버전에 맞는것을 import 해주면 된다고 한다.

 

 

 

AndroidManifest.xml   에 아래의 것들을 추가로 입력!

 

 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.READ_CONTACTS"/>

 ;

 

 

python 서버 만들기

 

 

# server.py : 연결해 1 보낼 수 있음. 
import socket 

host = '121.127.180.189'  # 호스트 ip를 적어주세요 
port = 8080            # 포트번호를 임의로 설정해주세요 

server_sock = socket.socket(socket.AF_INET) 
server_sock.bind((host, port)) 
server_sock.listen(1) 

print("기다리는 중") 
client_sock, addr = server_sock.accept() 

print('Connected by', addr) 
data = client_sock.recv(1024) 
print(data.decode("utf-8"), len(data)) 

data2 = int(input("보낼 값 : ")) 
#print(data2.encode()) 
client_sock.send(data) 
client_sock.send(data2.to_bytes(4, byteorder='little')) 

client_sock.close() 
server_sock.close()

 


그리고 port 번호도
정해주고! 빌드하면 아래와 같이 기다리는 중 이렇게 뜰 것이다.여기서 위 코드의 host ip는 http://www.findip.kr/ 여기 사이트에서 자신의 공인ip를 확인 할 수 있다. 

 

 

그 다음 자신의 휴대폰에 깔린 어플을 이용하여 위의 사이트에서 확인한 자신의 ip를 입력 해주면 

 

 

 

서버쪽 cmd 창에서는 이런식으로 뜬다. 보낼 값을 적어 보내주면

 

 

안드로이드 스튜디오 log에서는 보낸 값이 확인이 된다.

 

 

 

이런식으로 python 서버와 안드로이드 클라이언트 접속을 해보았다!

'Socket' 카테고리의 다른 글

C (win) - Android  (6) 2020.03.02
라즈베리파이 (python) - android  (0) 2020.02.24
라즈베리파이(리눅스) - win <C 언어>  (0) 2020.02.24
python 서버, python 클라이언트  (0) 2020.02.23
C server , C client 통신 기본예제  (0) 2020.02.23