智能点餐系统开发纪实1-----java服务器搭建,android客户端实现通信
16lz
2021-01-24
今天开始做的,由于是根据以前的一个小项目改的,不是从头做的,所以没法把所有代码共享,就在这里记录一下每天的思路,希望能给需要的同学抛砖引玉。
思路其实就是上一篇博客的内容,完善了一下代码,实现了从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(转载请说明出处)
更多相关文章
- Android之分享篇(配图适合新人):腾讯分享(QQ空间,好友,群)
- Android中View.setPressed是怎么出现按压效果的
- 浅析RxJava 1.x&2.x版本区别及原理(三):1.x 版本 Scheduler调度线程
- Android(安卓)进阶之了解源码——Activity启动
- Android中AsyncTask的简单用法及实现网络图片下载的实例
- 搭建Android应用程序的服务器
- 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
- flappy bird游戏源代码揭秘和下载后续---移植到android真机上
- Android(安卓)layout 优化:使用include和merge 标签