今天開始做的,由於是根據以前的一個小項目改的,不是從頭做的,所以沒法把所有代碼共用,就在這裡記錄一下每天的思路,希望能給需要的同學拋磚引玉。
思路其實就是上一篇部落格的內容,完善了一下代碼,實現了從android發送一句話給伺服器,然後伺服器把這句話再發回來。
能夠實現這樣的正常通訊,後面的工作應該不會太難。下面開始貼些主要的代碼。
首先是伺服器端,用了兩個類,一個MyServer,處理android發來的訊息;一個ServerThread,MyServer每接受到一個使用者請求,就開啟一個ServerThread去處理。
MyServer:
package server;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class MyServer {ServerSocket server = null;public MyServer() {this.startServer();}void startServer() {int i = 0;try {server = new ServerSocket(8888, 3);System.out.println("==========start===========");while (true) {Socket socket = server.accept();i++;System.out.println("第" + i + "個使用者串連成功!");new Thread(new ServerThread(socket)).start();}} catch (IOException e) {e.printStackTrace();}}}
連接埠號碼寫死的為8888。
ServerThread:
package server;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;public class ServerThread implements Runnable {private Socket socket;public ServerThread(Socket socket) {this.socket = socket;}// 任務是為一個使用者提供服務@Overridepublic void run() {try {try {// 讀取用戶端傳過來資訊的DataInputStreamDataInputStream in = new DataInputStream(socket.getInputStream());// 向用戶端發送資訊的DataOutputStreamDataOutputStream out = new DataOutputStream(socket.getOutputStream());while (true) {// 讀取來自用戶端的資訊String accpet = in.readUTF();System.out.println(accpet);out.writeUTF("伺服器:" + accpet);}} finally {// 建立串連失敗的話不會執行socket.close();socket.close();}} catch (IOException e) {e.printStackTrace();}}}
線程開始後一直接受用戶端發來的訊息,然後返回給用戶端。
以上是伺服器端的內容,能夠同時處理多個使用者的請求。
下面是android用戶端的代碼。
MainActivity:
package jason.smartdinner;import serverhelper.ClientHelper;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.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;public class MainActivity extends Activity {public static final String TAG = "MAINACTIVITY";void log(String msg) {Log.d(TAG, msg);}TextView output;EditText input;Button send;ClientHelper clientHelper;Handler handler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:Bundle b = msg.getData();String msg2 = b.getString("update");log(msg2);output.setText(msg2);break;default:break;}};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);new Thread() {public void run() {clientHelper = new ClientHelper();}}.start();output = (TextView) findViewById(R.id.output);input = (EditText) findViewById(R.id.input);send = (Button) findViewById(R.id.send);send.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubnew Thread() {@Overridepublic void run() {// TODO Auto-generated method stubsuper.run();String message = input.getText().toString();clientHelper.send(message);String receive = clientHelper.read();log(receive);Message update = new Message();update.what = 1;Bundle bundle = new Bundle();bundle.putString("update", receive);update.setData(bundle);handler.sendMessage(update);}}.start();}});}}
大家會注意到裡面我用了好幾個線程,這裡需要注意的是,android的網路連接請求不能再主線程裡,否則會報錯android.os.NetworkOnMainThreadException
所以每個涉及網路連接的都新開了線程去處理。其他就簡單了,處理下介面更新。
ClientHelper:
package serverhelper;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.IOException;import java.net.Socket;import android.util.Log;public class ClientHelper {public static final String TAG = "CLIENTHELPER";void log(String msg){Log.d(TAG, msg);}DataInputStream in;DataOutputStream out;Socket socket = null;public ClientHelper() {try {socket = new Socket("192.168.1.100", 8888);in = new DataInputStream(socket.getInputStream());out = new DataOutputStream(socket.getOutputStream());} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void send(String msg) {try {out.writeUTF(msg);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public String read() {String accept = "未接收到資訊";try {accept = in.readUTF();log(accept);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}return accept;}}
這個就是負責與伺服器互動的類,發送和接受資料兩個方法。其中socket的ip地址是我電腦的本地ip,上篇部落格裡有提到。
代碼就先不上傳了,基本上設計到的都在上面貼出來了,細心看看就明白了,完全可以自己搞出來。
作者:jason0539
微博:http://weibo.com/2553717707
部落格:http://blog.csdn.net/jason0539(轉載請說明出處)