반응형
안드로이드와 파이썬 서버간 소켓 통신을 공부하던중 string 을 전송하는 자료가 적어서 포스팅을 남깁니다.
- 실행 순서는 다음과 같습니다.
1. 안드로이드에서 '연결' 버튼입력
2. while 문을 통해 연결 요청을 기다리고있던 python 서버 동작
3. 2초마다 새로운 데이터 전송
4. 안드로이드에서 실시간으로 화면갱신
- 서버 코드 (Python)
import socket
import time
host = 'xxx.xxx.xxx.xx' # 호스트 ip를 적어주세요
port = 8080 # 포트번호를 임의로 설정해주세요
server_sock = socket.socket(socket.AF_INET)
server_sock.bind((host, port))
server_sock.listen(1)
print("기다리는 중..")
out_data = int(10)
while True: #안드로이드에서 연결 버튼 누를 때까지 기다림
client_sock, addr = server_sock.accept() # 연결 승인
if client_sock: #client_sock 가 null 값이 아니라면 (연결 승인 되었다면)
print('Connected by?!', addr) #연결주소 print
in_data = client_sock.recv(1024) #안드로이드에서 "refresh" 전송
print('rcv :', in_data.decode("utf-8"), len(in_data)) #전송 받은값 디코딩
while in_data : #2초마다 안드로이드에 값을 전달함 (추후 , STOP , Connect 옵션 설정 가능)
client_sock.send(str(out_data).encode("utf-8")) # int 값을 string 으로 인코딩해서 전송, byte 로 전송하면 복잡함
print('send :', out_data)
out_data = out_data+1 #전송값 +1
time.sleep(2)
client_sock.close()
server_sock.close()
해당 코드를 파이참에서 실행하면 다음과 같이 클라이언트 접속을 기다립니다.
- 클라이언트 (Android)
- Manifest 파일과 xml 파일은 생략 하겠습니다!!
MainActivity 코드
public class MainActivity extends AppCompatActivity {
Button send_button;
EditText send_editText;
TextView send_textView;
TextView read_textView;
private Socket client;
private DataOutputStream dataOutput;
private DataInputStream dataInput;
private static String SERVER_IP = "크킄킄 IP 넣는곳";
private static String CONNECT_MSG = "connect";
private static String STOP_MSG = "stop";
private static int BUF_SIZE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
send_button = findViewById(R.id.send_button);
send_editText = findViewById(R.id.send_editText);
send_textView = findViewById(R.id.send_textView);
read_textView = findViewById(R.id.read_textView);
send_button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Connect connect = new Connect();
connect.execute(CONNECT_MSG);
}
});
}
private class Connect extends AsyncTask< String , String,Void > {
private String output_message;
private String input_message;
@Override
protected Void doInBackground(String... strings) {
try {
client = new Socket(SERVER_IP, 8080);
dataOutput = new DataOutputStream(client.getOutputStream());
dataInput = new DataInputStream(client.getInputStream());
output_message = strings[0];
dataOutput.writeUTF(output_message);
} catch (UnknownHostException e) {
String str = e.getMessage().toString();
Log.w("discnt", str + " 1");
} catch (IOException e) {
String str = e.getMessage().toString();
Log.w("discnt", str + " 2");
}
while (true){
try {
byte[] buf = new byte[BUF_SIZE];
int read_Byte = dataInput.read(buf);
input_message = new String(buf, 0, read_Byte);
if (!input_message.equals(STOP_MSG)){
publishProgress(input_message);
}
else{
break;
}
Thread.sleep(2);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(String... params){
send_textView.setText(""); // Clear the chat box
send_textView.append("보낸 메세지: " + output_message );
read_textView.setText(""); // Clear the chat box
read_textView.append("받은 메세지: " + params[0]);
}
}
}
- 실행화면
2022.05.28
안녕하세요 블로그를 찾아주시는 방문자 여러분.
해당글은 당시 취업준비를 하면서 진행했던 토이프로젝트중 하나였는데, 아쉽게도 xml, manifest 기록을 찾지 못하였습니다.
현재 저는 취업을 하여 블로그를 자주 들리지 못하는데, 가끔씩 xml 파일 요청댓글이 달릴때마다 더 큰도움을 드리지 못해 죄송스러운 마음이 듭니다. ㅠㅠ
현재는 기록이 남아있지 않지만 비슷한주제로 진행하였던 프로젝트의 manifest file code 를 첨부하오니, 부족한 저의글을 찾아주시는 방문자분들에게 아주작은 보탬이 되었으면 좋겠습니다 : )
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.project_toilet">
<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" />
<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">
<service
android:name=".SocketIntentService"
android:exported="false">
</service>
<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity"></activity>
</application>
</manifest>
반응형
'개발 > Android & Kotiln' 카테고리의 다른 글
2. 안드로이드 레이아웃, 버튼 (버튼 이벤트로 사진 변경하기) (0) | 2021.12.16 |
---|---|
1. 안드로이드의 기본개념, 생명주기 (0) | 2021.12.14 |
[Android] Android studio Release 파일(APK) 업데이트 (0) | 2020.12.13 |
댓글