当前位置:首页 » 编程语言 » rtpjava

rtpjava

发布时间: 2022-05-07 21:23:02

㈠ C/S架构,服务器为LINUX,用到的协议sip,RTST,RTP,开发语言为java,C#,C++,哪款性能测试工具比较适合

RTST:是RTSP吧,RTSP(Real Time Streaming Protocol)是用来控制声音或影像的多媒体串流协议

㈡ java rtpstream怎么用

1.出现Local Data AddressDoes not belong to any of this hosts local interfaces错误:
主要问题是发送视频和音频的程序需要在服务器上运行,你可以选择Win2000 Server 或者Win2003 Server,问题就解决了。
2.传输声音和视频的方法如下:
a.传输声音或者视频文件
编译完AVTransmit2.java后,再命令提示符中输入命令:java AVTransmit2 file:test.wav 224.224.123.123 22222(注意文件的类型是.wav 或者.mov 、.mpg的文件,不可以是.mp3、.rmvb等其他不支持的文件。传输支持文件格式有限,我也没有办法,应该在添加相关的插件就行了,希望大家提供帮助),其中test.wav即传输的文件名,224.224.123.123为多播地址,22222为端口号.
接收方法:编译完AVReceive.java后,在命令提示符中输入命令:java AVReceive 224.224.123.123/22222即可接受到声音文件
b.传输麦克风的音频,在传输之前先检查电脑录音控制的选项是否为麦克风.(步骤:打开桌面任务栏上的音量控制,选择选项---->属性----->调节音量选择录音,之后在下面的音量控制属性中选中麦克风。单击确定。接着跳到录音控制,选择麦克风就行了)。使用的命令是:java AVTransmit2 dsound:// 224.224.123.123 22222,此时就开始传输声音了。
接收方法同上
c.传输摄相头视频,使用的命令为:java AVTransmit2 vfw://0 224.224.123.123 22222
接收方法同上
d.关于广播、组播和单播
广播:对于局域网广播你可以使用广播的地址,如你的子网掩码是255.255.225.0,即C类的默认子网掩码,你的广播地址可以是192.168.3.255。(注:我的局域网ip地址分配为192.168.3.X)。如子网掩码不同,你可以参照相关的网络常识自己推算。
接收时也使用多播地址来接受,假如发送方的机器地址为:192.168.3.46。发送时在发送放的机器上运行java AVTransmit2 file:test.wav 192.168.3.255 22222,接收时使用java AVReceive2 224.224.123.123 22222。才能完成接收.这和网上的说法不同,端口号不要填错,地址任意。按网上的说法,使用的接收地址应为为192.168.3.46,可是我没有成功,总是出现Local Data AddressDoes not belong to any of this hosts local interfaces的错误,而使用多播地址反而成功了。具体的参数我就不多介绍了,有问题可以给我留言。
组播:使用组播地址发送,组播地址接收即可
单播:假如你只想给某台机子发送,那么就在发送方输入命令,如:java AVTransmit2 file:test.wav 192.168.3.47 22222,这时你只会将声音流文件发送给47号计算机。而接受时还是使用多播地址,如java AVReceive2 224.224.123.123 22222。这是就听到声音了。
总之,使用RTP传输,在接受时都在使用多播地址,在发送时根据情况而定,至于ttl你可以不去管它。不只大家是怎么实现的,反正网上的资料让我变的很失望,真正的成功源于实践。下面摘取一段让大家欣赏(尽信书则不如无书)
网上摘取:
Transmitting Audio and Video over RTP
The AVTransmit2 class is very similar to the VideoTransmit, but uses RTP managers
to send the video and audio streams.
Since the media tracks are transmitted in multiple sessions, you'll need to
use one Player per track on the receive side. Using JMStudio, you can
start multiple Players from the "File" menu using the "New Window"
item. Then either:
use the "Open URL..." item to open one RTP session per track. The URL to use is:

rtp://<sourceIP>:<port>/media
Where <sourceIP> is the IP address of the RTP session and the port
number is the same one that is used on the transmitting side.
OR

Open RTP session and specify <sourcIP> and <port>

How to run this sample
1. Run AVTransmit2 with the required 3 command line parameters
For example, we can use any of the following:
- java AVTransmit2 file:clips/clip01mpg.mpg 224.112.112.112 22222

2. To receive the transmission on the client side use JMStudio:
- use open RTP session and specify group: 224.112.112.112 & port: 22222
AND use FILE -> New Window and open RTP sesssion with port 22224.

OR
- use open URL and specify: rtp://224.112.112.112:22222/video
AND use FILE -> New Window and open URL with 22224/audio

Notes:

You should run 1. then 2., otherwise AVTransmit2 will find the port number used.
You can also use the program to send only audio or video as follows:

- java AVTransmit2 javasound://0 224.112.112.112 22222 (audio only)
- java AVTransmit2 vfw://0 224.112.112.112 22222 (video only)
In such case create only one instance of JMStudio.

Use Unicast:

- java AVTransmit2 file:clip01.mpg 128.82.4.7 22222
Where 128.82.4.7 is the receicver address.
If the sender address is 128.82.4.9 it will use port 22222 as well
to send out data. In this case the receiver (e.g., JMStudio)
should specify the sender as: 128.82.4.9 22222.
Therefore to use unicast you should have two machines since
you can not use the same port for both sender and receiver.
Receiving Audio and Video using RTP
AVReceive2 uses the RTPManager API to receive RTP transmissions.
AVReceive2 performs the following tasks:
Open one RTP session per session address given.
Listen for the NewReceiveStreamEvent from the ReceiveStreamListener.
Create a JMF Player for each stream received for playback.
This sample program can be used in conjunction with JMStudio,
the AVTransmit2 sample or any other RTP compliant transmitter.
The IP address should be the address of the computer which transmits the data; or the multicast address if multicast is being used for the transmission.
The ports should be the same as what's being used by the transmitter.
How to run this sample
1. Run AVTransmit2 with the required 3 command line parameters
For example:
- java AVTransmit2 file:clips/clip01mpg.mpg 224.112.112.112 1234
2. Run AVReceive2 and specify the RTP session addresses to receive from.
For example:
- java AVReceive2 224.112.112.112/1234 224.112.112.112/1236
to simultaneously receive 2 different RTP sessions (video and audio).
Note: because of port reuse, it must run in this order, 1 then 2.

㈢ java里有没有播放音乐的函数

JMF就是最简单的方法,你是做播放器的话,那就最合适不过了,JMF封装的非常好,用户接口简单易用,比用别的方法都简单。我原来也专门看过。官方的JMF介绍文档写的很通俗易懂,这个框架我觉得重点是java的RTP协议,可以用java开发远程会议之类的东西,播放只是它最基本的功能而已,所以你用的话只看看那些基本的东西就够了。java的基本类库里也有sound包,但是没有音频知识这个东西估计你够强能看懂,如果你单纯搞一个播放器,而非处理音频,就用JMF就可以

㈣ audiocapture在java哪个包中

//java的JDK中并没有此类,另外,帮你找了一下这个类的源代码:
//你也可以整包下载,下载地址:
//http://www.codeforge.com/read/3843/AudioCapture.java__html
//以下是部分代码示例:
{
RTPTransmitrtpTransmit=null;//RTP传输类对象

LabellabelEncoding=newLabel();
ChoicechoiceEncoding=newChoice();//编码方法下拉列表框
LabellabelSampleRate=newLabel();
ChoicechoiceSampleRate=newChoice();//采样率下拉列表框
LabellabelBits=newLabel();
=newCheckboxGroup();
Checkboxcheckbox8Bit=newCheckbox();//每个样本的编码位数单选按钮
Checkboxcheckbox16Bit=newCheckbox();
LabellabelChannels=newLabel();
=newCheckboxGroup();
CheckboxcheckboxMono=newCheckbox();//通道数单选按钮
CheckboxcheckboxStereo=newCheckbox();
JLabeljLabel1=newJLabel();

LabellabelIP=newLabel();
TextFieldtextIPAdd1=newTextField();//IP地址编辑框
TextFieldtextIPAdd4=newTextField();
TextFieldtextIPAdd3=newTextField();
TextFieldtextIPAdd2=newTextField();
LabellabelPort=newLabel();
TextFieldtextPort=newTextField();//端口号编辑框
JLabeljLabel2=newJLabel();

ButtonbuttonCaptureTransmit=newButton();
ButtonbuttonStop=newButton();

//设置界面和添加事件的监听
privatevoidjbInit()throwsException{
this.setLayout(null);
this.setBackground(Color.lightGray);

labelEncoding.setText("Encoding:");
labelEncoding.setBounds(newRectangle(46,50,80,20));
choiceEncoding.setBounds(newRectangle(152,50,180,20));
choiceEncoding.add("DVI/RTP");
choiceEncoding.add("G723/RTP");
choiceEncoding.add("GSM/RTP");
choiceEncoding.add("ULAW/RTP");
choiceEncoding.add("MPEGAUDIO/RTP");
choiceEncoding.select(0);
choiceEncoding.addItemListener(newjava.awt.event.ItemListener(){
publicvoiditemStateChanged(ItemEvente){
choiceEncoding_itemStateChanged(e);
}
});

labelSampleRate.setText("SampleRate:");
labelSampleRate.setBounds(newRectangle(46,80,80,20));
choiceSampleRate.setBounds(newRectangle(152,80,180,20));
choiceSampleRate.add("22050.0");
choiceSampleRate.add("11025.0");
choiceSampleRate.add("8000.0");
choiceSampleRate.select(0);

㈤ java 如何发送 RTP/RTSP协议 具体怎么实现的

首先搜索有没有RTP/RTSP协议现成的包可用,没有那么你就要去读协议白皮书了。

然后按照协议白皮书的格式,编写通信协议。
最后写出的东西好不好用就看你的水平了。

㈥ 求java声音代码,可以播mp3的谢谢了!

package baseitem;

import java.util.*;
import java.net.*;
import java.lang.reflect.Method;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;

import javax.media.*;
import javax.media.util.*;
import javax.media.format.*;
import javax.media.control.*;
import javax.media.protocol.*;
import javax.media.bean.playerbean.*;
import javax.media.rtp.*;
import javax.media.rtp.event.*;

import javax.swing.border.*;
public class MediaPlayer extends JPanel implements ControllerListener{

//定义界面组件
JMenuBar mainMenu= new JMenuBar();

JMenu fileMenu = new JMenu("文件");
JMenu playMenu = new JMenu("播放");
JMenu helpMenu = new JMenu("帮助");

JMenuItem openMenuItem= new JMenuItem("打开");
JMenuItem exitMenuItem = new JMenuItem("退出");
JCheckBoxMenuItem loopMenuItem= new JCheckBoxMenuItem("循环");
JMenuItem aboutMenuItem = new JMenuItem("关于");

JLabel status = new JLabel("欢迎使用视频播放系统");
JPanel mediaPanel = new JPanel();

Player player;
Component visualcom, controlcom;
boolean first = true, loop = false;
String currentDirectory="d:/music";//记录所选媒体文件位置

JInternalFrame min;
public MediaPlayer(JInternalFrame mi){
min=mi;
setLayout(new BorderLayout());

setBackground(Color.lightGray);
setLocale(new java.util.Locale("zh", "CN", ""));

mediaPanel.setToolTipText("视频窗口");
mediaPanel.setVerifyInputWhenFocusTarget(true);
mediaPanel.setLayout(new BorderLayout());

status.setToolTipText("状态栏");
mainMenu.setToolTipText("菜单栏");

fileMenu.add(openMenuItem);
openMenuItem.addActionListener(new OpenFile(this));
fileMenu.add(exitMenuItem);
exitMenuItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
min.dispose ();
player.stop();
return;
}
});
playMenu.add(loopMenuItem);
loopMenuItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
loop = !loop;
}
});
helpMenu.add(aboutMenuItem);
aboutMenuItem.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
//显示"关于"窗口
About dlg = new About();

Dimension dlgSize = dlg.getPreferredSize();
Dimension frmSize = getSize();
Point loc = getLocation();
dlg.setLocation((frmSize.width - dlgSize.width) / 2 + loc.x,
(frmSize.height - dlgSize.height) / 2 + loc.y);
dlg.setModal(true);
dlg.pack();
dlg.setVisible(true);
}
});
mainMenu.add(fileMenu);
mainMenu.add(playMenu);
mainMenu.add(helpMenu);

status.setBorder(BorderFactory.createLoweredBevelBorder());
status.setOpaque(true);
status.setIcon(new ImageIcon(baseitem.MediaPlayer.class.getResource("logo.png")));

add(mainMenu,BorderLayout.NORTH);
add(mediaPanel, BorderLayout.CENTER);
add(status, BorderLayout.SOUTH);

}

public void controllerUpdate (ControllerEvent e){
// 调用player.close()方法时ControllerClosedEvent事件发生
// 如果存在视觉组件,则该组件件应该拆除(为一致起见,
// 我们对控制面板组件也执行同样的操作)
if(e instanceof ControllerClosedEvent){
if(visualcom != null){
mediaPanel.remove(visualcom);
visualcom = null;
}
if(controlcom != null){
mediaPanel.remove(controlcom);
controlcom = null;
}
return;
}

//如播放结束则EndOfMediaEvent事件发生,检查是否为循环播放
//如是则调用播放器start()方法继续播放
if(e instanceof EndOfMediaEvent){
if(loop){
player.setMediaTime(new Time(0));
player.start();
}
return;
}
if(e instanceof PrefetchCompleteEvent){
player.start();
return;
}
if(e instanceof RealizeCompleteEvent){
visualcom = player.getVisualComponent();
if(visualcom != null)
mediaPanel.add(visualcom, BorderLayout.CENTER);
controlcom = player.getControlPanelComponent();
if(controlcom != null)
mediaPanel.add(controlcom, BorderLayout.SOUTH);
}
min.pack();
}

//用于处理"打开"菜单项的类
class OpenFile implements ActionListener{
MediaPlayer mp;
public OpenFile(MediaPlayer mp){
this.mp=mp;
}
public void actionPerformed(ActionEvent e) {
//构造文件选择组件实例并设置其属性
JFileChooser fd=new JFileChooser();
fd.setSelectedFile(new File(currentDirectory));
fd.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result=fd.showOpenDialog(min);

// 如果用户放弃选择文件,则返回
if(result==JFileChooser.CANCEL_OPTION)
return;
currentDirectory = fd.getSelectedFile().toString();
if (player != null)
player.close();
try {
player = Manager.createPlayer(new MediaLocator("file:"+currentDirectory));
}
catch (java.io.IOException e2) {
System.out.println(e2);
return;
}
catch (NoPlayerException e2) {
System.out.println("不能找到播放器.");
return;
}
if (player == null) {
System.out.println("无法创建播放器.");
return;
}

first = false;
min.setTitle("播放文件位置 " + currentDirectory);

//为播放组件注册监听器
player.addControllerListener (mp);
player.prefetch();
}
}
}

㈦ JAVA下如何实现语音通信的功能 新手求教 谢谢

我做过SIP的开发.sip是一种类似http的协议,比H323简单多了.特别适合JAVA开发.

准备工具:java环境,开发工具eclipse等,测试工具ethereal必要的.

SIP:会话初始化协议(Session Initiation Protocol)
会话初始化协议(SIP)是一种应用层控制协议,它可用来创建、修改或终止多媒体会话,如因特网电话呼叫。 SIP 能够邀请参与者加入已存在的会话,如组播会议。现有的会话中可以添加或删除媒体。 SIP 支持名称映射和重定向服务,其支持用户移动性。不管用户网络位置在哪,用户只需维持单一外部可视标识符。

SIP 在五个方面支持创建和终止多媒体通信:

用户定位:决定用于通信的终端系统的确定;
用户可用性:决定被叫方是否愿意加入通信;
用户能力:媒体和媒体参数的确定;
呼叫建立:“响铃“,主叫方和被叫方的会话参数的建立;
呼叫管理:包括传输和终止会话、修改呼叫参数和调用服务。
SIP 可以结合其它 IETF 协议来建立完善的多媒体结构,如提供实时数据传输和服务质量(QOS)反馈的实时传输协议(RTP)、提供流媒体发送控制的实时流协议(RTSP)、为公用交换电话网络(PSTN)提供网关控制的媒体网关控制协议(MEGACO),以及描述多媒体会话的会话描述协议(SDP)。因此, SIP 需要与其它协议协同作用来为用户提供完善的服务。然而 SIP 的基本功能和操作并不依赖于这些协议。

SIP 提供了一组安全服务,包括防止拒绝服务攻击、认证(用户对用户和代理对用户)、完整性保护和加密及隐私服务。

SIP 同时支持 IPv4 and IPv6 。关于因特网电话会话, SIP 做如下工作:

通过 SIP 地址识别主叫方和被叫方。当建立一个 SIP 呼叫时,主叫方首先定位适合的服务器,然后发出一个 SIP 请求。最通常的 SIP 行为是邀请。 SIP 请求会被代理重定向或者触发一系列的新 SIP 请求,而不是直接到达目的被叫方。用户可以通过 SIP 服务器注册他们的位置。 SIP 地址 (URL) 可以嵌入到网页中,因此只要点击一下就可以和对方建立呼叫会话。

㈧ java 控制打印机实现打印 String【】aa 字符串的数据

/**
* 这是一部分代码
*/
package com.mqney.barcode.tsc.templet;

import ookj.ui.pub.messagedailog.MessageDailog;

import com.mqney.barcode.tsc.TscBarcode;
import com.mqney.barcode.tsc.TscClearbuffer;
import com.mqney.barcode.tsc.TscCloseport;
//import com.mqney.barcode.tsc.TscSendcommand;
import com.mqney.barcode.tsc.TscWindowsfont;
import com.mqney.barcode.tsc.impl.TscBarcodeDefault;
import com.mqney.barcode.tsc.impl.TscOpenportDefault;
import com.mqney.barcode.tsc.impl.TscPrintlabelDefault;
import com.mqney.barcode.tsc.impl.TscSetupDefault;
import com.mqney.barcode.tsc.impl.TscWindowsfontDefault;
import com.mqney.barcode.util.ReadTscProperties;
import com.mqney.barcode.util.RunTscDllFunction;
import com.mqney.barcode.util.TextToParagraph;

/**
* @author pinkfloyd
*
*/
public class SonqaoReportPrint {
public void init(SonqaoReportBean[] srbs){
try{if(srbs==null||srbs.length==0){
return;
}
int num = srbs.length;

/**
* DIRECTION可以,RSS、CIRCLE不行。
*/
// TscSendcommand ts = new TscSendcommand("DIRECTION 1,1");
// TscSendcommand ts = new TscSendcommand("RSS 300,300,\"UCC128CCC\",270,2,2,25,\"1234567890|ABCDEFG\"");
// TscSendcommand ts = new TscSendcommand("CIRCLE 40,16,10,2");
// rdf.RunDllFunctionTSC(ts);
for(int i=0; i<num; i++){
SonqaoReportBean srb = srbs[i];
if(srb==null){
continue;
}
RunTscDllFunction rdf = new RunTscDllFunction();
TextToParagraph ttp = new TextToParagraph();
MessageDailog md = new MessageDailog();
TscOpenportDefault tod = new TscOpenportDefault();
ReadTscProperties rtp = new ReadTscProperties();
tod.setPrinter(rtp.getValue(ReadTscProperties.TSC_REPORT_PATH));
rdf.RunDllFunctionTSC(tod);

TscSetupDefault tsd = new TscSetupDefault();
tsd.setLabelWidth("100");
tsd.setLabelHeight("70");
rdf.RunDllFunctionTSC(tsd);
TscClearbuffer tcb = new TscClearbuffer();
rdf.RunDllFunctionTSC(tcb);
TscWindowsfontDefault twd;
twd = new TscWindowsfontDefault(40,16,36,"单位:");
twd.setFontStyle(TscWindowsfont.FONT_STYLE_BOLD);
rdf.RunDllFunctionTSC(twd);
twd = new TscWindowsfontDefault(40,88,36,"姓名:");
twd.setFontStyle(TscWindowsfont.FONT_STYLE_BOLD);
rdf.RunDllFunctionTSC(twd);
twd = new TscWindowsfontDefault(40,152,36,"信息:");
twd.setFontStyle(TscWindowsfont.FONT_STYLE_BOLD);
rdf.RunDllFunctionTSC(twd);
twd = new TscWindowsfontDefault(40,216,36,"部门:");
twd.setFontStyle(TscWindowsfont.FONT_STYLE_BOLD);
rdf.RunDllFunctionTSC(twd);

String[] s0 = ttp.textToParaVoid(srb.getGongsi(), 40);
if(s0==null||s0.length==0){
md.showWarningMessage("getGongsi");
}else{
int num0 = s0.length;
for(int j=0; j<num0; j++){
twd = new TscWindowsfontDefault(140,16+(j*32),32,s0[j]);
// twd.setFontUnderline(TscWindowsfont.FONT_UNDERLINE_WITH);
rdf.RunDllFunctionTSC(twd);
}
}

twd = new TscWindowsfontDefault(140,80,40,srb.getXingming());
rdf.RunDllFunctionTSC(twd);

String[] s2 = ttp.textToParaVoid(srb.getXinxi(), 40);
if(s2==null||s2.length==0){
md.showWarningMessage("getXinxi");
}else{
int num2 = s2.length;
for(int j=0; j<num2; j++){
twd = new TscWindowsfontDefault(140,152+j*32,32,s2[j]);
// twd.setFontUnderline(TscWindowsfont.FONT_UNDERLINE_WITH);
rdf.RunDllFunctionTSC(twd);
}
}

String[] s3 = ttp.textToParaVoid(srb.getBumen(), 40);
if(s3==null||s3.length==0){
md.showWarningMessage("getBumen");
}else{
int num3 = s3.length;
for(int j=0; j<num3; j++){
twd = new TscWindowsfontDefault(140,216+j*32,32,s3[j]);
// twd.setFontUnderline(TscWindowsfont.FONT_UNDERLINE_WITH);
rdf.RunDllFunctionTSC(twd);
}
}

TscBarcodeDefault tbd;
tbd = new TscBarcodeDefault("216","360","48",srb.getBarcode());
tbd.setNarrowBarRatioX(TscBarcode.NARROW_BARRATIO_3);
tbd.setNarrowBarRatioY(TscBarcode.NARROW_BARRATIO_3);
rdf.RunDllFunctionTSC(tbd);

twd = new TscWindowsfontDefault(160,500,32,srb.getSonqao());
rdf.RunDllFunctionTSC(twd);

TscPrintlabelDefault tpd = new TscPrintlabelDefault();
tpd.setLabelCopies("1");
tpd.setLabelSets("1");
rdf.RunDllFunctionTSC(tpd);
TscCloseport tc = new TscCloseport();
rdf.RunDllFunctionTSC(tc);
}

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

㈨ JAVA怎么使用RTP发送数据

Socket 来发送
RTP 用的是是UDP协议

㈩ 怎么用java实现一个简单的播放器

用java实现播放器 主要用到java里的媒体框架,即JMF, JMF实际上是Java的一个类包。JMF 2.1.1技术提供了先进的媒体处理能力,从而扩展了Java平台的功能。这些功能包括:媒体捕获、压缩、流转、回放,以及对各种主要媒体形式和编码的支 持,如M-JPEG、H.263、MP3、RTP/RTSP (实时传送协议和实时流转协议)、Macromedias Flash、IBM的HotMedia和Beatniks的Rich Media Format (RMF)等。JMF 2.1.1还支持广受欢迎的媒体类型,如Quicktime、Microsofts AVI和MPEG-1等。此外,JMF 2.1.1软件中包括了一个开放的媒体架构,可使开发人员灵活采用各种媒体回放、捕获组件,或采用他们自己的定制的内插组件。 我当初也做过类似的东西(本科实习时),给你个具体教程链接吧: http://hi..com/samxx8/blog/item/90532ba4d13fcdf69052ee5c.html

热点内容
arm编译添加驱动 发布:2024-05-21 02:02:28 浏览:475
安卓设置页面是怎么 发布:2024-05-21 01:32:51 浏览:520
学生成绩管理系统数据库设计 发布:2024-05-21 01:14:41 浏览:42
我的世界什么指令直接出现服务器 发布:2024-05-21 01:10:00 浏览:397
星等算法 发布:2024-05-21 00:53:06 浏览:509
李兴华的java视频 发布:2024-05-21 00:49:55 浏览:605
数据库4种索引类型 发布:2024-05-21 00:47:29 浏览:241
给服务器添加另一个ip 发布:2024-05-21 00:40:37 浏览:821
搭建ftp服务器出现微软蓝屏 发布:2024-05-21 00:35:18 浏览:369
ftp怎么加照片 发布:2024-05-21 00:14:37 浏览:623