【Android】socket client发送一个字符串

为了尽量简单化,PC端使用调试工具做server,收到手机端发过来的数据效果如下
这里写图片描述

为了避免常识性错误,所以一般我先写权限,在AndroidManifest.xml中添加如下权限

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bm.printer0105">

    <!--允许应用程序改变网络状态-->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

    <!--允许应用程序改变WIFI连接状态-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <!--允许应用程序访问有关的网络信息-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <!--允许应用程序访问WIFI网卡的网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <!--允许应用程序完全使用网络-->
    <uses-permission android:name="android.permission.INTERNET"/>

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity">
            <intent-filter>
                <action
                    android:name="android.intent.action.MAIN" />

                <category
                    android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

MainActivity.java,相关解释应该都在注释里了,主要步骤就是
1、获取socket(连接),2、获取stream,3、整理要发送的string,4、发送
最麻烦的应该是第三个步骤,后期如果有业务逻辑需要的话大部分工作都是要花在处理字符串,这里就简单发送一个字符串

package com.bm.printer0105;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

    private Socket socket;
    private OutputStream outputStream;

    private String download;
    private byte[] download_head;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //开启一个线程用于执行耗时操作,这个是自己写的方法,方便辨认
        initThread();

    }

    private void initThread(){

        new Thread(new Runnable() {
            @Override
            public void run() {

                //该线程执行了获取套接字(已连接),获取输出流,制作字符串,发送四个方法
                initSocket("10.3.0.87",9100);//此处写服务端的IP和端口,可以在PC端上看自己的IP是多少,
                //如果用别的工具看不了IP,可以使用cmd,输入ipconfig查看
                initStream();
                initString();
                initSend();

            }
        }).start();
    }

    private void initSocket(final String host, final int port){

        //该方法用于获取套接字和执行连接操作,
        //只要服务端打开了一般都能连上,注意ip和端口正确即可
        // (还有,有的地方网络环境比较复杂,如果发送不成功,也可以试试用手机热点当AP,记得改IP)
        
        try {
            socket=new Socket(host,port);//这一步就已经连接上了,
            //与C的区别就是不用建立family,也不用指定连接选型,直接一步到位很方便
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("获取socket",e.toString());
        }

    }

    private void initStream(){
        try {
            outputStream=socket.getOutputStream();
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("获取流",e.toString());
        }

    }

    private void initString(){

        download = "TEST BM IT IoT";
        download_head = download.getBytes();//要转换成字节数组,也就是byte[],才允许发送
    }

    private void initSend(){
        try {
            outputStream.write(download_head);//发送方法就是调用输出流的write,此时数据将会发送到server端
        } catch (IOException e) {
            e.printStackTrace();
            Log.e("发送数据给服务端(输出流)",e.toString());
        }

    }

}

源码下载:
http://download.csdn.net/download/bfz_50/10196200
其实可以直接复制代码的

猜你喜欢

转载自blog.csdn.net/bfz_50/article/details/79012540