android多线程访问服务器数据

使用多线程的方式访问网络资源。其中服务器能够读取到客户端发送的数据,同时把接受到的数据返回给客户端(也就是android)。android这边能够进行数据的发送和接受接受后能够把数据展现在界面上。这里需要注意的是,采用了Handler Message的方式进行。下面是服务器代码:
package com.xueyoucto.xueyou;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;import java.nio.BufferUnderflowException;import java.nio.channels.SocketChannel;import java.util.ArrayList;import java.util.List;/** * Hello world! */class ServerThread implements Runnable {    private Socket s = null;    BufferedReader br = null;    OutputStream outputStream = null;    public ServerThread(Socket s) throws IOException {        this.s = s;        br = new BufferedReader(new InputStreamReader(s.getInputStream(), "utf-8"));        outputStream = s.getOutputStream();    }    public void run() {        String content = null;        while((content = readFromClient()) != null){            System.out.println("服务器收到内容:" + content);            try {                outputStream.write((content + "\r\n").getBytes("utf-8"));                System.out.println("服务器发送内容:" + content);            } catch (IOException e) {                e.printStackTrace();                App.socketList.remove(s);            }        }    }    public String readFromClient(){        try {            return br.readLine();        } catch (IOException e) {            e.printStackTrace();            App.socketList.remove(s);        }        return null;    }}public class App {    private static final int SERVER_PORT = 61000;    public static List socketList = new ArrayList();    public static void main(String[] args) throws IOException {        System.out.println("hello world");        ServerSocket serverSocket = new ServerSocket(SERVER_PORT);        while (true) {            Socket s = serverSocket.accept();            System.out.println("someone in...");            socketList.add(s);            new Thread(new ServerThread(s)).start();        }    }}

运行结果:

android代码:
<?xml version="1.0" encoding="utf-8"?>        

package com.example.wuxueyou.myfirstandroidapplication;import android.os.Handler;import android.os.Message;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import com.example.wuxueyou.Utils.ClientThread;public class MainActivity extends AppCompatActivity {    private final String TAG = "MainActivity";    private Button button;    private TextView textview;    private EditText editText;    private Button buttonSend;    private Handler handler;    private ClientThread clientThread;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        button = (Button) this.findViewById(R.id.button);        buttonSend = (Button) this.findViewById(R.id.button2);        textview = (TextView) this.findViewById(R.id.textView2);        editText = (EditText) this.findViewById(R.id.editText);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                System.out.println("--> this is sysout");                Log.i(TAG, "==>this is Log out");                Toast.makeText(MainActivity.this, "this is a Toast", Toast.LENGTH_SHORT).show();            }        });        handler = new Handler(){            @Override            public void handleMessage(Message msg) {                if(msg.what == 0x999){                    textview.append(msg.obj.toString().trim() + "\n");                }            }        };        clientThread = new ClientThread(handler);        new Thread(clientThread).start();        buttonSend.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Message msg = new Message();                msg.what = 0x123;                msg.obj = editText.getText().toString().trim();                clientThread.SendHandler.sendMessage(msg);                editText.setText("");            }        });    }}

package com.example.wuxueyou.Utils;import android.os.Handler;import android.os.Looper;import android.os.Message;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;/** * Created by wuxueyou on 16/9/12. */public class ClientThread implements Runnable{    public Handler SendHandler;    private OutputStream outputStream = null;    public  Handler recvHandler;    private BufferedReader br = null;    public ClientThread(Handler recvHandler) {        this.recvHandler = recvHandler;    }    public void run(){        try {            Socket s = new Socket("192.168.0.109",61000);            br = new BufferedReader(new InputStreamReader(s.getInputStream()));            outputStream = s.getOutputStream();        } catch (IOException e) {            e.printStackTrace();        }        new Thread(){            @Override            public void run() {                String content = null;                try {                    while((content = br.readLine())!= null){                        Message msg = new Message();                        msg.what = 0x999;                        msg.obj =content;                        recvHandler.sendMessage(msg);                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        }.start();        Looper.prepare();        SendHandler = new Handler(){            @Override            public void handleMessage(Message msg) {                if(msg.what == 0x123){                    try {                        outputStream.write((msg.obj.toString().trim() + "\r\n").getBytes("utf-8"));                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }        };        Looper.loop();    }}

运行结果:
此时服务器端的输出:

值得注意的是,在使用OutputStream的时候,一定要在字符串后面加上“\r\n”,否则发送之后,服务器端接收不到。

更多相关文章

  1. Android(安卓)P解决Socket通信Tcp粘包问题
  2. Service与Android系统设计(3)
  3. android ListView 中getview学习总结
  4. android 访问 OData
  5. 20172321 2017-2018-2 《程序设计与数据结构》第11周学习总结
  6. Android(安卓)通过NTP服务器自动获取时间的方法
  7. push研究――Apache Mina探索初步
  8. 【转】Android深入探究笔记之三 -- Intent (隐式意图和显示意图)
  9. Android(安卓)之使用ContentProvider(内容提供者)共享数据

随机推荐

  1. DataBinding(双向绑定)
  2. android listview 三种适配器设置
  3. android 使用广播监听网络状态
  4. 【Android】通过耳机调起语音助手App配置
  5. Android:ImageView 设置图片
  6. android 获得监听某一广播的所有程序
  7. Android手机中紧急号码的定制
  8. Android调用系统分享功能以及createChoos
  9. Android(安卓)Studio 简单功能介绍
  10. Android 动画1--View控件的显示和隐藏效