Programming/Server

[TCP/IP] 파이썬 Server - 자바 Client 통신 테스트

코딩뽀시래기 2022. 2. 28. 22:41
728x90

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

 

[Android] Python과 소켓(TCP/IP) 통신 하기 #1 - 서버에서 한번만 전송하기

* 서버의 ip를 적으면 Python으로 돌리고 있던 서버와 연결, 통신합니다. * 아래의 링크에서 안드로이드 ...

blog.naver.com

위 글을 참고하여 파이썬 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