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() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubthandler.sendEmptyMessage(1);}});        //发送消息按钮        sendbt1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubMessage msg=new Message();//将标志信息设为2,让线程执行不同的功能msg.what=2;//获取到用户输入的信息msg.obj=ed1.getText().toString();thandler.sendMessage(msg);}});                Runnable r=new Runnable() {@Overridepublic void run() {//消息队列的准备Looper.prepare();thandler=new Handler(){@Overridepublic void handleMessage(Message msg){if(msg.what == 1){try{//这里修改为自己的ip地址,设置端口号为12345sock=new Socket("10.0.0.0",12345);ostream=sock.getOutputStream();//2个线程进行嵌套runOnUiThread(new Runnable() {@Overridepublic 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-8import 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:breakprint (repr(chunks))con.close()

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

更多相关文章

  1. Android(Java)中的Object
  2. Andriod的Http请求获取Cookie信息并同步保存,使第二次不用登录也
  3. android 单例模式和策略模式的结合使用
  4. Android获取控件大小的方法
  5. 再论Handler—Handler事件分发、Handler线程切换原理解析
  6. 从原理上粗略认知Android线程池(ThreadPoolExecutor)
  7. Android(安卓)中的线程池
  8. android获取已安装应用的安装包
  9. Android获取设备唯一标识解决方案

随机推荐

  1. Android开发-搭建Junit测试环境
  2. Android引入项目作为依赖(module)
  3. ActivityManagerService分析
  4. Android中的菜单显示风格
  5. 转:windows xp为android 4.x安装MTP驱动
  6. Android otto 事件总线的使用(使用场景)
  7. Android: wifi设置默认AP列表
  8. Android 之 设置EditText最大可输入字符
  9. Android EditText TextWatcher 回调方法
  10. Android点击通知栏 ,移除通知