第9章 网络多媒体应用.docx
- 文档编号:7582643
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:40
- 大小:163.95KB
第9章 网络多媒体应用.docx
《第9章 网络多媒体应用.docx》由会员分享,可在线阅读,更多相关《第9章 网络多媒体应用.docx(40页珍藏版)》请在冰豆网上搜索。
第9章网络多媒体应用
第九章网络多媒体应用
9.1网络编程基础(URL编程和Socket编程)
9.1.1URL编程
URL(UniformResourceLocator,统一资源定位器)用于表示Internet上资源的地址,即网络上数据的位置.资源为文件,目录,对象的引用.利用URL的表示和建立,Java程序可直接读入网络上的数据,或把数据传送到网络的另一端.J包定义了对应的URL类.其常用4个构造方法如下:
(1)publicURL(Stringspec);//这个构造方法用指定的URL来创建URL对象,参数为URL的IP地址和文件如:
try{URLu1=newURL("}
catch(MalformedURLExceptione){…….}
(2)publicURL(URLcontext,Stringspec);//该构造方法用已存在的URL对象的context创建URL对象例如:
try{URLu2=newURL(u1,welcome.html);}
catch(MalformedURLExceptione){…….}
(3)publicURL(Stringprotocol,Stringhost,Stringfile);//该构造方法用指定的协议,主机名,路经及文件名创建的URL对象例如:
try{URLu3=newURL("http","","index.html");}
catch(MalformedURLExceptione){…….}
(4)publicURL(Stringprotocol,Stringhost,intport,Stringfile);//该构造方法用指定的协议,主机名,端口号,文件路经及文件名创建的一个URL对象例如:
try{URLu3=newURL("http","",8080,"index.html");}
catch(MalformedURLExceptione){…….}
使用URL类的openStream()方法可以连接和获取URL对象的内容(即返回一个输入流对象读URL数据)方法格式为:
publicfinalInputStreamopenStream()throwsIOException
URL类的常用方法:
publicfinalObjectgetContent()----取的传输协义.
publicStringgetFile()----取的资源文件名.
publicStringgetHost()----取的主机名.
publicStringgetPort()----取的端口号.
publicStringgetProtocol()----取的传输协义.
publicStringtoString()----用于把URL转化为字符串.
例:
URL编程读取yahoo站点地址的内容
importjava.io.*;
import.*;
classURLReader{
publicstaticvoidmain(Stringargs[]){
try{
//用指定的URL来创建URL对象
URLtirc=newURL("
//创建缓冲区输入流
BufferedReaderin=newBufferedReader(newInputStreamReader(tirc.openStream()));
Strings;//接收数据的字符串变量s
while((s=in.readLine())!
=null)
System.out.println(s);
in.close();//关闭BufferedReader输入流.
}catch(MalformedURLExceptione){//捕捉URL缺陷异常
System.out.println(e);//输出缺陷异常信息
}catch(IOExceptione){//捕捉I/O异常
System.out.println(e);
}
}
}
tirc.openStream()//用创建URL对象tirc的openStream()方法建立到当前URL()的连接并返回一个从该连接地址读取数据的输入流对象
InputStreamReader(InputStreamin)//从字节流到字符流的桥梁:
它读取字节流并转为字符流.in一个输入流由tirc.openStream()代表输入流,并用new创建字节流转为字符流对象
BufferedReader(Readerinintsz)//构造方法参数in—阅读器,sz—输入缓冲区大小.本例创建一个缓冲字符输入流对象,用in引用它,输入缓冲区大小为默认.再调用它的读入行方法将字符流赋给(存入)变量s中,再输出字符流.
9.1.2Socket编程
套接字(Socket)是由伯克利大学首创的.它允许程序把网络连接当成一个流,可以在这个流中读取字节.包中定义的两个类Socket(Client端套接字)和ServerSocket(Server端套接字),分别用java的流模型技术来实现客户端和服务器端或两台计算机之间的网络通信,当套接字连接建立后,也就是一条通信线路被建立起来了.
Socket通信模型如下图:
套接字能执行7种基本操作:
(1)连接到远程计算机
(2)绑定到端口
(3)接收从远程计算机来的绑定端口上的连接
(4)监听到达的数据
(5)发送数据
(6)接收数据
(7)关闭连接.
客户端:
常用套接字Socket类构造方法
1.publicSocket(Stringhost,intport)throwsunknownHostException,IOException//建立一个IP地址代表的服务器主机host,端口号为port的套接字(0~1023为通信口,一般用1024~65535口),连接到服务器上,例如.
Try{Socketsoc=newSocket("",80);}//发送数据(http:
占用80口)
catch(unknownHostExceptionuex){}catch(IOExceptione){}
2.Socket类常用方法
(1)publicInetAddressgetInetAddress()//调用Socket对象的getInetAddress()方法,返回连接到远程主机的IP地址,如果连接失败,则返回以前连接的主机.例如:
Try{Socketsoc=newSocket("",80);
InetAddresshost=soc.getInetAddress();}
catch(unknownHostExceptionuex){}catch(IOExceptione){}
(2)publicintgetPort():
//返回Socket连接到远程主机的端口号,例如:
try{Socketsocket=newSocket("",80);
intport=socket.getPort();}
catch(unknownHostExceptionuex){}catch(IOExceptione){}
(3)publicintgetLocalPort():
//一个Socket连接两个终端,返回本地连接终端的端口号.
(4)publicInetAddressgetLocalAddress():
//返回用户Socket绑定在网络哪个接口地址.
(5)publicOutputStreamgetOutputStream()throwsIOException:
//返回一个原始的输出流
(6)publicInputStreamgetInputStream()throwsIOException:
//返回一个输入出流
服务器端构造方法
1.publicServerSocket(intport)throwsIOException,BindException:
//建立一个绑定在端口号为port的服务器套接字对象.
网络编程4个步骤:
(1)创建Socket
(2)打开连接到Socket的输入/输出流
(3)按照一定的协议对Socket进行读写操作
(4)关闭Socket.
j3_35.java
(1)服务器端程序(在DOS下先执行)
import.*;
importjava.io.*;
classTestServer{
publicstaticvoidmain(Stringargs[]){
try{
//创建服务器套接字对象,运行在服务器8888端口上.
ServerSockets=newServerSocket(8888);
while(true){
//ServerSocket对象调用accept()方法在指定8888端口上监听客户端到来的连接(这个端口让客户端程序连接)
Sockets1=s.accept();
//监听器通过getOutputStream()方法获得返回一个原始的输出流
OutputStreamos=s1.getOutputStream();
//包含输出流创建数据输出字节流对象
DataOutputStreamdos=newDataOutputStream(os);
//以UTF编码格式(写出)返回连接的远程主机(客户端)的地址,和客户端发出请求的端口号1032.
dos.writeUTF("Hello,"+s1.getInetAddress()+"port#"+s1.getPort()+"\nbye!
");dos.close();//关闭输出字节流对象
s1.close();//关闭服务器套接字对象
}
}catch(IOExceptione){
System.out.println("程序运行出错:
"+e);
}
}
}
j3_36.java
(2)客户端程序(使用JCreator执行)
import.*;
importjava.io.*;
classTestClient{
publicstaticvoidmain(Stringargs[]){
try{
//创建客户端套接字对象实现与本地服务器(IP地址127.0.0.1),连接服务器端口8888.
Sockets1=newSocket("127.0.0.1",8888);
//套接字对象通过getInputStream()方法获得一个输入流读取服务器放入(线路输出流)的数据
InputStreamis=s1.getInputStream();
//包含字节输入流创建数据输入字节流对象
DataInputStreamdis=newDataInputStream(is);
//数据输入流对象以UTF编码格式读入服务器发出的输出流数据并在客户端显示
System.out.println(dis.readUTF());
dis.close();//关闭输入字节流对象
s1.close();//关闭Socket
}catch(ConnectExceptionconnExc){
System.err.println("服务器连接失败!
");
}catch(IOExceptione){
}
}
}
【例11.5】Client.java
(1)客户端程序:
importjava.io.*;
import.*;
publicclassClient
{publicstaticvoidmain(Stringargs[])
{Strings=null;
Socketmysocket;
DataInputStreamin=null;//声明数据输入流对象
DataOutputStreamout=null;//声明数据输出流对象
try{
mysocket=newSocket("127.0.0.1",4331);//声明客户端套接字对象,连接服务器通信端口为4331
//创建客户端数据输入流对象读取服务器端输出流
in=newDataInputStream(mysocket.getInputStream());
//创建客户端数据输出流对象放入服务器端线路输入流中
out=newDataOutputStream(mysocket.getOutputStream());
for(intk=1;k<100;k=k+2)
{out.writeUTF(""+k);//向服务器端发送奇数
s=in.readUTF();//in读取服务器端输出流发来的信息,堵塞状态
System.out.println("客户收到:
"+s);//输出服务器端发来的信息
Thread.sleep(500);
}
}
catch(Exceptione)
{System.out.println("服务器已断开"+e);
}
}
}
【例11.5】Server.java
(2)服务器端程序
importjava.io.*;
import.*;
publicclassServer
{publicstaticvoidmain(Stringargs[])
{ServerSocketserver=null;//声明服务器套接字对象
Socketyou=null;//声明连接客户端监听器对象引用变量
Strings=null;//声明接收客户端输入流数据字符串
DataOutputStreamout=null;//声明输出流对象
DataInputStreamin=null;//声明输入流对象
try{server=newServerSocket(4331);//创建服务器套接字对象,使用服务器4331端口
}
catch(IOExceptione1)
{System.out.println(e1);
}
try{System.out.println("等待客户呼叫");
you=server.accept();//堵塞状态等待客户呼叫,除非有客户呼叫(取的客户端连接)
out=newDataOutputStream(you.getOutputStream());//包含客户端连接输出流创建输出流对象
in=newDataInputStream(you.getInputStream());//包含客户端连接输入流创建输入流对象
while(true)
{s=in.readUTF();//in读取客户输出流放入"线路"里的奇数信息,堵塞状态
intm=Integer.parseInt(s);//转换为整数赋给变量m
out.writeUTF("你好:
我是服务器");
//服务器端将2*m后放入输出流由客户端输入流读取
out.writeUTF("你说的数是乘2后是:
"+2*m);
System.out.println("服务器收到:
"+s);//服务器端输出收到客户端的奇数信息
Thread.sleep(500);
}
}
catch(Exceptione)
{System.out.println("客户已断开"+e);
}
}
}
【例11.6】
(1)Client1.java客户端程序:
import.*;
importjava.io.*;
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
publicclassClient1
{publicstaticvoidmain(Stringargs[])
{newComputerClient();//创建计算三角形面积窗口对象
}
}
//定义ComputerClient子类继承窗口类,实现Runnable,ActionListener接口
classComputerClientextendsFrameimplementsRunnable,ActionListener
{Buttonconnection,send;//声明连接和发送按钮对象
TextFieldinputText,showResult;//声明2个文本框对象用来输入三角形三边长和显示面积结果
Socketsocket=null;//声明客户端Socket对象
DataInputStreamin=null;//声明DataInputStream对象
DataOutputStreamout=null;//声明DataOutputStream对象
Threadthread;//声明Thread对象
ComputerClient()//构造函数
{socket=newSocket();//创建客户端Socket对象
setLayout(newFlowLayout());//设置窗口为流布局
Boxbox=Box.createVerticalBox();//创建立式盒式容器对象
connection=newButton("连接服务器");//创建连接和发送按钮对象
send=newButton("发送");
send.setEnabled(false);//设置发送按钮对象不可用
inputText=newTextField(12);//创建2个文本框对象
showResult=newTextField(12);
box.add(connection);//将连接按钮添加到盒式容器中
box.add(newLabel("输入三角形三边的长度,用逗号或空格分隔:
"));//添加标签到盒式容器中
box.add(inputText);//添加输入文本框到盒式容器中
box.add(send);//添加发送按钮对象到盒式容器中
box.add(newLabel("收到的结果:
"));//添加标签到盒式容器中
box.add(showResult);//添加显示文本框到盒式容器中
connection.addActionListener(this);//注册连接和发送按钮监听器
send.addActionListener(this);
thread=newThread(this);//创建线程对象
add(box);//添加盒式容器到窗体容器中
setBounds(10,30,300,400);//设置窗体在屏幕中的大小和显示位置
setVisible(true);//设置组件可见
validate();
addWindowListener(newWindowAdapter()//包含适配器注册窗口监听器
{publicvoidwindowClosing(WindowEvente)
{System.exit(0);
}
});
}
publicvoidactionPerformed(ActionEvente)
{if(e.getSource()==connection)//如果事件源来自连接按钮
{try//请求和服务器建立套接字连接:
{if(socket.isConnected())//如果和服务器连接为真就不需建立套接字连接
{}
else//否则就和服务器建立套接字连接
{InetAddressaddress=InetAddress.getByName("127.0.0.1");//取得客户端IP地址
//创建InetSocketAddress对象
InetSocketAddresssocketAddress=newInetSocketAddress(address,4331);
socket.connect(socketAddress);//和服务器建立套接字连接
//包含套接字输入流对象创建客户端数据输入流对象
in=newDataInputStream(socket.getInputStream());
//包含套接字输出流对象创建客户端数据输出流对象
out=newDataOutputStream(socket.getOutputStream());
send.setEnabled(true);//和服务器连接成功后设置发送按钮可用
thread.start();//启动线程调用run()方法运行线程体
}
}
catch(IOExceptionee){}
}
if(e.getSource()==send)//如果事件源来自发送按钮
{Strings=inputText.getText();//取得文本框的内容
if(s!
=null)//如果文本内容不为空
{try{out.writeUTF(s);//将内容数据写入流送到服务器,由服务器输入流取得数据
}
catch(IOExceptione1){}
}
}
}
publicvoidrun()//运行线程体
{Strings=null;
while(true)
{try{s=in.readUTF();//读服务器输出流返回的数据
showResult.setText(s);//读回的服务器数据在文本框中显示出来
}
catch(IOExceptione)
{showResult.setText("与服务器已断开");
break;
}
}
}
}
【例11.6】
(2)Server1.java服务器端程序
importjava.io.*;
import.*;
importjava.util.*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9章 网络多媒体应用 网络 多媒体 应用