安卓Socket通讯简单示例

本文详细介绍了安卓Socket通信的基础知识,包括Socket的概念及其在网络通信中的作用。通过一个简单的服务端和客户端Demo,展示了如何在安卓应用中实现Socket通信。服务端在8989端口监听,接收客户端请求并响应,而客户端通过按钮触发请求,展示服务端返回的信息。

安卓Socket通信详解

1>Socket是什么:

     也叫做套接字”用于描述IP地址和端口,在网络上的主机一般运行多个软件,提供多种服务,每种服务都会打开一个Socket,并绑定到一个端口上,不同端口对应不同服务

       网络上的两个程序通过双向的通讯连接实现数据交换,,这个双向链路的一端称为一个SocketSocket通常用于实现客户端和服务端的连接,SocketTCP/IP协议的一个十分流行的网络编程,连接成功后,两端都会产生一个实例,操作这个实例,完成所需会话.

2>下面通过一个极其简单的Demo,演示最基本的Socket通信

【服务端代码:在指定端口8989监听客户端请求,一旦有请求,便执行操作,然后继续监听,使用accept()这个阻塞函数,该方法调用后一直等待客户端的请求,直到有请求且连接到同一个端口,accept()返回一个对应于客户端的Socket,本例中很简单,服务端不断监听,一旦有请求就输出一段信息】


安卓SocketDemo

首先是服务器端代码

3>打开eclipse新建一个java工程Main.java,这个就是服务器端的代码,


import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * Created by allan on 17-5-31.
 * QQ Num: 1750398075
 * CSDN Blog:  http://blog.csdn.net/allan_bst
 * Personal Website: http://mobiledream.top
 * Personal Sina E-mail: jsp0369@163.com
 */
//Socket 服务端
public class Main {
    private static final int PORT = 8989;
    public static void main(String[] args) {

        try {
            // 实例化服务器套接字 设置端口号8989
            ServerSocket server = new ServerSocket(PORT);
            while (true) {
                Socket socket = server.accept();
                // 获取输出流
                BufferedWriter writer = new BufferedWriter(
                        new OutputStreamWriter(socket.getOutputStream()));
                // 写字符串
                writer.write("这是一段来自服务器的问候:Hello World!");
                writer.flush();
                writer.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

 上面代码很简单,循环监听8989端口,使用accept()这个阻塞函数,该方法调用后一直等待客户端的请求,直到有请求且连接到同一个端口,accept()返回一个对应于客户端的Socket


4>下面是android客户端的相关内容,界面有一个按钮,点击后请求服务端的制定端口,然后显示服务端的内容

打开AndroidStudio,新建一个安卓工程

1)首先是MainActivity.java

点击按钮时,开启子线程,实例化Socket,传入ip和port

package com.example.allan.socketclient;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
/**
 * Created by allan on 17-5-31.
 * QQ Num: 1750398075
 * CSDN Blog:  http://blog.csdn.net/allan_bst
 * Personal Website: http://mobiledream.top
 * Personal Sina E-mail: jsp0369@163.com
 */
//Socket
public class MainActivity extends Activity {
    private TextView txt;
    private String line;
    private static final String HOST = "10.0.2.2";  //虚拟机的地址
    private static final int PORT = 8989;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        txt = (TextView) findViewById(R.id.text);
    }
    public void click(View view) {
        new Thread() {
            @Override
            public void run() {
                try {
                    // 实例化Socket
                    Socket socket = new Socket(HOST, PORT);
                    // 获得输入流
                    BufferedReader br = new BufferedReader(
                            new InputStreamReader(socket.getInputStream()));
                    line = br.readLine();
                    br.close();
                } catch (UnknownHostException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                // 执行完毕后给handler发送一个消息
                handler.sendEmptyMessage(0);
            }
        }.start();
    }

    // 定义Handler对象
    private Handler handler = new Handler() {
        @Override
        // 当有消息发送出来的时候就执行Handler的这个方法
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            // 处理UI
            txt.setText(line);
            Log.i("MSG", "收到消息----->" + line);
        }
    };
}

5>然后是activity_main.xml布局很简单,一个TextView 和一个 Button

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.allan.androidsockte.MainActivity">
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="30dp"
        android:textSize="20sp"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:onClick="click"
        android:id="@+id/btn_receive"
        android:layout_width="368dp"
        android:layout_height="wrap_content"
        android:text="接收消息"
        tools:layout_editor_absoluteY="0dp"
        tools:layout_editor_absoluteX="8dp" />
</LinearLayout>
 



接下来是图片演示,首先运行Server端代码,Main.java



然后启动客户端,即可


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值