- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试解决我的 A* 路径查找算法。我有三个类:Menu
、Grid
和 Node
。
如果您运行我的程序,您会看到它打印出一条不寻常的螺旋形、跳跃式、兔子跳跃路径。我相信意外行为与以下功能有关:
printAStarPath(int startx, int starty, int endx, int endy)
在我看来,我认为问题与父节点设置不当有关。我很确定 Node
和 Menu
工作正常。
菜单功能主要管理用户输入。用户可以添加墙壁、开始位置和结束位置,以及网格的大小。我还在菜单中包含了一些测试(因此您不必每次测试都重新输入所有内容)。 printAStarPath(...)
函数接受起始 x,y 位置和结束 x,y 位置。
我想要这样打印一个网格:
[ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][X][ ][ ][ ]
[ ][S][ ][X][ ][E][ ]
[ ][ ][*][X][*][ ][ ]
[ ][ ][ ][*][ ][ ][ ]
不幸的是,我得到了这种疯狂:
[ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][X][ ][ ][*]
[ ][S][ ][X][ ][E][*]
[ ][ ][*][X][ ][ ][*]
[ ][ ][ ][*][*][*][ ]
另一个不同输入会发生什么的例子:
[E][ ][ ][ ][ ]
[ ][*][ ][ ][*]
[ ][ ][X][ ][*]
[ ][ ][ ][ ][*]
[ ][*][ ][*][S]
我的一些网格看起来像指向右下的箭头。有些看起来像是向右下,然后向左螺旋上升。
我正在使用 A* 路径查找方法,并通过曼哈顿方法计算启发式(或 H 成本)。我使用递归来获取准确的 G 成本以及从结束位置追溯到开始位置。
Here's the article that I followed.
菜单
:
package pathFinding;
import java.util.*;
public class Menu {
private Grid board;
public Menu(){
board = new Grid(0, 0);
}//end constructor
static public void main (String[] args){
Menu pft = new Menu();
pft.boardMenu();
System.out.print("process terminated.");
}//end main
public void boardMenu(){
// very user error prone !
boolean kg = true;
Scanner in = new Scanner(System.in);
int input;
while(kg){
input = -1;
System.out.print("\n\n\n\n");
System.out.print(">>> Hi there,"
+ "\n(0) quit"
+ "\n(1) test 1"
+ "\n(2) test 2"
+ "\n(3) new board"
+ "\n>>> ");
input = in.nextInt();
if (input == 3){
this.initUserData();
} else if (input == 0){
kg = false;
} else if (input == 1){
board.setSize(7, 5);
board.setCollidable(3, 1);
board.setCollidable(3, 2);
board.setCollidable(3, 3);
board.printAStarPath(1, 2, 5, 2);
} else if (input == 2){
board.setSize(25, 25);
board.setCollidable(5, 4);
board.setCollidable(4, 5);
board.setCollidable(3, 3);
board.printAStarPath(15, 15, 4, 4);
}
} // end while
} // end boardMenu
public void initUserData(){
boolean kgTmp = true;
int xTmp, yTmp, iTmp, jTmp = 0;
// initiate input device
Scanner in = new Scanner(System.in);
// 0: determine board size
System.out.print("\nBoard width: ");
xTmp = in.nextInt();
System.out.print("\nBoard height: ");
yTmp = in.nextInt();
board.setSize(xTmp, yTmp);
// 1: determine obstruction locations
kgTmp = true;
while(kgTmp){
System.out.print("\nObstruction x Loc: ");
xTmp = in.nextInt();
System.out.print("\nObstruction y Loc: ");
yTmp = in.nextInt();
board.setCollidable(xTmp, yTmp);
System.out.print("\nMore Obstructions?(0=no;1=yes): ");
if(in.nextInt() == 0)
kgTmp = false;
} // end while
// 2: determine start location
System.out.print("\nStart x Loc: ");
xTmp = in.nextInt();
System.out.print("\nStart y Loc: ");
yTmp = in.nextInt();
// 3: determine end location
System.out.print("\nEnd x Loc: ");
iTmp = in.nextInt();
System.out.print("\nEnd y Loc: ");
jTmp = in.nextInt();
System.out.println("\nredy for astar");
// 4: determine and print A* path
board.printAStarPath(xTmp, yTmp, iTmp, jTmp);
System.out.println("\nastar shud be done?");
} // end initBoardData
} // end class def
网格
:
package pathFinding;
import java.util.*;
public class Grid {
private List<List<Node>> grid;
List<List<Integer>> path;
private int width;
private int height;
//------------------------------------------------------------------------
// Name: Constructor
// Desc: Takes in a width & height. Initializes stuff.
//------------------------------------------------------------------------
public Grid(int width, int height){
grid = new ArrayList<List<Node>>();
path = new ArrayList<List<Integer>>();
this.width = width;
this.height = height;
initGrid(width, height);
} // end constructor
//------------------------------------------------------------------------
// Name: initGrid
// Desc: initializes the grid with data
//------------------------------------------------------------------------
public void initGrid(int w, int h){
// add columns
for (int i=0;i<w;i++)
grid.add(new ArrayList<Node>());
// fill grid with nodes
for (int i=0;i<w;i++)
for (int j=0;j<h;j++)
grid.get(i).add(new Node(i, j));
} // end initGrid
//------------------------------------------------------------------------
// Name: setSize
// Desc: Sets the size of the grid
//------------------------------------------------------------------------
public void setSize(int w, int h){
this.width = w;
this.height = h;
// update the nodes
clearAll();
initGrid(width, height);
} // end setSize
//------------------------------------------------------------------------
// Name: clearAll
// Desc: Clears any data in grid and path
//------------------------------------------------------------------------
public void clearAll(){
// removes all rows/columns/nodes
grid.clear();
path.clear();
} // end clearAll
//------------------------------------------------------------------------
// Name: printGrid
// Desc: Prints the whole grid
//------------------------------------------------------------------------
public void printGrid(){
// prints every node's value
// loop thru columns
for (int j=0;j<height;j++){
// thru row
for (int i=0;i<width;i++)
grid.get(i).get(j).printText();
System.out.println();
} // end j loop
} // end printGrid
//------------------------------------------------------------------------
// Name: setCollidable
// Desc: Sets a node at x,y to collidable
//------------------------------------------------------------------------
public void setCollidable(int x, int y){
// makes a node at x,y collidable
grid.get(x).get(y).setCollidable(true);
grid.get(x).get(y).setText("[X]");
} // end setCollidable
//------------------------------------------------------------------------
// Name: printAStarPath
// Desc: Finds and prints the path from start to end
// Errr: This function only almost works :( ... oh well i tried
//------------------------------------------------------------------------
public void printAStarPath(int startx, int starty, int endx, int endy){
//========================================================
// PSEUDO CODE BRO.
//========================================================
// 1: Declarations
// PART ONE
// 2: Initialize:
// 1: Drop current node from openList
// Add current node to closedList
// 2: Set current node as parent for each neighbor
// Add neighbors to openList
//
// PART TWO
// 3: Loop: (thru openList)
//
// (openList should contain neighbors of closedList nodes here)
//
// EXAMPLE:
//
// n n n n n
// n n n n n>
// n S * * n-> E (the closest star is the current node)
// n n n n n>
// n n n n n
//
// 1: Set neighbor w/ lowest F-cost from the openList as current node
// 2: Add this new node to the closedList
// Remove from openList
// 3: Loop (for each neighbor):
// 1: Add openlist'less neighbors to openList
// Set current node as parent for neighbor node
// 2: If neighbor is already on the openList:
// 1: Get G-cost of neighbor IF: neighbor's parent is current node's parent (default)
// IF: neighbor's parent is current node
// 2: If the 2nd G-cost is less:
// 1: set neighbor's parent to current node
// 2: recalculate F and G costs (possibly you don't need this)
// 4: Stop: IF: end node is in closedList or,
// IF: end node is not in closedList and openList is empty
// 4: Save/Return Path
// 5: Print Results: (if you wanna print)
// 1: Fill grid with proper symbols
// 2: Print grid
//===========//
// 1 //
//===========//
List<List<Integer>> closedList = new ArrayList<List<Integer>>();
List<List<Integer>> openList = new ArrayList<List<Integer>>();
int x = startx;
int y = starty;
int gOrig = 0;
int gThru = 0;
boolean condition = false;
//===========//
// 2 //
//===========//
if (closedList.contains(Arrays.asList(x, y)) == false)
closedList.add(Arrays.asList(x, y));
for (int i=x-1;i<x+2;i++){
for (int j=y-1;j<y+2;j++){
if (i>=0 && i<this.width){
if (j>=0 && j<this.height){
if (closedList.contains(Arrays.asList(i, j)) == false){
if (grid.get(i).get(j).getCollidable() == false){
//-----------------------------------------------------
// setting parent
grid.get(i).get(j).setParent( grid.get(x).get(y) );
// adding to openList
openList.add(Arrays.asList(i, j));
//-----------------------------------------------------
}//end if (check collidable)
}//end if (in closedList?)
}//end if (check height)
}//end if (check width)
}//end j loop
}//end i loop
//===========//
// 3 //
//===========//
while(condition == false){
//===========//
// 3.1 //
//===========//
// selecting lowest F-cost node
x = getLowestFCostNodePos(openList, endx, endy)[0];
y = getLowestFCostNodePos(openList, endx, endy)[1];
//===========//
// 3.2 //
//===========//
closedList.add(Arrays.asList(x, y));
openList.remove(Arrays.asList(x, y));
//===========//
// 3.3 //
//===========//
for (int i=x-1;i<x+2;i++){
for (int j=y-1;j<y+2;j++){
if (i>=0 && i<this.width){
if (j>=0 && j<this.height){
if (closedList.contains(Arrays.asList(i, j)) == false){
if (grid.get(i).get(j).getCollidable() == false){
//-----------------------------------------------------
if (openList.contains(Arrays.asList(i, j)) == false){
// setting parent
grid.get(i).get(j).setParent( grid.get(x).get(y) );
// adding to openList
openList.add(Arrays.asList(i, j));
}//end if (in openList?)
else{
// getting G-costs
gOrig = grid.get(i).get(j).getG();
grid.get(i).get(j).setParent(grid.get(x).get(y));
gThru = grid.get(i).get(j).getG();
// comparing G-costs
if (gOrig < gThru){
// revert parent back the way it was
grid.get(i).get(j).setParent(grid.get(x).get(y).getParent());
}//end if (G-costs)
// adding to openList
openList.add(Arrays.asList(i, j));
}//end else (in openList?)
//-----------------------------------------------------
}//end if (check collidable)
}//end if (in closedList?)
}//end if (check height)
}//end if (check width)
}//end j loop
}//end i loop
//===========//
// 3.5 //
//===========//
if (openList.size() == 0){
condition = true;
System.out.print("\nNo Path.\n");
} else if (closedList.contains(Arrays.asList(endx, endy)) == true){
condition = true;
System.out.print("\nPath Found.\n");
}
}//end while loop (condition)
//===========//
// 4 //
//===========//
if (openList.size() > 0)
getNodePath(grid.get(endx).get(endy));
//===========//
// 5.1 //
//===========//
if (openList.size() > 0)
for (int i=0; i<path.size(); i++){
// setting symbols
grid.get(path.get(i).get(0)).get(path.get(i).get(1)).setText("[*]");
}
// setting start/end
grid.get(startx).get(starty).setText("[S]");
grid.get(endx).get(endy).setText("[E]");
//===========//
// 5.2 //
//===========//
printGrid();
} // end printAStarPath
//------------------------------------------------------------------
// Name: getNodePath
// Desc: returns coordinates of path (in order) from start to end
//------------------------------------------------------------------
public void getNodePath(Node node){
// redo this function with the parent of node
if (node.getParent() != null){
// add a coordinate to path list
this.path.add(0, Arrays.asList(node.getX(), node.getY()));
// recur
getNodePath(node.getParent());
}//end if (recursive)
} // end getNodePath
//------------------------------------------------------------------
// Name: getLowestFCostNodePos
// Desc: returns coordinates of node with lowest F-cost in openList
//------------------------------------------------------------------
public int[] getLowestFCostNodePos(List<List<Integer>> openList, int endx, int endy){
// Declarations
int xTmp = 0;
int yTmp = 0;
int fMin = 1000000;
int[] cords = new int[2];
// look for lowest F-cost node
for (int i=0;i<openList.size();i++){
// setting possible position
xTmp = openList.get(i).get(0);
yTmp = openList.get(i).get(1);
// compare F-values
if (fMin > grid.get(xTmp).get(yTmp).getF(endx, endy)){
// set temporary F-cost
fMin = grid.get(xTmp).get(yTmp).getF(endx, endy);
}//end if (compare F)
}//end i loop
// just in case
if (openList.size() > 0){
cords[0] = xTmp;
cords[1] = yTmp;
return cords;
} else{
System.out.print("openList is empty!");
return null;
}
} // end getLowestFCostNodePos
} // end class def
节点
:
package pathFinding;
public class Node {
private String text;
private int x;
private int y;
private boolean collidable;
private Node parent;
public Node(int x, int y){
text = "[ ]";
this.x = x;
this.y = y;
collidable = false;
parent = null;
} // end constructor
public void setText(String text){
this.text = text;
} // end setText
public int getX(){
return this.x;
} // end getX
public int getY(){
return this.y;
} // end getY
public void setCollidable(boolean arg0){
collidable = arg0;
} // end setCollidable
public boolean getCollidable(){
return collidable;
} // end getCollidable
public void setParent(Node n){
parent = n;
} // end setParent
public Node getParent(){
// for parent location: return new int[] {parent.getX(), parent.getY()};
return parent;
} // end getParent
public void printText(){
System.out.print(this.text);
} // end printText
public int getF(int endx, int endy){
return this.getG() + this.getH(endx, endy);
} // end getF
public int getG(){
// calculate exact distance from start
if (parent != null){
if (parent.getX()-this.x == 0 || parent.getY()-this.y == 0)
return parent.getG() + 10;
else
return parent.getG() + 14;
}//end if
return 0;
} // end getG
public int getH(int endx, int endy){
// calculate estimated distance to end (Manhattan distance)
return (Math.abs(this.x-endx) + Math.abs(this.y-endy))*10;
} // end getH
} // end class def
一段时间后我回到这段代码,我刚刚测试了一个新图表,遗憾的是,它给了我这个:
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][X][ ][ ][ ][ ]
[ ][ ][X][X][X][X][ ][*][ ][ ]
[ ][ ][*][*][E][X][ ][ ][*][ ]
[ ][*][X][X][X][X][ ][ ][ ][S]
[ ][ ][*][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][*][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][*][ ][*][ ][ ][ ]
[ ][ ][ ][ ][ ][*][ ][ ][ ][ ]
谁能弄清楚为什么会这样?
最佳答案
好的,我已经仔细阅读了您的代码,并在其他人的评论的帮助下成功实现了它的工作。我只发布更改后的方法:
Grid.getLowestFCostNodePos
不跟踪具有最低 F 的节点的 X 和 Y 值:
public int[] getLowestFCostNodePos(List<List<Integer>> openList, int endx, int endy){
// Declarations
int fMin = 1000000;
int[] cords = new int[2];
int minX = -1;
int minY = -1;
// look for lowest F-cost node
for (int i=0;i<openList.size();i++){
// setting possible position
int xTmp = openList.get(i).get(0);
int yTmp = openList.get(i).get(1);
int fCandidate = grid.get(xTmp).get(yTmp).getF(endx, endy);
// compare F-values
if (fMin > fCandidate) {
// set temporary F-cost
fMin = fCandidate;
minX = xTmp;
minY = yTmp;
}//end if (compare F)
}//end i loop
// just in case
if (openList.size() > 0){
cords[0] = minX;
cords[1] = minY;
return cords;
} else{
System.out.print("openList is empty!");
return null;
}
} // end getLowestFCostNodePos
Node.getG()
Node.getH()` 不使用相同的单位(H 认为步长为 1,G 步长为 10,N/S/E/W 步长为 14,对角线步长)并且 H 不考虑对角线步长.我将其标准化,使一步的成本始终为 1:
public int getG(){
// calculate exact distance from start
if (parent != null){
return parent.getG() + 1;
}//end if
return 0;
} // end getG
public int getH(int endx, int endy){
// calculate estimated distance to end
// Since we can walk diagonally we can cover the smallest of
// dx and dy while covering the longest. The distance is therefore
// the largest of the two
return Math.max(Math.abs(this.x - endx), Math.abs(this.y - endy));
} // end getH
测试板1:
[ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][X][ ][ ][ ]
[ ][S][ ][X][ ][E][ ]
[ ][ ][*][X][*][ ][ ]
[ ][ ][ ][*][ ][ ][ ]
测试板2:
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][X][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][E][X][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][X][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][*][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][S][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ][ ]
自定义板:
[S][X][ ][ ][ ]
[*][X][ ][*][ ]
[*][X][*][X][*]
[*][X][*][X][*]
[ ][*][ ][X][E]
也就是说,您应该考虑实现 Point
类而不是到处使用 ArrayList 并使用局部变量和辅助方法,因为您的代码非常冗长且难以阅读。
像这样的行让我很头疼:
grid.get(path.get(i).get(0)).get(path.get(i).get(1)).setText("[*]");
改变 ArrayList<Integer>
定制 Point
类并使用两个局部变量大大提高了可读性:
Point point = path.get(i);
List<Node> row = grid.get(point.getX());
row.get(point.getY()).setText("[*]");
如果您要将实用方法添加到 Grid
获取特定的 Node
来自Point
你可以把它减少到:
getNode(path.get(i)).setText("[*]");
而且该方法可以在很多地方使用以提高可读性。
关于java - A* 寻路算法给出奇怪的路径(文本 map - 无 GUI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29981687/
粗略地说,单向数据绑定(bind)只是与 ng-model 绑定(bind)。当涉及 Controller 时,在页面内和 2-way 内。有人可以向我解释这个概念,以便我真正了解如何看待它吗?还有什
我想知道是否有任何替代 2 向 SSL 的方法。 2 向 SSL 是确保客户端和服务器可信通信的唯一选择吗?我有一个自签名证书供我的客户使用,我能否将自签名证书重新用于 2 种 SSL 方式,还是应该
如果是这样,你如何设置认证证书,你需要什么文件?是 .pfx 吗?您将如何在浏览器中安装它?一直试图通过浏览器测试 2 路 ssl。我有一个网络服务,尝试连接时总是返回认证身份验证失败。 最佳答案 扩
我希望能够对 XHTML 文档进行三向合并: 从文档的一些原始副本开始 一个用户编辑原始文档的副本 另一个用户编辑原始文档的单独副本 需要一个工具来合并(自动和/或可视化)两个用户所做的更改。 注意:
我有 4 张 table : ad (id, ...) website (id, title, URL, ...) space (id, website_id, ...) ad_space_count
我在 java 中有一个无状态服务,部署在 tomcat 网络服务器中,我还配置了 2 路 ssl 验证。到目前为止,一切正常。当我有一个新客户端时,我只需要将新客户端证书放入我的 trustore
我已经创建了一个带有证书的信任库和带有私钥的 keystore 。我已经放置了以下代码,加载了 trsustore 管理器和 keystore 管理器,然后创建了 SSL 上下文的实例。 每当我向网络
如果我在仅服务器身份验证中正确理解 SSL/TLS,握手后,服务器会向客户端发送它的公钥和由 CA 签名的数字签名证书。如果客户端有这个 CA 的公钥,它就可以解密证书并与服务器建立信任。如果它不信任
我有 Nginx,它使用双向 TLS 代理从客户端到 IBM DataPower 的请求。 从 Nginx 向 IBM DP 发送消息时出现错误:sll server (SERVER) ssl pee
我刚刚开始了一个项目,让我的雇主成为一个管理软件。我有一个琐碎但可能很简单的查询,我似乎找不到任何相关信息。 在对象之间建立“具有”关系的两种方式是否谨慎/良好做法。例如,Client 对象“有一个”
我在设置双向 SSL 身份验证时遇到问题。 我需要从 wso2 企业集成商访问 HTTPS 端点。 服务提供商给了我一个 pfx keystore ,其中包含我必须提供给服务器的证书和私钥。 我在我的
我正在为小型 PoC 构建 AWS Lambda 服务。 PoC 中的流程是: 通过 POST 获取(文本)输入, 执行小字符串操作 + 将操纵值存储到 DynamoDB 中,然后 通过 HTTP P
我的任务是在 Java 上下文中实现双向 TLS。我找到了一个示例 ( https://www.opencodez.com/java/implement-2-way-authentication-us
我正在尝试测试一个非常简单的双向 IM 应用程序。客户端在 android 上,服务器在我的 PC(java)上。我已经在 PC 到 PC 之间用 java 测试了这个应用程序,它工作正常。 但是在我
我有 java web 服务支持2-way ssl auth。所以我有客户端 keystore (client.p12),服务器证书在受信任的存储区中,服务器 keystore 中的客户端证书在受信任
通过 HTTPS 使用 Web 服务 我们有一个我们正在使用的网络服务。 Webservice 可以在 HTTP 和 HTTPS 协议(protocol)上运行。使用 HTTP 没问题,但如何使用 H
我在 Node.js 上有一个后端服务器,我正在尝试在 Nginx 和这个后端服务器之间设置 2 路 SSL。 但是我得到一个错误:2015/11/02 06:51:02 [错误] 12840#128
我一直在尝试连接到启用了 2 路 SSL 的服务端点。我正在使用 Spring resttemplate。我已将证书添加到 keystore 中,但出现以下错误: >org.springframewo
从 CherryPy 3.0 开始,只需指向服务器证书和私钥即可启用单向 SSL,如下所示: import cherrypy class HelloWorld(object): def ind
这个问题来自:MySQL Number of Days inside a DateRange, inside a month (Booking Table) 我有一个包含以下数据的表: CREATE
我是一名优秀的程序员,十分优秀!