728x90
https://blog.naver.com/rhrkdfus/221406909355
위 글을 참고하여 파이썬 server와 자바 client의 소켓 통신을 테스트 해보았고, 코드를 조금 수정하여 서로 문자열 데이터 전송이 가능하도록 하였다.
- python Server
import socket
host = '???.???.???.??' #host ip
port = 9999 #포트 번호 임의로 설정
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) #자바 client에서 값 받아오기
print(data.decode("utf-8"), len(data))
data2 = input("단어 입력: ")
#자바 client로 값 보내기
client_sock.send(len(data2).to_bytes(4, byteorder="big"))
client_sock.send(data2.encode(encoding='utf-8'))
client_sock.close()
server_sock.close()
자바 client에 문자열 데이터를 전송하는 부분에서 애를 먹었는데, 문자열의 길이를 먼저 보내주고 문자열을 전송해야 제대로 전송이 된다는 것을 알아내서 해결했다.
- Java Client
<MainActivity.java>
package com.example.tcptest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
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.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 word_edit; // ip 에디트
TextView show_text; // 서버에서온거 보여주는 에디트
// 소켓통신에 필요한것
private String html = "";
private Handler mHandler;
private Socket socket;
private DataOutputStream dos;
private DataInputStream dis;
private String ip = "192.168.0.5"; // IP 번호
private int port = 9999; // 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);
word_edit = (EditText)findViewById(R.id.word_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);
// 서버 접속
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에 받을꺼 넣어짐
String search_word = String.valueOf(word_edit.getText()); //검색할 단어 입력 받기
dos.writeUTF(search_word); //Python 서버로 문자열 보내기
} catch (IOException e) {
e.printStackTrace();
Log.w("버퍼", "버퍼생성 잘못됨");
}
Log.w("버퍼","버퍼생성 잘됨");
// Python 서버에서 받아옴
try {
String line = "";
//String line2 = "";
while(true) {
line = (String)dis.readUTF();
//line2 = (String)dis.readUTF();
Log.w("서버에서 받아온 값 ",""+line);
//Log.w("서버에서 받아온 값 ",""+line2);
}
}catch (Exception e){
}
}
};
// 소켓 접속 시도, 버퍼생성
checkUpdate.start();
}
}
<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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
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="Word :"
android:textSize="25dp"
tools:text="IP :" />
<EditText
android:id="@+id/word_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>
<AndroidMainfest.xml>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.tcptest">
<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/Theme.TCPtest">
<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>
</activity>
</application>
</manifest>
Java에서 Python으로 받아온 값 맨 앞에 이상한 쓰레기 값이 하나 붙는 것만 빼면 데이터 수신은 원활하게 동작한다. 그리고 이거랑 이전에 연관어 추천 코드랑 합쳐서 구현을 해보았다.
728x90
'Programming > Server' 카테고리의 다른 글
[Server] TCP/IP 소켓 통신 (0) | 2022.02.15 |
---|---|
[TCP/IP] 파이썬 Server - 자바 Client 통신 _ Error 기록 (0) | 2022.02.15 |
[Server] HTTP란? (0) | 2022.02.07 |
[Node.js] Axios란? (0) | 2021.03.06 |
[Node.js] 앱 프로그래밍 시작 (0) | 2021.02.15 |