rtsp解析url java_RTSP实例解析_weixin_39732825的博客-程序员秘密

技术标签: rtsp解析url java  

3. 《RTSP客户端的Java实现》:http://hi.baidu.com/ssyuan/blog/item/566df6defac1dc5094ee37eb.html二. RTSP的常用命令与解释

其中C是客户端,S是服务端。

2.1  OPTIONS

C->S:       OPTION request //询问S有哪些方法可用

S->C:       OPTION response //S回应信息中包括提供的所有可用方法

使用举例:

客户端到服务端:

OPTIONS rtsp://218.207.101.236:554/mobile/3/67A451E937422331 RTSP/1.0

Cseq: 1

服务端对OPTIONS的回应:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 1

Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD

2.2  DESCRIBE

C->S:      DESCRIBE request //要求得到S提供的媒体初始化描述信息

S->C:      DESCRIBE response //S回应媒体初始化描述信息,主要是sdp

使用举例:

客户端到服务端:2.4  PLAY

C->S:      PLAY request //C请求播放

S->C:      PLAY response //S回应该请求的信息

客户端到服务端的请求举例:

DESCRIBE rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp RTSP/1.0

Cseq: 2

服务端对OPTIONS的回应:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 2

Content-length: 421

Date: Mon, 03 Aug 2009 08:21:33 GMT

Expires: Mon, 03 Aug 2009 08:21:33 GMT

Content-Type: application/sdp

x-Accept-Retransmit: our-retransmit

x-Accept-Dynamic-Rate: 1

Content-Base: rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/

v=0

o=MediaBox 127992 137813 IN IP4 0.0.0.0

s=RTSP Session

i=Starv Box Live Cast

c=IN IP4 218.207.101.236

t=0 0

a=range:npt=now-

a=control:*

m=video 0 RTP/AVP 96

b=AS:20

a=rtpmap:96 MP4V-ES/1000

a=fmtp:96 profile-level-id=8; config=000001b008000001b5090000010000000120008440fa282c2090a31f; decode_buf=12586

a=range:npt=now-

a=framerate:5

a=framesize:96 176-144

a=cliprect:0,0,144,176

a=control:trackID=1

2.3  SETUP

C->S:        SETUP request //设置会话的属性,以及传输模式,提醒S建立会话

S->C:        SETUP response //S建立会话,返回会话标识符,以及会话相关信息

客户端到服务端的请求举例:

SETUP rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/trackID=1

RTSP/1.0

Cseq: 3

Transport: RTP/AVP;UNICAST;client_port=16264-16265;mode=play

服务端对客户端的回应举例:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 3

Session: 26633092229589

Date: Mon, 03 Aug 2009 08:21:33 GMT

Expires: Mon, 03 Aug 2009 08:21:33 GMT

Transport: RTP/AVP;UNICAST;mode=play;client_port=16264-16265;server_port=20026-20027

PLAY rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp RTSP/1.0

Session: 26633092229589

Cseq: 4

服务端对客户端的回应举例:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 4

Session: 26633092229589

RTP-Info: url=rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/trackID=1;seq=0;rtptime=0

2.5  PAUSE

C->S:      PAUSE request //C请求暂停播放

S->C:      PAUSE response //S回应该请求的信息

客户端到服务端的请求举例:

PAUSE rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/ RTSP/1.0

Cseq: 5

Session: 26633092229589

服务端对客户端的回应举例:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 5

Session: 26633092229589

2.6  TEARDOWN

C->S:        TEARDOWN request //C请求关闭会话

S->C:        TEARDOWN response //S回应该请求

客户端到服务端的请求举例:

TEARDOWN rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/ RTSP/1.0

Cseq: 6

User-Agent: RealMedia Player HelixDNAClient/10.0.0.11279 (win32)

Session: 26633092229589

服务端对客户端的回应举例:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 6

Session: 26633092229589

Connection: Close

三. RTSP客户端的Java实现

3.1  接口IEvent.java

接口IEvent.java的代码如下:

package com.amigo.rtsp;

import java.io.IOException;

import java.nio.channels.SelectionKey;

/** *//**

* IEvent.java 网络事件处理器,当Selector可以进行操作时,调用这个接口中的方法.

* 2007-3-22 下午03:35:51

* @author sycheng

* @version 1.0

*/

public interface IEvent {

/** *//**

* 当channel得到connect事件时调用这个方法.

* @param key

* @throws IOException

*/

void connect(SelectionKey key) throws IOException;

/** *//**

* 当channel可读时调用这个方法.

* @param key

* @throws IOException

*/

void read(SelectionKey key) throws IOException;

/** *//**

* 当channel可写时调用这个方法.

* @throws IOException

*/

void write() throws IOException;

/** *//**

* 当channel发生错误时调用.

* @param e

*/

void error(Exception e);

}

3.2  RTSP的测试类:RTSPClient.java

RTSP的测试类RTSPClient.java类的代码如下所示:

package com.amigo.rtsp;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.SocketChannel;

import java.util.Iterator;

import java.util.concurrent.atomic.AtomicBoolean;

public class RTSPClient extends Thread implements IEvent {

private static final String VERSION = " RTSP/1.0\r\n";

private static final String RTSP_OK = "RTSP/1.0 200 OK";

/** *//** 远程地址 */

private final InetSocketAddress remoteAddress;

/** *//** * 本地地址 */

private final InetSocketAddress localAddress;

/** *//** * 连接通道 */

private SocketChannel socketChannel;

/** *//** 发送缓冲区 */

private final ByteBuffer sendBuf;

/** *//** 接收缓冲区 */

private final ByteBuffer receiveBuf;

private static final int BUFFER_SIZE = 8192;

/** *//** 端口选择器 */

private Selector selector;

private String address;

private Status sysStatus;

private String sessionid;

/** *//** 线程是否结束的标志 */

private AtomicBoolean shutdown;

private int seq=1;

private boolean isSended;

private String trackInfo;

private enum Status {

init, options, describe, setup, play, pause, teardown

}

public RTSPClient(InetSocketAddress remoteAddress,

InetSocketAddress localAddress, String address) {

this.remoteAddress = remoteAddress;

this.localAddress = localAddress;

this.address = address;

// 初始化缓冲区

sendBuf = ByteBuffer.allocateDirect(BUFFER_SIZE);

receiveBuf = ByteBuffer.allocateDirect(BUFFER_SIZE);

if (selector == null) {

// 创建新的Selector

try {

selector = Selector.open();

} catch (final IOException e) {

e.printStackTrace();

}

}

startup();

sysStatus = Status.init;

shutdown=new AtomicBoolean(false);

isSended=false;

}

public void startup() {

try {

// 打开通道

socketChannel = SocketChannel.open();

// 绑定到本地端口

socketChannel.socket().setSoTimeout(30000);

socketChannel.configureBlocking(false);

socketChannel.socket().bind(localAddress);

if (socketChannel.connect(remoteAddress)) {

System.out.println("开始建立连接:" + remoteAddress);

}

socketChannel.register(selector, SelectionKey.OP_CONNECT

| SelectionKey.OP_READ | SelectionKey.OP_WRITE, this);

System.out.println("端口打开成功");

} catch (final IOException e1) {

e1.printStackTrace();

}

}

public void send(byte[] out) {

if (out == null || out.length 

return;

}

synchronized (sendBuf) {

sendBuf.clear();

sendBuf.put(out);

sendBuf.flip();

}

// 发送出去

try {

write();

isSended=true;

} catch (final IOException e) {

e.printStackTrace();

}

}

public void write() throws IOException {

if (isConnected()) {

try {

socketChannel.write(sendBuf);

} catch (final IOException e) {

}

} else {

System.out.println("通道为空或者没有连接上");

}

}

public byte[] recieve() {

if (isConnected()) {

try {

int len = 0;

int readBytes = 0;

synchronized (receiveBuf) {

receiveBuf.clear();

try {

while ((len = socketChannel.read(receiveBuf)) > 0) {

readBytes += len;

}

} finally {

receiveBuf.flip();

}

if (readBytes > 0) {

final byte[] tmp = new byte[readBytes];

receiveBuf.get(tmp);

return tmp;

} else {

System.out.println("接收到数据为空,重新启动连接");

return null;

}

}

} catch (final IOException e) {

System.out.println("接收消息错误:");

}

} else {

System.out.println("端口没有连接");

}

return null;

}

public boolean isConnected() {

return socketChannel != null && socketChannel.isConnected();

}

private void select() {

int n = 0;

try {

if (selector == null) {

return;

}

n = selector.select(1000);

} catch (final Exception e) {

e.printStackTrace();

}

// 如果select返回大于0,处理事件

if (n > 0) {

for (final Iterator i = selector.selectedKeys()

.iterator(); i.hasNext();) {

// 得到下一个Key

final SelectionKey sk = i.next();

i.remove();

// 检查其是否还有效

if (!sk.isValid()) {

continue;

}

// 处理事件

final IEvent handler = (IEvent) sk.attachment();

try {

if (sk.isConnectable()) {

handler.connect(sk);

} else if (sk.isReadable()) {

handler.read(sk);

} else {

// System.err.println("Ooops");

}

} catch (final Exception e) {

handler.error(e);

sk.cancel();

}

}

}

}

public void shutdown() {

if (isConnected()) {

try {

socketChannel.close();

System.out.println("端口关闭成功");

} catch (final IOException e) {

System.out.println("端口关闭错误:");

} finally {

socketChannel = null;

}

} else {

System.out.println("通道为空或者没有连接");

}

}

@Override

public void run() {

// 启动主循环流程

while (!shutdown.get()) {

try {

if (isConnected()&&(!isSended)) {

switch (sysStatus) {

case init:

doOption();

break;

case options:

doDescribe();

break;

case describe:

doSetup();

break;

case setup:

if(sessionid==null&&sessionid.length()>0){

System.out.println("setup还没有正常返回");

}else{

doPlay();

}

break;

case play:

doPause();

break;

case pause:

doTeardown();

break;

default:

break;

}

}

// do select

select();

try {

Thread.sleep(1000);

} catch (final Exception e) {

}

} catch (final Exception e) {

e.printStackTrace();

}

}

shutdown();

}

public void connect(SelectionKey key) throws IOException {

if (isConnected()) {

return;

}

// 完成SocketChannel的连接

socketChannel.finishConnect();

while (!socketChannel.isConnected()) {

try {

Thread.sleep(300);

} catch (final InterruptedException e) {

e.printStackTrace();

}

socketChannel.finishConnect();

}

}

public void error(Exception e) {

e.printStackTrace();

}

public void read(SelectionKey key) throws IOException {

// 接收消息

final byte[] msg = recieve();

if (msg != null) {

handle(msg);

} else {

key.cancel();

}

}

private void handle(byte[] msg) {

String tmp = new String(msg);

System.out.println("返回内容:");

System.out.println(tmp);

if (tmp.startsWith(RTSP_OK)) {

switch (sysStatus) {

case init:

sysStatus = Status.options;

break;

case options:

sysStatus = Status.describe;

trackInfo=tmp.substring(tmp.indexOf("trackID"));

break;

case describe:

sessionid = tmp.substring(tmp.indexOf("Session: ") + 9, tmp

.indexOf("Date:"));

if(sessionid!=null&&sessionid.length()>0){

sysStatus = Status.setup;

}

break;

case setup:

sysStatus = Status.play;

break;

case play:

sysStatus = Status.pause;

break;

case pause:

sysStatus = Status.teardown;

shutdown.set(true);

break;

case teardown:

sysStatus = Status.init;

break;

default:

break;

}

isSended=false;

} else {

System.out.println("返回错误:" + tmp);

}

}

private void doTeardown() {

StringBuilder sb = new StringBuilder();

sb.append("TEARDOWN ");

sb.append(this.address);

sb.append("/");

sb.append(VERSION);

sb.append("Cseq: ");

sb.append(seq++);

sb.append("\r\n");

sb.append("User-Agent: RealMedia Player HelixDNAClient/10.0.0.11279 (win32)\r\n");

sb.append("Session: ");

sb.append(sessionid);

sb.append("\r\n");

send(sb.toString().getBytes());

System.out.println(sb.toString());

}

private void doPlay() {

StringBuilder sb = new StringBuilder();

sb.append("PLAY ");

sb.append(this.address);

sb.append(VERSION);

sb.append("Session: ");

sb.append(sessionid);

sb.append("Cseq: ");

sb.append(seq++);

sb.append("\r\n");

sb.append("\r\n");

System.out.println(sb.toString());

send(sb.toString().getBytes());

}

private void doSetup() {

StringBuilder sb = new StringBuilder();

sb.append("SETUP ");

sb.append(this.address);

sb.append("/");

sb.append(trackInfo);

sb.append(VERSION);

sb.append("Cseq: ");

sb.append(seq++);

sb.append("\r\n");

sb.append("Transport: RTP/AVP;UNICAST;client_port=16264-16265;mode=play\r\n");

sb.append("\r\n");

System.out.println(sb.toString());

send(sb.toString().getBytes());

}

private void doOption() {

StringBuilder sb = new StringBuilder();

sb.append("OPTIONS ");

sb.append(this.address.substring(0, address.lastIndexOf("/")));

sb.append(VERSION);

sb.append("Cseq: ");

sb.append(seq++);

sb.append("\r\n");

sb.append("\r\n");

System.out.println(sb.toString());

send(sb.toString().getBytes());

}

private void doDescribe() {

StringBuilder sb = new StringBuilder();

sb.append("DESCRIBE ");

sb.append(this.address);

sb.append(VERSION);

sb.append("Cseq: ");

sb.append(seq++);

sb.append("\r\n");

sb.append("\r\n");

System.out.println(sb.toString());

send(sb.toString().getBytes());

}

private void doPause() {

StringBuilder sb = new StringBuilder();

sb.append("PAUSE ");

sb.append(this.address);

sb.append("/");

sb.append(VERSION);

sb.append("Cseq: ");

sb.append(seq++);

sb.append("\r\n");

sb.append("Session: ");

sb.append(sessionid);

sb.append("\r\n");

send(sb.toString().getBytes());

System.out.println(sb.toString());

}

public static void main(String[] args) {

try {

// RTSPClient(InetSocketAddress remoteAddress,

// InetSocketAddress localAddress, String address)

RTSPClient client = new RTSPClient(

new InetSocketAddress("218.207.101.236", 554),

new InetSocketAddress("192.168.2.28", 0),

"rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp");

client.start();

} catch (Exception e) {

e.printStackTrace();

}

}

}

其中:rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp为我在网上找到的一个rtsp的sdp地址,读者可自行更换,RTSP的默认端口为554.

3.3  运行结果

运行RTSPClient.java,运行结果如下所示:

端口打开成功

OPTIONS rtsp://218.207.101.236:554/mobile/3/67A451E937422331 RTSP/1.0

Cseq: 1

返回内容:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 1

Public: DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, OPTIONS, ANNOUNCE, RECORD

DESCRIBE rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp RTSP/1.0

Cseq: 2

返回内容:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 2

Content-length: 421

Date: Mon, 03 Aug 2009 08:50:36 GMT

Expires: Mon, 03 Aug 2009 08:50:36 GMT

Content-Type: application/sdp

x-Accept-Retransmit: our-retransmit

x-Accept-Dynamic-Rate: 1

Content-Base: rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/

v=0

o=MediaBox 127992 137813 IN IP4 0.0.0.0

s=RTSP Session

i=Starv Box Live Cast

c=IN IP4 218.207.101.236

t=0 0

a=range:npt=now-

a=control:*

m=video 0 RTP/AVP 96

b=AS:20

a=rtpmap:96 MP4V-ES/1000

a=fmtp:96 profile-level-id=8; config=000001b008000001b5090000010000000120008440fa282c2090a31f; decode_buf=12586

a=range:npt=now-

a=framerate:5

a=framesize:96 176-144

a=cliprect:0,0,144,176

a=control:trackID=1

SETUP rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/trackID=1

RTSP/1.0

Cseq: 3

Transport: RTP/AVP;UNICAST;client_port=16264-16265;mode=play

返回内容:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 3

Session: 15470472221769

Date: Mon, 03 Aug 2009 08:50:36 GMT

Expires: Mon, 03 Aug 2009 08:50:36 GMT

Transport: RTP/AVP;UNICAST;mode=play;client_port=16264-16265;server_port=20080-20081

PLAY rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp RTSP/1.0

Session: 15470472221769

Cseq: 4

返回内容:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 4

Session: 15470472221769

RTP-Info: url=rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/trackID=1;seq=0;rtptime=0

PAUSE rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/ RTSP/1.0

Cseq: 5

Session: 15470472221769

返回内容:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 5

Session: 15470472221769

TEARDOWN rtsp://218.207.101.236:554/mobile/3/67A451E937422331/8jH5QPU5GWS07Ugn.sdp/ RTSP/1.0

Cseq: 6

User-Agent: RealMedia Player HelixDNAClient/10.0.0.11279 (win32)

Session: 15470472221769

返回内容:

RTSP/1.0 200 OK

Server: PVSS/1.4.8 (Build/20090111; Platform/Win32; Release/StarValley; )

Cseq: 6

Session: 15470472221769

Connection: Close

端口关闭成功

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39732825/article/details/114468951

智能推荐

HDU3764(Cyclic Nacklace)_;w the endhdu_Splaying的博客-程序员秘密

Cyclic NacklaceProblem DescriptionCC always becomes very depressed at the end of this month, he has checked his credit card yesterday, without any surprise, there are only 99.9 yuan left. he is too distressed and thinking about how to tide over the last

dockers镜像的制作_李氏程序员的博客-程序员秘密

[[email protected] ~]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEcentos latest 75835a67d134 3 month...

深度学习崛起十年:“开挂”的OpenAI革新者_OneFlow深度学习框架的博客-程序员秘密

作为一个AI前沿领域的探索者,纵览其职业生涯,Sutskever的每一次转向似乎都能恰到好处地挖到黄金。

sql 优化 5大步骤+10个案例,堪称SQL优化万能公式_Young丶的博客-程序员秘密

一、前言在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈。二、SQL优化一般步骤1、通过慢查日志等定位那些执行效率较低的SQL语句2、explain 分析SQL的执行计划需要重点关注type、rows、filtered、extra。type由上至下,效率越来越高。ALL 全表扫描;index 索引全扫描;range 索引范围扫描,常用语<,

ArrayList的底层原理-扩容_VanHua的博客-程序员秘密

ArrayList的底层数据结构就是一个数组,数组元素的类型为Object类型,对ArrayList的所有操作底层都是基于数组的ArrayList的扩容机制ArrayList的扩容主要发生在向ArrayList集合中添加元素的时候。由add()方法的分析可知添加前必须确保集合的容量能够放下添加的元素。主要经历了以下几个阶段:第一,在add()方法中调用ensureCapacityIntern...

ScrollView用法_Aaronns的博客-程序员秘密

理论部分1、ScrollView和HorizontalScrollView是为控件或者布局添加滚动条2、上述两个控件只能有一个孩子,但是它并不是传统意义上的容器3、上述两个控件可以互相嵌套4、滚动条的位置现在的实验结果是:可以由layout_width和layout_height设定5、ScrollView用于设置垂直滚动条,HorizontalScrollView用于设置水平滚动条:需要注意的是,

随便推点

UVa 11292 - The Dragon of Loowater_Ra_WinDing的博客-程序员秘密

AOAPC I: Beginning Algorithm Contests (Rujia Liu) :: Volume 1. Elementary Problem Solving ::Sorting/SearchingDescription待编辑TypeSorting/SearchingAnalysis利用 STL, 轻松加愉快。

Independence Day_broadury的博客-程序员秘密

《独立日》总是这么能鼓舞人,特别是总统对飞行员演讲的时候,我一遍一遍的听着,似乎总是听不够……The President:Good morning. In less than an hour, aircraft from here will join others from around the world. And you will be launching the larges...

Bootstrap-select 使用问题_加了白糖的老干妈的博客-程序员秘密

Bootstrap-selectBootstrap-selectbootstrap-select 搜索,动态加载数据bootstrap-select js设置选中Bootstrap-select 官方APIbootstrap-select 搜索,动态加载数据1.开启搜索<!-- data-live-search="true" --> ...

DUI总结_weixin_30650039的博客-程序员秘密

DUI好处在于可以很方便的构建高效,绚丽的,非常易于扩展的界面。从而很好的将界面和逻辑分离,同时易于实现各种超炫的界面效果如换色,换肤,透明等。DUI使用的是GDI+核心.DirectUI可以理解为一个轻量级的WPF,可以让C++做出C#般绚丽的界面。DUI核心的大体结构图如下:分为几个大部分:1.控件2.容器3.UI构建解析器(XML解析)...

windows mysql的坑:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)_秃如其来的秃头的博客-程序员秘密

windows中mysql5.7的坑:ERROR 2003 (HY000): Can’t connect to MySQL server on ‘localhost’ (10061)不知道是 windows 自动更新导致的问题还是什么**一、**打开解压的文件夹C:\MySQL Server 5.7(这只是打个比方,各位看官按照自己的目录去找) ,发现里面有my-default.ini配置文件...

最长非递减子序列LIS(动态规划法,一维)_iOPEN.Yang的博客-程序员秘密

//动态规划法//LIS(时间复杂度为n平方)#include <iostream>#include <cstring>#define N 1000using namespace std;int LIS(int A[], int length){ int d[N]; for(int i=1;i<N;i++) d[i]=1; d[0]=0; for(int i=

推荐文章

热门文章

相关标签