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

标签: android  socket

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这样就成功了。

版权声明:本文为SanSuiBuSha原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/SanSuiBuSha/article/details/105575352

智能推荐

socket编程之客户--服务器通信程序学习

操作系统有五大功能,简单总结为: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。 网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –&g...

socket进行服务器和客户端通信

1、改成服务器的IP地址和打开的端口号 2、定义读写数据流 3、保持socket连接线程的运行start() 4、监听发送按钮,然后用mWrite写到服务器去 5、客户端运行的时候用mRead读服务器传送过来的数据,然后放到handler里更新ui 6、布局部分 7、服务器部分 参考这个的server代码 这部分都是通用的,只是ip地址换成自己电脑的,然后打开的端口号和客户端接入的要一致 8、运行...

windows下使用php socket 和 html5 websocket实现服务器和客户端之间通信

首先感谢打开这篇文章,但是运行时候有一点点错误,所以我把自己整理后的内容发布上来 下载代码github下载1,csdn下载2 之所以选择websocket,而不是使用ajax理由如下: 1、ajax轮询 ,ajax轮询 的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。 2、long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打...

新发的日常小实验——使用IETester测试不同IE版本的浏览器,测试网页JS的兼容性(console未定义兼容测试)

文章目录 一、痛点:IE兼容测试 二、关于IETester 三、IETester下载 四、写个html测试js的console接口 五、测试结果 六、js兼容处理 一、痛点:IE兼容测试 之前使用.Net的Winform桌面应用框架做了一个PC版的迷你浏览器(使用IE内核),方便拉起网页支付。 有用户反馈打开支付页面报了如下的错:“console”未定义 到底是多么老旧的I...

猜你喜欢

linux下搭建nginx及配置

文章目录 下载nginx 解压nginx资源包 准备编译环境 安装编译 查找安装路径并启动nginx 浏览器访问 下载nginx 下载地址:https://nginx.org/en/download.html 这里用的是nginx-1.16.1版本 解压nginx资源包 准备编译环境 安装编译 查找安装路径并启动nginx 浏览器访问 http://IP...

腾讯云+tipask快速搭建基于laravel的CMS网站

一、购买腾讯云服务器,服务市场->基础环境->选择WordPress平台镜像 二、按照tipask教程安装 tipask官方教程地址https://wenda.tipask.com/article/22 官方教程对新手不太友好,我整理如下: 1.ftp上传文件 云服务器镜像装载完毕后,浏览器访问服务器公网ip,点击获取权限后会下载服务器相关的文件 浏览器访问host url,根据所给的...

ElasticSearch入门教程

什么是ElasticSearch 基于Apache Lucene构建的开源搜索引擎 采用Java编写,提供简单易用的RESTFul API 轻松的横向扩展,可支持BP级的结构化和非结构化的数据处理 可应用场景 海量数据分析引擎 站内搜索引擎 数据仓库 一线公司实际应用场景 英国卫报 - 实时分析公众对文章的回应 维基百科、GitHub-站内实时搜索 百度 - 实时日志监控平台 安装 Windows...

小程序明明已经分包了,为啥没有大小没有变???

为什么要分包 真机预览时出现大于2M,无法预览。 对项目进行规整划分 如何分包 实际操作 先将需要分包的文件拷贝到小程序根目录下 在app.json中配置分包结构(如图) 修改被分包中的引用路径,如图片资源、导航URL 可以设置分包的在哪个页面加载 图中表示在进入login页面进行下载设置的分包,all表示在所有网络下。 失败解决!分包了为啥还是提示大小超过2M 分包的文件内所引用的外部文件也必须...

js pixi框架 极其详细到位(入门)-----转载

pixi是一个js 的轻量级的游戏类库框架,很适用于做H5的一些canvas动画特效。 这篇文章是关于pixi的入门教程 ,里面的讲解非常的到位细致,是我看到过的文章里讲解的算是最好的了。  去年快过年看的教程 ,今天再想看的时候发现没找到,不过经过不懈的搜索还是找到 ,那就赶紧给转过来吧。   pixi(入门) Pixi教程 基于官方教程翻译;水平有限,如有错误欢迎提PR,转...


http://www.vxiaotou.com