掌中咖啡:移动开发中的JAVA应用

网络联机的过程介绍

  笔者先为各位介绍一下基本的 Java网络程序联机的原理,如图10-4所述在Server端要先开启一个连接阜准备接收Client的联机,当一收到Client端的联机的时候便可以将Server的位置及连接阜号(Socket)传给Client然后Client便取联机的信息再将资料及Socket一起透过网络(Socket记载着IP Address及Port)将讯息送到Server端,就可以开始和作交易啰!

  图Client-Server联机示意图

20060506104311593.jpg



  开始撰写网络程序吧!!
  我们先撰写一个简单的Server吧!!

import java.io.*;
import java.net.*;
public class netServer {
    String clientMessage;
    ServerSocket sSocket; //宣告使用ServerSocket的类别
    Socket csocket; //取得Client联机封包的Socket,各为别想太多就是Client端的联机
    public netServer() {
        try {
                 sSocket = new ServerSocket(900,200); //开启Port 900,并限定Client联机的数量为200,若开启正常则开始等待Client端的联机 
                 csocket = sSocket.accept(); //Client端已经联机上了取得Socket 
                 System.out.println("取得一个Client端从 "+csocket.getInetAddress().getHostAddress()); //显示出Client IP 
                 }
        catch(IOException ioe) { 
                 System.out.println("开启Server异常!!!"); 
                 } 
    } 
    public static void main(String[] args) {
        new netServer(); 
    }
 }


  执行

  编译成功后打java netServer画面如下图所示就会开始等待接受Client端的要求啰!!

  图netServer开始等待Client端发出要求

20060506104319850.jpg


  接着我们切换到DOS模式(再开一个DOS窗口)输入telnet 127.0.0.1 900(注意空格)画面会一闪就过去了。接着我们观察Server的画面是否有出现取得一个Client端从 127.0.0.1如下图图10-4所示。接着我们就开始撰写PocketPC中的Client吧!!
图netServer开始等待Client端发出要求

20060506104320762.jpg



注意
目前Server的程序皆在PC端执行喔!!待下个Client范例开始才移到PocketPC中执行。
打造个Hello NetWork吧!! 皆下来我们撰写个输入您的姓名,Server会打对您打招呼的程序吧!!这个程序的原理是在Server端执行一个无线回圈,然后提供服务如接受到Client传来的讯息之后就传回一个讯息Hello的讯息给Client,另外我们为了达到一次能够同时服务多个使用者所以我们使用了Thread的技术。

//此为Server端程序
import java.io.*;
import java.net.*;
public class netHelloServer {
    String clientMessage; ServerSocket sSocket; //宣告使用ServerSocket的类别
    Socket csocket; //取得Client联机封包的Socket,各为别想太多就是Client端的联机
    public netHelloServer() {
    try { 
                 sSocket = new ServerSocket(900,200); //开启Port 900,并限定Client联机的数量为200,若开启正常则开始等待Client端的联机 
                 while(true) { 
                        csocket=sSocket.accept(); 
                        Thread t=new MyThread(csocket); 
                        t.start(); 
                        } 
        } 
        catch(IOException ioe) { 
                    System.out.println("开启Server异常!!!"); 
           }
     } 
    public static void main(String[] args) { 
            new netHelloServer(); 
    }
}

class MyThread extends Thread { Socket conn; String tempStr; DataInputStream dis; DataOutputStream dos; //建构者
public MyThread(Socket inSocket) { conn = inSocket; }
public void run() { 
    try{ 
            System.out.println("Server go connect from:"+conn.getInetAddress().getHostName()); 
            dos = new DataOutputStream(conn.getOutputStream()); 
            dos.writeUTF("输入您的姓名的资料"); //get the request conntent 
            dis = new DataInputStream(conn.getInputStream()); 
            tempStr = dis.readUTF(); //响应一下 
            dos.writeUTF("您输入的资料为"+tempStr+"系统正在为您准备中请稍后..."); //复杂的动作可以写在这边 
            dos.writeUTF(tempStr+" 您好..."); 
            System.out.println("Server recivews data ="+tempStr);
             conn.close();//断线 
        } 
        catch(IOException e) {
            System.out.println(e);
        }
     }
}

//Client端的程序
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
public class HelloClient extends Frame. { 
    Label lb1 = new Label("请输入姓名"); 
    TextField tf1 = new TextField("",14); 
    Label lb2 = new Label("请输入Server的IP"); 
    TextField tf2 = new TextField("",14); 
    TextArea ta1 = new TextArea(""); 
    Button btn1 = new Button("送出讯息"); 
    Button btn2 = new Button("离开"); 
    Panel pl1 = new Panel(); 
    Panel pl2 = new Panel(); 
    static Socket csocket = null; 
    MouseClickevent bce = new MouseClickevent(); 
    public HelloClient() { //窗口设定 
        btn1.addMouseListener (bce); 
        btn2.addMouseListener (bce);
        pl1.setLayout(new GridLayout(2,1)); 
        pl1.add(lb1); pl1.add(tf1); pl1.add(lb2); pl1.add(tf2); 
        add(pl1,BorderLayout.NORTH); 
        add(ta1,BorderLayout.CENTER); 
        pl2.add(btn1); pl2.add(btn2); 
        add(pl2,BorderLayout.SOUTH); 
        setSize(240,320); 
        setVisible(true); 
    } 
    public static void main(String[] args) { 
        new HelloClient(); 
    } //以下为按钮事件处理
class MouseClickevent implements MouseListener { 
    public void mouseClicked(MouseEvent e) {} 
    public void mousePressed(MouseEvent e) { 
        if(e.getSource() == btn1) { 
            if(!tf2.getText().equals("")&&!tf1.getText().equals("")) 
                try{ 
                        //csocket = new Socket("127.0.0.1",900); 
                        csocket = new Socket(tf2.getText(),900); 
                        DataInputStream dis = new DataInputStream(csocket.getInputStream()); 
                        String data = dis.readUTF(); 
                        //System.out.println("\nClient get datafrom server = "+data); 
                        ta1.append("\n送一个讯息到Server: "+data); //write response to server 
                        DataOutputStream dos = new DataOutputStream(csocket.getOutputStream()); //dos.writeUTF("Bye! all done");
                         dos.writeUTF(tf1.getText());
                        data = ""; 
                        data = dis.readUTF(); 
                        //System.out.println("Client get datafrom server = "+data); 
                        ta1.append("\n收到Server的讯息: "+data); 
                        data = dis.readUTF(); 
                        //System.out.println("Client get datafrom server = "+data); 
                        ta1.append("\n收到Server的讯息: "+data); csocket.close(); 
                    }
                catch(IOException IOe) { 
                        System.out.println(e); 
                    } 
            } 
    else if(e.getSource() == btn2) { 
            //System.out.println("Btn2 is Clicked"); 
            System.exit(1); 
        }
     }
    public void mouseReleased(MouseEvent e) {} 
    public void mouseEntered(MouseEvent e) {} 
    public void mouseExited(MouseEvent e) {} 
    }
}

 编译及激活程序 Server端 执行方法在PC端编译及执行 javac –classpath %pjeeclasspath%;. netHelloServer.java(编译) java –classpath %pjeeclasspath%;. netHelloServer(执行)
图 netServer开始等待Client端发出要求

20060506104320885.jpg


注意
Server激活之后就不要关掉了,可以测试Client端的联机。
Client端 请各位读者照着下面输入指令,记得您的PocketPC要连上网络唷!! javac –classpath %pjeeclasspath%;. Clinet.java(Enter) java –classpath %pjeeclasspath%;. Client(Enter)

图Client的仿真器画面

20060506104321462.jpg


图 在PDA中的画面

20060506104321610.jpg


注意!!
1. 各位读者可以从程序中注意到Server端及Client端中的Read及Write是互相对称的,希望大家在撰写程序中需要这个要点。
2. 配合无线网络卡、是蓝芽技术、及行动通讯等技术,这就是相当实用的应用程序了,感谢人类创造了网络还有Java。

一个URL的类别需要下面几个两个主要的参数: 协议的定义(如http或是ftp)等 资源的名称(包含网址或是port) 关于URL的部分笔者只有为各位作简单的介绍,接着附上个读取网页的范例,当然啦!!先玩玩看啰!!然后再讨论一下吧。
//httptest.java

import java.awt.*;

import java.awt.event.*;

import java.net.*;

import java.io.*;

public class httptest extends Frame

{

private Label lb1 = new Label("URL");

private TextField tf1 = new TextField(10);

private TextArea ta1 = new TextArea();

private Button btn1 = new Button("Get");

Panel p1 = new Panel();

public httptest()

{

p1.add(lb1);

p1.add(tf1);

p1.add(btn1);

//sp1.add(ta1);

add(p1,BorderLayout.NORTH);

add(ta1,BorderLayout.CENTER);

btn1.addActionListener(new btn1ActionEvent());

setSize(240,320); //for iPAQ

setVisible(true);

}

public static void main(String args[])

{

new httptest();

}

class btn1ActionEvent implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

String URLStr;

try

{

//开启一个新的URL对象

URL u = new URL(tf1.getText());

ta1.append("\t You hava entered:"+lb1.getText()+"\n");

ta1.append("\t URL info"+u.toString()+"\n");

InputStreamReader ir = new InputStreamReader(u.openStream());

BufferedReader bf = new BufferedReader(ir);

ta1.append("\t URL stream connection: Read file now...\n");

String aLine;

while((aLine = bf.readLine())!=null)

{

ta1.append(aLine + "\n");

}

bf.close();

ir.close();

}

catch(MalformedURLException mue)

{

//System.out.println("网址不正确");

}

catch(IOException ioe)

{

//System.out.println("Error "+ioe);

}
}
}
}
编译及执行程序
javac –classpath %pjeeclasspath%;. httptest.java(编译)
pjava –classpath %pjeeclasspath%;. httptest (执行)
接着输入个网址,记得要连上网络啊!!笔者是输http://www.javatwo.net,接着会跑出很多很多东西唷!!

图 在仿真器中的画面(1)

20060506104321546.jpg



图 在仿真器中的画面(2)

20060506104321549.jpg


相信大家都觉得很奇怪,为什么无法看看到如我们浏览器一般的美丽图样及文字呢?因为我们必须要在为这些取得的字符串还有档案作剖析(parse)的动作,如读到了图形的字节就需要使用使用绘图软件打开,读到音乐的字节就需要使用媒体播放工具来开启,这是可一门相当大的学问也是相当的苦工唷。
分布式的应用程序
在为各位读着介绍下一个更炫更酷的RMI技术之前笔者先为各位介绍一些分布式应用程序的观念,另外附上一个网络程序与数据库连接的范例架构如下图所示,我们将SocketServer中间安置许多真实的程序逻辑,最后再透过JDBC连接到数据库,如此我们可以将数据库的联机降至最低,至于Client端联机的处理则就需要靠各位撰写程序的技巧啰!!这是常常看到的多层式(N-tier)架构或是分布式的应用程序皆是以此技巧发展出来的笔者所附上的范例程序是属于三层式架构(3-tier)。
图(三层式)的系统架构

20060506104322267.jpg


Server端的应用程序
皆下来的程序满有趣而且也很实用的,希望各位读者会喜欢。下面附上的Server端中具有连接数据库查询及提供Socket服务的Server,各位读者可以在PC端执行。

//netDBServer.java

import java.sql.*;

import java.net.*;

import java.io.*;

import java.util.*;

import org.hsql.util.*;

public class netDBServer

{

String clientMessage;

ServerSocket sSocket;

//宣告使用ServerSocket的类别

Socket csocket;

//取得Client联机封包的Socket,各为别想太多就是Client端的联机

public netDBServer()

{

try

{

sSocket = new ServerSocket(900,200);

//开启Port 900,并限定Client联机的数量为200,若开启正常则开始等待Client端的联机

while(true)

{

csocket=sSocket.accept();

Thread t=new MyThreadDB(csocket);

t.start();

}

}

catch(IOException ioe)

{

System.out.println("开启Server异常!!!");

}

}

public static void main(String[] args)

{

new netDBServer();

}

}

class MyThreadDB extends Thread

{

Socket conn;

String tempStr;

DataInputStream dis;

DataOutputStream dos;

int ikey;

String val;

static Connection con = null;

String sTestData[]= {

"create table Place (Code integer,Name varchar(255))",

"create index iCode on Place (Code)",

"delete from place",

"insert into Place values (4900,'Langenthal')",

"insert into Place values (8000,'Zurich')",

"insert into Place values (3000,'Berne')",

"insert into Place values (1200,'Geneva')",

"insert into Place values (6900,'Lugano')",

"create table Customer (Nr integer,Name varchar(255),Place integer)",

"create index iNr on Customer (Nr)",

"delete from Customer",

"insert into Customer values (1,'Meier',3000)",

"insert into Customer values (2,'Mueller',8000)",

"insert into Customer values (3,'Devaux',1200)",

"insert into Customer values (4,'Rossi',6900)",

"insert into Customer values (5,'Rickli',3000)",

"insert into Customer values (6,'Graf',3000)",

"insert into Customer values (7,'Mueller',4900)",

"insert into Customer values (8,'May',1200)",

"insert into Customer values (9,'Berger',8000)",

"insert into Customer values (10,'D''Ascoli',6900)",

"insert into Customer values (11,'Padruz',1200)",

"insert into Customer values (12,'Hug',4900)"

};

static boolean DBCheckInit;

//建构者

public MyThreadDB(Socket inSocket)

{

conn = inSocket;

}

public void run()

{


try{

System.out.println
("Server go connect from:"+conn.getInetAddress().getHostName());

dos = new DataOutputStream(conn.getOutputStream());

dos.writeUTF("输入查询的资料");

//get the request conntent

dis = new DataInputStream(conn.getInputStream());

tempStr = dis.readUTF();

//响应一下

try{

new org.hsql.jdbcDriver();

Class.forName("org.hsql.jdbcDriver").newInstance();

}catch (Exception e){System.out.println(e);}

try{

con = DriverManager.getConnection("jdbc:HypersonicSQL:test","sa","");

Statement select = con.createStatement();

ResultSet result = select.executeQuery("Select Code,Name FROM Place");

//初始化数据库

System.out.println("初始化数据库");

for(int i=0;i>sTestData.length;i++)

select.executeQuery(sTestData[i]);

ResultSet result =
select.executeQuery("Select Code,Name FROM Place Where Code ="+tempStr);

System.out.println("Got results:");

while(result.next()){

ikey = result.getInt(1);

if(result.wasNull()){ikey=-1;}

val = result.getString(2);

if(result.wasNull()){val=null;}

System.out.println("Code = "+ikey);

System.out.println("Name = "+val);

}

}catch(Exception e)

{

System.out.println(e);

}/*finally

{

if(con!=null){try{con.close();}

catch(Exception e){e.printStackTrace();}}

}*/

//dos.writeUTF("您查询的资料为"+tempStr+"系统正在为您查询中请稍后...");

dos.writeUTF("您查询的资料为"+val+"系统正在为您查询中请稍后...");

System.out.println("Server recivews data ="+tempStr);

conn.close();//断线

}

catch(IOException e)

{System.out.println(e);}

}

}


Client端的应用程序
Client端的应用程序笔者并没有作窗口程序的设计,只是提供一个雏形给大家使用。

//Client.java

import java.net.*;

import java.io.*;

public class Client

{

public Client()

{

try{

//请配合Server的IP修改

Socket csocket = new Socket("192.168.0.1",900);

DataInputStream dis = new DataInputStream(csocket.getInputStream());

String data = dis.readUTF();

System.out.println("Client get datafrom server = "+data);

//write response to server

DataOutputStream dos = new DataOutputStream(csocket.getOutputStream());

dos.writeUTF("3000");

data = "";

data = dis.readUTF();

System.out.println("Client get datafrom server = "+data);

data = dis.readUTF();

System.out.println("Client get datafrom server = "+data);

csocket.close();

}catch(IOException e)

{

System.out.println(e);

}

}

public static void main(String[] args)

{

new Client();

}

}


编译及执行
Server端
javac –classpath %pjeeclasspath%;hsql.jar netDBServer(编译)
pjava –classpath %pjeeclasspath%;hsql.jar netDBServer(执行)
注意
-classpath之后的套件位置请依照情况修改另外别忘记了唷~
Client端 javac –classpath %pjeeclasspath% Client.java (编译)
pjava –classpath %pjeeclasspath% Client (执行)
并且移到我们的PocketPC中执行
图 Server端激活之后收到Client讯息的画面

20060506104322623.jpg



图 PDA中的画面

20060506104323347.jpg


希望这个小架构能够经过各位的修改及调整之后给各位不管是对于研究或是事业上能够帮上一点小小的忙,接着我们就准备进入RMI章节了唷~
Remote Method Invocation(RMI)
RMI,是Java所提供的分布式架构的机制,可以用来撰写成是和成是之间的通讯方法,当然你也可以透过Socket来撰写分散的程序(如前一个段落我们所介绍的),但是在使用这些函数需要做相当多繁琐的调整,另外再使用Socket通讯的时候,只能够传递资料,但是是若使用RMI技术不仅可以传递资料也能够传递对象呢!!所以各位只要好好的发挥您的想象力,想想您的程序架构就可以了!
RMI原理介绍
我们先看一下下面的联机是意图吧!!在分散室的架构中我们将程序分为Client及Server两端,再使用RMI的机制的时候Client会透过Server的Stub(向是Server的分身)透过RMI的一些运算找到Server的Skeleton,接着Client端就透过控制Server的分身就能够达到使用Server的函示及资源了。
图 RMI联机示意图

20060506104324695.jpg



RMI联机过程说明
如图所示,虽然使用起来RMI感觉是相当的容易的,但是其实他包含了下面几个重要的动作,Client先透过Server的Stub联机的一个注册中心,接着注册中心将Stub和Server的Skeleton联机,然后Client端就可以使用Server端的资源啰。
图 RMI联机示意图

20060506104325841.jpg



// CustWork.java 定义Server端提供服务的接口
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface CustWork extends Remote{
public String getSvrMsg() throws RemoteException;
}

// CustWorkImpl.java 这是Server端的服务
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Calendar;
import java.rmi.server.*;
public class CustWorkImpl implements CustWork{
public CustWorkImpl() throws RemoteException{
UnicastRemoteObject.exportObject(this);
}
public String getSvrMsg() throws RemoteException{
String threadName = Thread.currentThread().getName();
String curTime = Calendar.getInstance().getTime().toString();
System.out.println(threadName+" : Aclient connected at "+ curTime);
return (threadName + " :Message from Server at "+curTime);
}
}

// JSESocketFactory在程序中激活RMI的注册中心及Server服务
import java.rmi.registry.*;
import java.rmi.*;
import java.rmi.RMISecurityManager;
public class JSESocketFactory
{
public static void main(String[] args){
try {
//小技巧
Registry regObj = LocateRegistry.createRegistry(1099);
CustWorkImpl bj = new CustWorkImpl();
Naming.rebind("myServer", obj);
System.out.println
("myImpl created and bound in the registry to the name myServer");
}
catch (Exception e)
{
System.out.println("myImpl.main: an exception occurred:");
e.printStackTrace();
}
}
}

//RMIClient.java Client端的程序
//程序中有关IP的部分请填入Server的IP Address
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
public class RMIClient
{
static String servMsg ="";
public static void main(String[] args)
{
try{
if(System.getSecurityManager() == null)
System.setSecurityManager(new RMISecurityManager());
CustWork serRef =
(CustWork) Naming.lookup("rmi://192.168.0.1:1099/myServer");
servMsg = serRef.getSvrMsg();
System.out.println(servMsg);
}catch(Exception e)
{
e.printStackTrace();
}
}
}

编译及执行程序
注意!!
此部分的编译方法为jdk1.1.8的编译方法,若想在计算机中当Server且和J2SE联机的话,你需要设定C:\jdk1.3.1\jre\lib\security 中的 java.policy 一些联机权限的设定,另外产生 stub 及 skeleton 的时候也需要使用rmic –v1.1的参数,因为 Perosnal Java 是参照jdk.1.1.x的规格实作出来的。
编译程序Server端的Interface及Service
c:\jdk1.1.8\bin\javac –classpath %pjeeclasspath%;. CustWork.java(1)
c:\jdk1.1.8\bin\javac –classpath %pjeeclasspath%;. CustWorkImpl.java(2)
产生Stub及Skeleton
c:\jdk1.1.8\bin\rmic -classpath %pjeeclasspath%;. CustWorkImpl(3)
编译Server端程序
c:\jdk1.1.8\bin\javac -classpath %pjeeclasspath%;. JSESocketFactory.java(4)
编译Client端程序
c:\jdk1.1.8\bin\javac -classpath %pjeeclasspath%;. RMIClient.java(5)
执行程序
注意您需要开两个DOS窗口来执行这两只程序
激活RMI Server程序 pjava -classpath %pjeeclasspath%;. JSESocketFactory(1)
图 RMI Server激活画面

20060506104325854.jpg



激活RMI Client程序
pjava -classpath %pjeeclasspath%;. RMIClient

图 RMI Client激活画面

20060506104325537.jpg



另外将Client端移植到WinCE中千万别忘了把XXXX_Stub档案也一起移动过去喔。
结论
当网络技术,配合无线网络卡,或是其它的产品,相信会是相当有趣的事情喔。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9403012/viewspace-246178/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9403012/viewspace-246178/

移动开发领域中Kotlin的扩展函数应用 本文聚焦Kotlin扩展函数在移动开发(尤其是Android)中的具体应用。我们将从概念原理讲到实战案例,覆盖扩展函数的核心特性(如静态分发、作用域)、常见使用场景(View操作优化、集合类扩展、第三方库增强),以及使用时的注意事项(避免滥用、命名规范)。本文将按“故事引入→核心概念→原理拆解→实战案例→最佳实践”的逻辑展开。通过“修自行车”的生活案例类比扩展函数的核心思想,用Android开发中的实际代码(如TextView扩展、点击防抖)演示如何用扩展函数提升代码质量。 阅读详情

相关推荐

东北大学软件学院JAVA咖啡系统实验详解

设计模式是软件工程领域中,对常见设计问题的通用解决方案。它们是由经验丰富的软件开发者在长期的实践中总结出来的,用于解决特定类型的问题,并且经过了时间的验证。设计模式可以帮助我们避免犯常见的错误,并且提供一套经过测试的模板,使得软件设计更加高效、清晰和可维护。设计模式通常包括以下几个基本要素:模式名称(Pattern Name):简短而清晰地描述了模式的问题、解决方案和效果,便于开发者之间交流。问题(Problem):描述了应当在何时使用模式,包括模式适用的场景、背景和约束。

weixin_34374684的博客 815

[转]Java咖啡馆---叹咖啡

叹咖啡一、序言       有人说,咖啡馆是一个叫人学会放慢步伐、享受生活的地方。这句话不无道理。港人常把饮咖啡称为“叹咖啡”,这个“叹”字就有欣赏、品味的含义,舒适的环境,自然是招徕顾客之道。香港虽然寸金尺土,但无论在闹市或是在风景区,都不难找到精巧雅致的咖啡馆,它们或具欧陆情怀,或富英式韵味,大都环境优美、摆设得体、席位舒适、气派不凡。  许多人想学习编程,但不知道从哪里开始。在这个连载中,我

!Java 2528

Transformer时序预测避坑指南:TFT在风电场的5个实战经验

本文分享了Temporal Fusion Transformer在风电场功率预测中的五个实战经验,涵盖数据预处理、模型调优、显存优化、注意力机制解读及在线部署。针对风电数据噪声大、概念漂移等挑战,提供了从构建数据质量标签到高效超参调优的具体方案,并强调利用Transformer架构的可解释性进行业务洞察,助力实现稳健的工业级时序预测。

bert9linguist的博客 461

Python, Java 开发意式/美式/中式咖啡烘焙研磨技巧APP

该系统通过**烘焙曲线AI预测**(Python)、**AR实景指导**(Java)、**智能设备生态**三大支柱,解决咖啡制作中的 **参数复杂性**(替代经验判断)、**操作容错率低**(实时纠错)、**设备碎片化**(统一控制)三大痛点,让用户轻松复刻全球顶级咖啡馆品质。| **阶段** | **里程碑** | **技术重点** | **周期** |

2501_90802096的博客 839

使用单调栈求解最大矩形面积问题的C++实现

通过本文的介绍,我们详细讲解了如何使用单调栈求解砖墙中最大矩形面积的问题,并提供了完整的C++代码实现。希望通过本文的学习,你能掌握单调栈的基本概念及其在实际问题中的应用。如果你有任何疑问或建议,欢迎在评论区留言交流。

m0_57781768的博客 813

DeepLearningTool-深度学习分类-和HALCON的详细过程

损失函数:衡量预测误差,用于模型优化。混淆矩阵:评估分类模型性能,提供详细预测结果分析。两者结合使用,可以全面评估和优化模型。过拟合:模型过于复杂,捕捉了噪声,表现为训练集误差低,测试集误差高。欠拟合:模型过于简单,无法捕捉数据模式,表现为训练集和测试集误差都高。调整参数过拟合:简化模型、增加数据、使用正则化、早停、Dropout。欠拟合:增加模型复杂度、特征工程、增加训练时间、调整学习率、使用集成方法。通过合理调整参数和方法,可以有效避免过拟合和欠拟合,提升模型性能。

weixin_36672036的博客 6182

基于JAVA+SpringBoot的咖啡商城

随着互联网的普及和发展,电商行业迅速崛起,成为了商业领域中的一股强大力量。咖啡作为一种受欢迎的饮品,其市场需求也在逐年增长。传统的咖啡店业务面临着新的挑战,需要更好的适应数字化、在线化的趋势。在这个背景下,采用基于Spring Boot的前后端不分离的架构,可以为咖啡商城的开发和运营提供更加灵活、高效的解决方案。传统的前后端分离架构中,前端和后端是独立开发、独立部署的,而在不分离的架构中,前端和后端通过一体化的开发方式,更加紧密地协同工作。

azhou的代码园 1488

Hindsight 内存爆炸 4 个词排查清单:9,284 条 6 成是 SSH 调试日志——Agent 标签系统的实战复盘

9,284 条记忆里 66% 是 SSH 调试日志。4 个标签被滥用=0 区分度。3 个 entity_labels + retain_mission + retain_every_n_turns 配置把噪声压回 5%——附 PATCH 脚本和实测前后数据。

Starry-SkyJing的博客 57

线上咖啡点单系统(需求文档)

线上咖啡点单系统可以提供更便捷的点餐体验,用户可以随时随地通过手机或其他移动设备进行点单,节省了排队等候的时间。线上咖啡点单系统也可以为咖啡店提供更多的销售渠道,扩大销售范围,从而促进咖啡产业的发展。1. 功能需求:详细描述管理员和用户两个角色的功能需求,包括用户管理、订单管理、咖啡管理、菜单管理、优惠券管理、公告管理、数据统计、系统设置、员工管理、库存管理等。本文介绍了一种基于Spring Boot的线上咖啡点单系统的设计与实现,包括管理员和用户两个角色的功能需求,以及系统架构和关键技术。

2401_86779185的博客 952

EMB电子机械制动系统和EHB电子液压制动系统控制功能的对比

EMB电子机械制动系统相比EHB液压制动系统具有显著优势:响应速度更快(<100ms)、控制精度更高(±2N·m)、能实现单轮独立控制,支持0.1%级制动力调节。在ABS、ESC等安全功能上表现更优,制动平顺性和NVH性能更好,同时提升能量回收效率15%-20%。特别适合智能驾驶需求,可使AEB等系统响应时间缩短50ms,紧急制动距离减少1米以上。EMB系统完美契合高阶自动驾驶对快速响应和精准控制的要求。

m0_59012156的博客 885

【YOLOv12多模态融合改进】(可见光+红外)涉及像素级融合、特征级融合(中期、中后期、后期)、决策级融合的完整配置步骤以及二次改进方案

在网络输入阶段将多模态数据直接合并,形成统一的特征表示。

Limiiiing的博客 1211

基于JAVA的咖啡馆管理系统设计与实现

选题依据及研究意义随着互联网的飞速发展,纸币逐渐退出了中国市场交易的主体,更多的是直接进行的网上交易。而在咖啡馆的营业模式中,为了顺应时代的需求,也为了简化咖啡馆管理的模式,网上管理咖啡馆应运而生。咖啡馆管理系统是应用于咖啡馆全方位管理的动态网站。近年来随电子商务在各行各业广泛应用,线上运营咖啡馆如雨后春笋在全国迅速展开。

qiufangtaowvnyyidtf的博客 914

【图像拼接】源码精读:Parallax-Tolerant Unsupervised Deep Image Stitching(UDIS++)

注:Pytorch代码。【图像拼接论文精读】专栏对应文章【图像拼接】论文精读:Parallax-Tolerant Unsupervised Deep Image Stitching(UDIS++)配合对应的文章阅读,效果更佳!注:请重点关注代码段中的注释!!!有一些讲解的东西直接写在代码段的注释中了,同时多关注红色字体和绿色字体!!!我认为深度学习方法和传统方法有很多相似之处。比如:深度学习中的损失函数和传统方法中的对齐项、失真项等其实原理相同,只是求解方式不同。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 7272

基于Springboot的前后端不分离的咖啡商城

随着互联网的普及和发展,电商行业迅速崛起,成为了商业领域中的一股强大力量。咖啡作为一种受欢迎的饮品,其市场需求也在逐年增长。传统的咖啡店业务面临着新的挑战,需要更好的适应数字化、在线化的趋势。在这个背景下,采用基于Spring Boot的前后端不分离的架构,可以为咖啡商城的开发和运营提供更加灵活、高效的解决方案。传统的前后端分离架构中,前端和后端是独立开发、独立部署的,而在不分离的架构中,前端和后端通过一体化的开发方式,更加紧密地协同工作。

znbcj的博客 1154

❤️爆肝十二万字《python从零到精通教程》,从零教你变大佬❤️(建议收藏)

文章目录强烈推荐系列教程,建议学起来!!一.pycharm下载安装二.python下载安装三.pycharm上配置python四.配置镜像源让你下载嗖嗖的快4.1pycharm内部配置4.2手动添加镜像源4.3永久配置镜像源五.插件安装(比如汉化?)5.1自动补码神器第一款5.2汉化pycharm5.3其它插件六.美女背景七.自定义脚本开头八、这个前言一定要看九、python入门十、python缩进十一、Python注释1.单行注释2.多行注释十二、Python 变量1.变量定义理解2. 变量名命名3. 分

全栈川川 26万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Java是咖啡还是海洋呢?

Java如果仅仅只是一门编程语言的话,那学习Java应该是一件很快乐的事情。可是Java更是一种伟大的技术,无论从桌面,移动还是网络应用,它都为之提供了完善的解决方案,可以帮助我们构件我们所需要的开发环境。在Java技术的支持下,我们就好象获得了无穷的力量。因为似乎没有Java做不到的事情,这是它强大的地方,不过也是我们学习的难关,因为我们不可能在每个发面都很精通,所以我们必须有选择有针对

Rubby的专栏 834

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

宠物咖啡馆平台

Java简介Java是一种面向对象的静态式编程语言。Java编程语言具有多线程和对象定向的特点。其特点是根据方案的属性将方案分为几个不同的模块,这些模块是封闭的和多样化的,在申请过程中具有很强的独立性。Java语言在计算机软件开发过程中的运用可以达到交互操作的目的,通过各种形式的交换,可以有效地处理所需的数据,从而确保计算机软件开发的可控性和可见性。开发java语言时,保留了网络接口,Java保留的缺省网络接口可以与web应用程序编程所依赖的类别库相匹配。

JAVA计算机毕设的博客 708

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

javaWeb咖啡馆管理系统

2021是网络科技的时代 ,众多的软件被开发出来,给客户带来了很大的选择余地,而且客户越来越追求更个性的需求。在这种时代背景下,客户对咖啡馆管理系统越来越重视,使更好的实现咖啡馆管理的有效发挥,本文将通过咖啡馆管理系统的信息,分析在日常生活中对咖啡信息存在哪些问题探讨出进一步提升工作效率,管理能力的对策。系统采用了jsp技术,将所有模块采用以浏览器交互的模式,选择MySQL作为系统的数据库,开发工具选择eclipse来进行系统的设计。

平安喜乐 1100

计算机毕业设计springboot基于Java的咖啡店管理系统 基于SpringBoot+Java的咖啡馆智慧运营平台 Java Web视角下的咖啡门店数字化管理系统

摘要:本文介绍了一个基于SpringBoot和Java的咖啡店管理系统,旨在通过数字化手段解决传统咖啡店面临的库存管理、订单处理、会员服务等痛点。系统采用B/S架构,整合MySQL数据库,提供管理员、员工和顾客三类角色的功能模块:包括商品管理(咖啡分类、饮品、材料)、订单处理(购物车、支付、退款)、会员服务(积分、评论)以及数据统计分析。该系统实现了咖啡店人、货、场的数字化管理,提升运营效率的同时优化顾客体验。开发环境使用IDEA/Eclipse+MySQL+JDK1.8等技术栈,具有良好的经济性和技术可行

毕设源码_古学姐 1221

Java咖啡馆(1)——叹咖啡

一、序言      有人说,咖啡馆是一个叫人学会放慢步伐、享受生活的地方。这句话不无道理。港人常把饮咖啡称为“叹咖啡”,这个“叹”字就有欣赏、品味的含义,舒适的环境,自然是招徕顾客之道。香港虽然寸金尺土,但无论在闹市或是在风景区,都不难找到精巧雅致的咖啡馆,它们或具欧陆情怀,或富英式韵味,大都环境优美、摆设得体、席位舒适、气派不凡。  许多人想学习编程,但不知道从哪里开始。在这个连载中,我

seawavecau的专栏 1768

咖啡屋订单小程序计算机毕业设计

4. 用户反馈与持续优化:收集用户对咖啡屋订单小程序的使用反馈,对用户提出的问题和意见进行回复和解决,并根据用户反馈和数据分析结果,持续优化咖啡屋订单小程序的功能和性能,提升用户满意度。为此,本研究旨在通过深入研究用户需求,设计并开发一款集点餐、付款、自提等功能于一体的咖啡屋订单小程序,以满足用户在咖啡屋内快速、便捷地完成点餐和自提的需求。本研究旨在开发一款集点餐、付款、自提等功能于一体的咖啡屋订单小程序,旨在提高消费者的咖啡体验并关注用户数据的安全与保护,为用户提供更加安全、放心的使用体验。

583

Java咖啡馆——叹咖啡

Java咖啡馆——叹咖啡 一、序言        有人说,咖啡馆是一个叫人学会放慢步伐、享受生活的地方。这句话不无道理。港人常把饮咖啡称为“叹咖啡”,这个“叹”字就有欣赏、品味的含义,舒适的环境,自然是招徕顾客之道。香港虽然寸金尺土,但无论在闹市或是在风景区,都不难找到精巧雅致的咖啡馆,它们或具欧陆情怀,或富英式韵味,大都环境优美、摆设得体、席位舒适、气派不凡。   许

ownWell的专栏 1472

2019年,Java这杯咖啡为何依然如此醇厚?

早在1995年,Jame Gosling就设计出了Java。Java是一门以Class为单位,高度面向对象的高级编程语言。设计初衷是“写一次代码,在哪里都可以用。”在其...

JAVA葵花宝典 276

基于Spring Boot + Vue的咖啡售卖系统的测试

本项目是咖啡店等企业定制的一款管理系统,包括系统管理后台和移动端应用两部分。咖啡店管理系统是一个基于 Java 语言的系统,其核心目标是为咖啡店提供全面的管理支持。通过这个系统,咖啡店能够实现从个人中心到管理员管理,再到用户管理等一系列的全方位管理功能。

qq_54401434的博客 579

计算机毕业设计java宠物咖啡店管理系统 萌宠主题咖啡馆运营系统 城市猫爪咖啡门店数字化平台

在“宠物经济”高速增长的当下,越来越多咖啡馆把猫狗作为招牌吸引客流:顾客一边品尝咖啡,一边与萌宠互动。然而,传统门店靠人工登记宠物健康、饮品库存、预约场次,常常出现排队混乱、宠物档案缺失、库存超卖等问题。一个能把宠物档案、座位预约、饮品点餐、会员积分、疫苗提醒、员工排班全部搬到线上的管理系统,成了提升体验与营收的关键。 系统采用 SpringBoot + MySQL 构建 B/S 架构,浏览器即可使用,移动端自适应;后台模块化设计,方便后续接入支付、小程序与 IoT 设备。

sheji9132的博客 864
上一篇: 嵌入式系统下的Microwindows实现
下一篇: Palm OS编程简介
ciyi7513
博客等级 码龄11年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值