智能点餐系统开发纪实1—–java服务器搭建,android客户端实现通信

今天开始做的,由于是根据以前的一个小项目改的,不是从头做的,所以没法把所有代码共享,就在这里记录一下每天的思路,希望能给需要的同学抛砖引玉。思路其实就是上一篇博客的内容,完善了一下代码,实现了从android发送一句话给服务器,然后服务器把这句话再发回来。能够实现这样的正常通信,后面的工作应该不会太难。下面开始贴些主要的代码。首先是服务器端,用了两个类,一个MyServer,处理and

大家好,又见面了,我是全栈君。

今天开始做的,由于是根据以前的一个小项目改的,不是从头做的,所以没法把所有代码共享,就在这里记录一下每天的思路,希望能给需要的同学抛砖引玉。

思路其实就是上一篇博客的内容,完善了一下代码,实现了从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;
	}

	// 任务是为一个用户提供服务
	@Override
	public void run() {
		try {
			try {
				// 读取客户端传过来信息的DataInputStream
				DataInputStream in = new DataInputStream(
						socket.getInputStream());
				// 向客户端发送信息的DataOutputStream
				DataOutputStream 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;
			}
		};
	};

	@Override
	protected 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() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				new Thread() {
					@Override
					public void run() {
						// TODO Auto-generated method stub
						super.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 block
			e.printStackTrace();
		}
	}

	public void send(String msg) {
		try {
			out.writeUTF(msg);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public String read() {
		String accept = "未接收到信息";
		try {
			accept = in.readUTF();
			log(accept);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return accept;
	}
}

这个就是负责与服务器交互的类,发送和接受数据两个方法。其中socket的ip地址是我电脑的本地ip,上篇博客里有提到。

代码就先不上传了,基本上设计到的都在上面贴出来了,细心看看就明白了,完全可以自己搞出来。

 

作者:jason0539

微博:http://weibo.com/2553717707

博客:http://blog.csdn.net/jason0539(转载请说明出处)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/121368.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • gcc在Ubuntu上安装和使用「建议收藏」

    gcc在Ubuntu上安装和使用「建议收藏」安装使用命令sudoaptinstallbuild-essential,该命令将安装一堆新包,包括gcc,g++和make。要验证GCC编译器是否已成功安装,可以使用gcc-v命令打印GCC版本:使用gcc命令格式如下:gcc[选项][文件名字]主要选项如下:-c:只编译不链接为可执行文件,编译器将输入的.c文件编译为.o的目标文件。-o:<输出文件名>用来指定编译结束以后的输出文件名,如果不使用这个选项的话GCC默认编译出来的可执行文件名字为a

  • 三极管导通条件[通俗易懂]

    三极管导通条件[通俗易懂]1、对于NPN型三极管来说,其功能是用基极B极小的电流去引出集电极C巨大的电流,Ibe电流大小由Ib基极电流决定。2、三极管相当于两个二极管组成,所以只要PN结压差大于0.7V,有电流有就导通了3、NPN型:截止态:Ube<0.7V放大态:Ube>0.7V,Uc>Ub>Ue,集电极处于正向压差,基极处于反向压差PNP:截止态:Ueb<0.7V…

  • renren-fast 与 renren-fast-vue 与 renren-generator 基本操作[通俗易懂]

    renren-fast 与 renren-fast-vue 与 renren-generator 基本操作[通俗易懂]一、前言公司主打产品的,近来发现了一款快速完成前后端CRUD的框架renren-fast,打算用它来“刷”小型的外包,积攒资金。个人觉得,renren-fast主要面向后台开发者,使用方式和Guns类似:使用Guns自动生成SpringBoot+LayUI的后台管理系统①由于完整开发文档需要费用,②前端使用vue,有的后台开发者不清楚。笔者参考了…

  • java专业是什么专业,写的太详细了「建议收藏」

    java专业是什么专业,写的太详细了「建议收藏」前言SQL语句执行慢的原因是面试中经常会被问到的,对于服务端开发来说也是必须要关注的问题。在生产环境中,SQL执行慢是很严重的事件。那么如何定位慢SQL、慢的原因及如何防患于未然。接下来带着这些问题让我们开启本期之旅!第1章:Dubbo的简史、后续的规划和整体架构大图————Dubbo高性能RPC通信框架1.1应用架构演进过程1.2Dubbo简介1.3Dubbo总体大图第2章:Dubbo的环境配置和基于Dubbo开发第一款应用程序————开发第一款Dubbo应用程序

  • document.documentElement.clientHeight「建议收藏」

    document.documentElement.clientHeight「建议收藏」于获取各种浏览器可见窗口大小的一点点研究functiongetInfo(){vars=””;s=”网页可见区域宽:”document.body.clientWidth;s=”网页可见区域高:”document.body.clientHeight;s=”网页可见区域宽:”document.body.offsetWidth”(包括边线和滚

  • $.ajax()方法参数详解

    $.ajax()方法参数详解$.ajax()方法是jQuery最底层的Ajax实现。它的结构为:$.ajax(options)该方法只有一个参数,但是这个对象里包含了$.ajax()方法所需要的请求设置以及回调函数等信息,参

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号