【问题标题】:How to send data through socket in javajava中如何通过socket发送数据
【发布时间】:2021-03-27 21:23:46
【问题描述】:

我正在制作一个简单的 android 应用程序来将字符串发送到服务器(在 python 中创建)。我正在使用单独线程中的套接字连接到服务器,如代码所示。我想在按钮点击时发送字符串。 这是java代码:

public class MainActivity extends AppCompatActivity {

private Socket socket;
Button btn;

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

    new Thread(new ClientThread()).start();

    btn = (Button) findViewById(R.id.button);
    if (socket != null){
        try {
            OutputStream output = socket.getOutputStream();
            PrintWriter writer = new PrintWriter(output, true);
            writer.println("1");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class ClientThread implements Runnable{
    @Override
    public void run() {
        try {
            socket = new Socket("192.168.0.12", 80);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这是我的 python 服务器

import socket

host = socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host, 80))

print("ip = ", host)

s.listen(1)
print("Listening")

while True:
    conn, addr = s.accept()
    print(addr, " connected to us")
    conn.sendall(bytes("Hello", "utf-8"))
    while True:
        try:
            data = bytes.decode(conn.recv(1024), "utf-8")
            print(data)
        except:
            break
    
    

这是服务器输出

ip =  192.168.0.12
Listening
('192.168.0.6', 45903)  connected to us

请给我发送数据到服务器的建议

【问题讨论】:

  • I am connecting to server using socket in separate thread 很好。但是,当您写入套接字时,也可以在线程中执行它,因为现在您有一个NetworkOnMainThreadException
  • 不,我想在单击按钮时发送消息,所以我不能在线程中执行此操作。
  • 你必须这样做。只需开始一个新线程。
  • 非常感谢,对我帮助很大。

标签: java python android android-studio sockets


【解决方案1】:
    Socket s = new Socket("address",port);
    OutputStream os = s.getOutputStream();
    //do write
    os.close();
    s.shutdownOutput();

下次要使用socket时,重新创建并连接。

s.shutdownOutput() 

当你调用这个方法时,它会向服务器写入数据;

【讨论】:

    【解决方案2】:

    经过大量研究,我找到了解决问题的方法。我在这里分享我的代码

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button);
        btn2 = (Button) findViewById(R.id.button2);
    
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new UPThread()).start();
            }
        });
    
        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Thread(new DOWNThread()).start();
            }
        });
    
    }
    private PrintWriter output;
    private BufferedReader input;
    class UPThread implements Runnable{
        @Override
        public void run() {
            try {
                socket = new Socket("192.168.43.235", 80);
                output = new PrintWriter(socket.getOutputStream());
                output.write("UP");
                output.flush();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    class DOWNThread implements Runnable{
        @Override
        public void run() {
            try{
                socket = new Socket("192.168.43.235", 80);
                output = new PrintWriter(socket.getOutputStream());
                output.write("DOWN");
                output.flush();
                socket.close();
            }catch (IOException e){
                e.printStackTrace();
            }
        }
    }
    

    我在按钮单击时运行线程,因此我可以轻松地向我的 IOT 项目发送简单的指令

    【讨论】:

    • After so much research ... ?研究?你被告知使用线程。
    猜你喜欢
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多