Android下Socket简单通信+Python服务器

Android下的socket网络编写+Python服务器

这是第一次接触到android相关知识,也是第一篇原创文章,就写一个简单的,为什么要来写这个呢?起初都是用一些小字条记录一些感受一些重要的的语句,我平时的编程呢,遇到错误都是来网上找相关的资料,学习新的东西也是去网上看各位大佬的观点,受益匪浅吧。

话不多说,打个样

下面就是介绍一下这个文章要实现的功能吧。
1、编写一个编写一个活动页面,要求可以连接到一个tcp服务端,并通过UI编写要向对方发送的文本, 用户可用按钮控制内容的发送,服务端能成功显示明文。(要是要加密的话,就可以在此基础上自行添加加密方法)

简单介绍一下socket

Socket是一种网络通讯接口,通信两端通过它来发送和接收数据。
Socket的主要特点:使用简单且可移植。
Socket有两种传输模式:面向连接和无连接:
1、面向连接模式使用TCP协议,在通信两端建立通信链路,用数据流的方式发送和接收数据。
2、无连接模式使用UDP协议,用数据报文形式发送数据。
端口: 两种传输模式都会用到端口,是用来区分不同的连接的一个标识。

TCP(Transmission Control Protocol,传输控制协议)

是一种面向连接的、可靠的、基于字节流的运输层(Transport layer)通信协议。
这里就不多说tcp的信息了。
基于TCP的Socket通信步骤
1、TCP服务器端的步骤:
(1)、创建服务器socket:
ServerSocket(int port)
ServerSocket(int port,in backlog)
ServerSocket(int port,int backlog,InetAddress localAddr)
ServerSocket serversock= new ServerSocket(12345);//12345为端口号
//serversock调用accept()方法接收客户端请求,如果获取了请求,返回和该客户端通信的socket;
clientsock=serversock.accept();
//获取和客户端传输的输出流和输入流:
OutputStream ostream = sock.getOutputStream();
InputStream istream = sock.getInputStream();
//进行数据传输:
ostream.write…
Istream.read
(2)、TCP客户端的步骤:
//连接服务器:
Socket sock = new Socket(“192.168.1.3”,10001);
//获取和服务器传输的输出流和输入流:
InputStream istream = sock.getInputStream();
OutputStream ostream = sock.getOutputStream();
//进行数据传输:
ostream.write…
Istream.read

下面是实操代码

先去编写界面:

//这是activity_main.xml界面
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText
        android:id="@+id/ed1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="24dp"
        android:layout_marginTop="39dp"
        android:ems="10" >

        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/linkbt1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/ed1"
        android:layout_below="@+id/ed1"
        android:layout_marginTop="24dp"
        android:text="连接" />

    <Button
        android:id="@+id/linkbt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/linkbt1"
        android:layout_alignBottom="@+id/linkbt1"
        android:layout_alignRight="@+id/ed1"
        android:text="发送" />

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/linkbt1"
        android:layout_marginTop="86dp"
        android:layout_toRightOf="@+id/linkbt1"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</RelativeLayout>

界面图片:
在这里插入图片描述

这里书写MainActivity.java:
因为这个网络通信之间需要实时更新,就需要用到线程去更新UI界面

public class MainActivity extends Activity {
	Button linkbt1,sendbt1;
	EditText ed1;
	TextView tv1;
	Socket sock;
	OutputStream ostream;
	Handler thandler;
	Thread td;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //获取到界面组件
        ed1=(EditText)findViewById(R.id.ed1);
        tv1=(TextView)findViewById(R.id.tv1);
        linkbt1=(Button)findViewById(R.id.linkbt1);
        sendbt1=(Button)findViewById(R.id.linkbt2);
        //连接按钮监听,当连接时,给子线程一个消息:1
        linkbt1.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				thandler.sendEmptyMessage(1);
			}
		});
        //发送消息按钮
        sendbt1.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Message msg=new Message();
				//将标志信息设为2,让线程执行不同的功能
				msg.what=2;
				//获取到用户输入的信息
				msg.obj=ed1.getText().toString();
				thandler.sendMessage(msg);
			}
		});
        
        Runnable r=new Runnable() {
			@Override
			public void run() {
			//消息队列的准备
				Looper.prepare();
				thandler=new Handler(){
			@Override
			public void handleMessage(Message msg){
				if(msg.what == 1){
					try{
					//这里修改为自己的ip地址,设置端口号为12345
						sock=new Socket("10.0.0.0",12345);
						ostream=sock.getOutputStream();
						//2个线程进行嵌套
						runOnUiThread(new Runnable() {				
			@Override
				public void run() {
				//给用户一个连接成功的提示
				Toast.makeText(getApplicationContext(), "连接成功", Toast.LENGTH_SHORT).show();			
							}
						});
					}catch(Exception e){
						Log.i("info",e.toString());
					}
				}else if(msg.what == 2){
					try{
					//获取的消息以字节流的方式发给服务端
						ostream.write(( (String) msg.obj).getBytes());
						ostream.flush();
					}catch(Exception e){
						Log.i("info",e.getMessage());
					}
				}
			}
				};
				//loop,消息不停循环取
				Looper.loop();
			}
		};
        td=new Thread(r);
        td.start();//线程开启
    }
}

最后一步且必不可少的,往AndroidManifest.xml中添加网络服务:

<uses-permission android:name="android.permission.INTERNET" />

现在需要自己搭建一个Python环境,官网安装一个就好,出现下面的界面就ok了
在这里插入图片描述服务器的Python代码也很简单,获取本地主机,设置好端口就完成:

#coding=utf-8
import socket               # 导入 socket 模块
s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 12345                # 设置端口
s.bind((host, port))        # 绑定端口
chunks = [] 
s.listen(5)                 # 等待客户端连接
while True:
	con,addr=s.accept()
	print ('a client connected!',addr)
	while True:
		chunks = con.recv(1024)
		if len(chunks) == 0:
			break
		print (repr(chunks))
	con.close()

到此为止,整项目就简单完成了,现在来跑一下,看一下效果
sansui这样就成功了。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Appium是一个用于自动化移动应用程序的工具,它支持多种编程语言,包括Python。在使用Appium Python脚本连接手机之前,我们首先需要安装Appium服务器和Appium Python客户端库。 首先,我们需要确保已安装Appium服务器,并启动该服务器。然后,在Python环境中安装Appium Python客户端库。可以使用pip工具来安装Appium Python客户端库: ```python pip install Appium-Python-Client ``` 接下来,我们创建一个Python脚本来连接手机,并执行一些操作。在脚本中,我们需要指定设备的一些参数,如设备名称、平台版本、应用包名等。然后,我们可以使用Appium提供的API来进行手机操作,如启动应用、查找元素、模拟手势等。 一个简单的Appium Python脚本连接手机的例子如下: ```python from appium import webdriver desired_caps = { 'platformName': 'Android', 'platformVersion': '9.0', 'deviceName': 'emulator-5554', 'appPackage': 'com.example.myapp', 'appActivity': '.MainActivity' } driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps) # 执行一些操作 element = driver.find_element_by_id('com.example.myapp:id/button') element.click() # 关闭应用 driver.quit() ``` 以上代码示例中,我们使用了Appium提供的webdriver.Remote方法连接手机,并指定了设备参数。然后,我们找到了应用中的一个按钮元素,并点击了它。最后,我们使用quit方法关闭了应用。 通过编写Appium Python脚本,我们可以方便地连接手机,并实现自动化测试、应用操作等功能。同时,Appium提供了丰富的API和文档,可以帮助我们更好地进行移动应用自动化开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值