android多线程访问服务器数据
16lz
2021-01-24
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”,否则发送之后,服务器端接收不到。
更多相关文章
- Android(安卓)P解决Socket通信Tcp粘包问题
- Service与Android系统设计(3)
- android ListView 中getview学习总结
- android 访问 OData
- 20172321 2017-2018-2 《程序设计与数据结构》第11周学习总结
- Android(安卓)通过NTP服务器自动获取时间的方法
- push研究――Apache Mina探索初步
- 【转】Android深入探究笔记之三 -- Intent (隐式意图和显示意图)
- Android(安卓)之使用ContentProvider(内容提供者)共享数据