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

这样就成功了。

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...