python服务端与android客户端基于TCP协议的简单通信

效果:点击连接服务器后接收传来的数据,改变Textview的文字内容

在服务器端建立一个py文件server.py

import socket

host = '10.0.1.15'
'''上边这里填服务器的内网地址
我也不知道为啥填的不是公网地址
'''

print(socket.gethostname())
port = 30000
'''上边是放行的端口
记得别忘在服务器的安全规则中放行这个端口号
'''
web = socket.socket()
web.bind((host, port))
web.listen(5)
print("Server waiting for client...")
while True:
    conn, addr = web.accept()
    #data = conn.recv(1024)
    #print(data.decode())
    '''上边两行是服务器接收来自客户端的数据,
    暂时用不上先注释掉吧
    先让服务器只负责发信息,客户端收信息,更复杂的通信先搁一边
    '''
    conn.sendall("helloworld!!!".encode())
    conn.close

 然后运行这个服务端,等待接收客户端连接请求

这里先补充点东西,Linux查看端口占用进程lsof -i:{端口号}以及杀进程的操作

kill -9 {PID}
lsof -i:{端口号}

端口已经腾出来了,开始运行服务端程序

接下来需要用一个简单的python客户端程序验证一下,连接成功的话再考虑搬到android上实现

client.py

import socket
s=socket.socket()
host='43.123.123.123'
port=30000
s.connect((host,port))
'''send_data=input("请输入要发送的数据:")
s.send(send_data.encode())
接收对方发来的数据,最大1024字节
这一部分是向服务端发送信息的,先注释掉吧
'''
recvData=s.recv(1024).decode()
print("接收到的数据为:",recvData)
#关闭套接字
s.close()

运行结果

说明服务端运行还是正常的,下面在android上实现与服务端的tcp通信

MainActivity.java

 package com.example.databaseapp;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private Button btn_tcplinker;
    private TextView tv_helloworld;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn_tcplinker=findViewById(R.id.btn_tcplinker);
        tv_helloworld=findViewById(R.id.tv_helloworld);
        btn_tcplinker.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                /*
                涉及到网络连接的操作不能直接写操作,需要抛出一个新的进程,否则会报错
                需要这样写:
                new Thread(){
                    @Override
                    public void run(){
                        //{具体操作}
                    }
                }.start()
                 */
                new Thread(){
                    @Override
                    public void run(){

                            Tcphelper tcphelper=new Tcphelper();
                            String a=tcphelper.getHelloworld();
                            
                            MainActivity.this.runOnUiThread(new Runnable() {
                                public void run() {
                                    tv_helloworld.setText(a);
                                }
                            });
                            /*因为这是在一个新的进程中而不是MainActivity的进程,
                            所以不能直接对TextView的控件属性进行操作,应该这样写:
                                MainActivity.this.runOnUiThread(new Runnable() {
                                    public void run() {
                                        //{对控件的操作}
                                    }
                                });
                            * */
                    }
                }.start();
                
            }
        });

    }
}

 下面写一个帮助我们进行tcp连接的tcphelper类

Tcphelper.java

 package com.example.databaseapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Tcphelper {
    
    public String getHelloworld(){
        try{
            //建立连接到远程服务器的Socket
            Socket socket=new Socket("43.123.123.123",30000);
            //43.123...是服务器的公网ip,3000是服务器开放的那个端口
            
            //将Socket对应的输入流包装成BufferedReader
            BufferedReader br=new BufferedReader(
                    new InputStreamReader(socket.getInputStream())
            );//进行普通IO操作
            String line=br.readLine();
            br.close();
            socket.close();
            return line;
        }
        catch(IOException e){
            return ""+e;
        }
    }
}

最后要在AndroidManifest.xml文件里加上获取访问网络权限的配置信息

<uses-permission android:name="android.permission.INTERNET"/>
posted @ 2022-12-11 23:11  拾一贰叁  阅读(285)  评论(0编辑  收藏  举报