近期,老师有个项目是将普通的流水线改造升级为机器人生产线。
项目需求:将生产线上机器人产生的数据上传至云服务器,手机端或电脑端通过URL(资源定位符)访问云服务器上的数据,利用数据将整个流水线的生产情况展现出来。
第一步:编写Server的程序。目的是:建立与客户端的连接,接收客户端(即流水线上的机器人设备数据)发送的数据,然后将数据存储到MySQL数据库。
第二步:利用Servlet框架编写响应请求的服务端程序。目的是:当手机端或电脑端通过URL访问云服务器时,读取数据库数据,封装成JSON格式返回给请求。
第三步:通过编写安卓程序测试。
Server程序的编写:
import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class sever {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
ServerSocket server = new ServerSocket(9999); // 在9999端口上监听
boolean flag = true; // 循环标记
while (flag) { // 接收多个客户端请求
Socket client = server.accept(); // 客户端连接
new Thread(new EchoThread(client)).start(); // 创建并启动新线程
}
server.close();
}
}
class EchoThread implements Runnable { // 建立线程类
//公共常量
public static final String user = "root";
public static final String password = "hsl95116";
String data;
String result[] =null;
private Socket client; // 每个线程处理一个客户端
public EchoThread(Socket client) { // 创建线程对象时传递Socket
this.client = client;
}
@Override
public void run() {
try {
ConnectDatabse coonect_database=
new ConnectDatabse("student", user, password);//实例化连接数据库类
coonect_database.connectdatabase();
// 每个线程对象取得各自Socket的输入流与输出流
Scanner scan = new Scanner(client.getInputStream());
PrintStream out = new PrintStream(client.getOutputStream());
scan.useDelimiter("\n");
boolean flag = true; // 控制多次接收操作
while (flag) {
if (scan.hasNext()){ // 是否有内容
String recieveData = scan.next(); // 得到客户端发送的内容
Pattern pattern = Pattern.compile("start(.*?)end");//
匹配的模式
Matcher matchData = pattern.matcher(recieveData);
while(matchData.find()){
data=matchData.group(1);
break;
}
String regex = "\\s+";
try {
result =data.split(regex);
for (int x = 0; x < result.length; x++) {
coonect_database.addData("class",result[x++],result[x++],result[x]);
}
if (data.equalsIgnoreCase("close")) { // 程序结束
flag = false; // 退出循环
} else { // 应该回应输入信息
out.println("ECHO : " + data);
}
} catch (NullPointerException e) {
// TODO: handle exception
} catch (NumberFormatException e) {
// TODO: handle exception
}catch (Exception e) {
// TODO: handle exception
} finally {
out.println("ECHO : " + data);
}
}
}
scan.close();
out.close();
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
下面的程序是连接MySQL数据库操作。
import java.sql.DriverManager;
import java.sql.ResultSet;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;
public class ConnectDatabse {
private String databasename;
private String jdbcname;
private String user;
private String password;
private Connection connect;
public ConnectDatabse(String databasename,String user,String password){
this.databasename = "jdbc:mysql://localhost:3306/"+databasename
+"?useUnicode=true&characterEncoding=utf-8&useSSL=false";
this.user = user;
this.password = password;
}
public void connectdatabase(){
try{
//加载MYSQL JDBC驱动程序
Class.forName( "com.mysql.jdbc.Driver");
System.out.println("Success loading Mysql Driver!");}
catch (Exception e) {
System.out.print("Error loading Mysql Driver!");
e.printStackTrace();
}
/**
* 连接URL为 jdbc:mysql//服务器地址/数据库名 ,
* 后面的2个参数分别是登陆用户名和密码
*/
try {
connect = (Connection) DriverManager.getConnection(
this.databasename,user,password);
System.out.println("连接数据库成功");
}
catch (Exception e) {
System.out.print("连接数据库失败");
e.printStackTrace();
}
}
public void queryData(String tablename){
try {
Statement stmt = (Statement) connect.createStatement();
ResultSet rs = stmt.executeQuery("select * from "+tablename);//user
为你表的名称
while (rs.next()) {
System.out.println(rs.getString("MARRY_STATUS"));
}
}
catch (Exception e) {
System.out.print("get data error!");
e.printStackTrace();
}
}
public void addData(String tablename,String name,String address,String age)
throws Exception{
PreparedStatement Statement=(PreparedStatement)
connect.prepareStatement("INSERT INTO
"+tablename+"(name,address,age)"+" VALUES(?,?,?)");
int data3 = Integer.parseInt(age);
Statement.setString(1, name);
Statement.setString(2, address);
Statement.setInt(3, data3);
Statement.executeUpdate();
}
}
客户端的程序:
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class SocketClient {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Socket client = new Socket("localhost", 9999); // 服务器地址与端口
Scanner input = new Scanner(System.in); // 键盘输入数据
// 利用Scanner包装客户端输入数据(服务器端输出),PrintStream包装客户端输出数据;
Scanner scan = new Scanner(client.getInputStream());
PrintStream out = new PrintStream(client.getOutputStream());
input.useDelimiter("\n"); // 设置键盘输入分隔符
scan.useDelimiter("\n"); // 设置回应数据分隔符
boolean flag = true; // 循环标志
while (flag) {
System.out.print("请输入要发送数据:");
if (input.hasNext()) { // 键盘是否输入数据
String str = input.next().trim(); // 取得键盘输入数据
out.println(str); // 发送数据到服务器端
if (str.equalsIgnoreCase("byebye")) { // 结束标记
flag = false; // 结束循环
}
if (scan.hasNext()) { // 服务器端有回应
System.out.println(scan.next()); // 输出回应数据
}
}
}
input.close();
scan.close();
out.close();
client.close();
}
}
后续阿里云的部署待完成。
热门工具 换一换