>source

Python을 사용하여 작성한 서버에 명령을 보내는 코드를 만들었습니다. 코드는 한 번만 작동하지만 (서버가 처음에 보낸 것을 수신함) 두 번째에는 서버가 새로운 정보를 수신하지 않기 때문에 아무것도 전송되지 않는 것처럼 보입니다. 새로운 정보를 계속 기다리고 있습니다. 내 코드 :

   StringBuilder Data = new StringBuilder(); // The Data to send
    public void Send(View view) {
        Thread send = new Thread() {
            @Override
            public void run() {
                try {
                    Socket socket = new Socket("20.7.65.2", 6398); // Create connection to the server
                    OutputStream output = socket.getOutputStream(); // Get the key to output to server
                    PrintWriter writer = new PrintWriter(output, true);
                    writer.println(Data.toString()); // Send the data
                    Data.setLength(0); // Delete "Data" contant
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        };
        send.start();
    }
    public void Continue(View view) { 
        Data.append("Hello from client"); // Append to "Data"
        Send(null); // Run the send functionn (again)
    }
    }

내 Python 서버 :

import socket, time
soc = socket.socket()
soc.bind((socket.gethostname(), 6398))
soc.listen(5)
(client, (ipNum, portNum)) = soc.accept()
print("Client connected")
while True:
    message = client.recv(1024).decode()
    if(message != ""):
        print(message)
    time.sleep(0.1)

간단히 말해서, 나는 실행 기능을 두 번 실행하려고합니다. 처음에는 서버에 전송하고 정보를 수신하고, 두 번째에는 서버가 여전히 정보를 기다리고 있으며 내가 다시 보낸 것을 수신하지 않습니다. 모든 클라이언트가 보낸 모든 메시지를받을 수 없기 때문일 수 있습니다.

Java 코드를 보내는 대신 모든 클라이언트에서 작동하고 모든 메시지를 수신하는 Python 코드를 보내는 것도 가능합니다.

  • 답변 # 1

    코드에서 서버는 한 번만 연결을 수락 한 다음 동일한 클라이언트에서 수신합니다. 그러나 귀하의 질문에 따르면 귀하의 서버가 여러 클라이언트를 청취 할 수 있어야한다고 생각하므로 서버에서 멀티 스레딩을 사용할 수 있습니다. 클라이언트를 스레딩하는 대신 클릭하면 서버와 연결되는 버튼을 사용했습니다. 나는 또한 클라이언트 스레딩의 필요성을 이해할 수 없습니다. 대답에 약간의 변경이 필요하다고 생각하면 댓글을 달 수 있습니다.

    이것은 파이썬 서버입니다

    import socket, time
    import threading
    soc = socket.socket()
    # print(socket.)
    soc.bind(("192.168.1.5", 6398))
    soc.listen(5)
    def info(client):
        message = client.recv(1024).decode()
        if(message != ""):
            print(message)
        return
    while True:
        (client, (ipNum, portNum)) = soc.accept()
        print("Client connected")
        threading.Thread(target=info,args=(client,)).start()
    
    

    MainActivity.java

    package com.example.myapplication;
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import java.io.DataOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.PrintWriter;
    import java.net.Socket;
    import java.net.UnknownHostException;
    public class MainActivity extends AppCompatActivity {
        StringBuilder Data = new StringBuilder(); // The Data to send
        private Button btn;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn= findViewById(R.id.connectBtn);
            btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Continue();
                }
            });
        }
    
        public void Send() {
            Thread send = new Thread() {
                @Override
                public void run() {
                    try {
                        Socket socket = new Socket("192.168.1.5", 6398); // Create connection to the server
                        OutputStream output = socket.getOutputStream(); // Get the key to output to server
                        PrintWriter writer = new PrintWriter(output, true);
                        writer.println(Data.toString()); // Send the data
                        Data.setLength(0); // Delete "Data" contant
    
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            };
            send.start();
        }
        public void Continue() {
                Data.append("Hello from client"); // Append to "Data"
                Send(); // Run the send functionn (again)
        }
    }
    
    

    추가하는 것을 잊지 마세요 <uses-permission android:name="android.permission.INTERNET"/>AndroidManifest.xml.

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout 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"
        tools:context=".MainActivity">
        <Button
            android:id="@+id/connectBtn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    
    

  • 이전 python 3.x - Pandas 데이터 프레임에 계산 된 열을 추가하려면 어떻게해야합니까?
  • 다음 php - codeigniter 4 필터 - 응답으로 종료