点击连接服务器后接收传来的数据,改变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}
端口已经腾出来了,开始运行服务端程序
接下来需要用一个简单的python客户端程序验证一下,连接成功的话再考虑搬到android上实现
client.py
import socket
s=socket.socket()
host='43.142.145.137'
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"/>
标签:socket,python,TCP,new,import,android,public,服务端
From: https://www.cnblogs.com/soaring27221/p/16974853.html