西安邮电大学Socket网络编程_第1页
西安邮电大学Socket网络编程_第2页
西安邮电大学Socket网络编程_第3页
西安邮电大学Socket网络编程_第4页
西安邮电大学Socket网络编程_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高级 Internet实验报告题目:Socket 网络编程学生姓名 :班级:软件 1202 班学号:指导老师:王文浪成绩:西安邮电大学计算机学院2015年4月27日一、实验目的 熟悉 Socket网络编程 熟悉 CS 客户机模式 熟悉 ServerSocket编写服务端熟悉使用多 线程机制处理业务了解客户机之间通信方式二、实验内容及要求采用 CS 模式,通过客户机向服务器端发送消息;采用 Socket来实现客户机之间的网络通信;通过 ServerSocket创建服务端来处理接受客 户机请求;通过多线程方式来 处理客户机之间的通信请求;实现通信的界面窗口; 实验内容有发送私聊消息、向选中用户发送

2、文件、用户接受文件。三、实验过程1.首先学习了在 JAVA 语言中 TCP/IP 协议下的 Socket网络模式图如 1.1 所示图 1.1TCP/IP 协议下的 Socket 网络模式图由图 1.1 可以得到,Socket 通信的步 骤如下:(1)在服务器端创建一个 ServerSocket对象并且指定端口号。(2)运行 ServerSocket的 accept()方法,等候客户端的请求。(3)客户端创建一个 Socket 对象,指定计算机的地址和端口号,向服务器端发出连接请求。(4)服务器端接收到来自客 户端的请求后,创建 Socket 对象与客户端建立连接。(5)服务器端和客 户端分别建

3、立输入输出流进行数据传输 。(6)通信结束后,服务器端和客 户端分别关闭相应的 Socket 连接。(7)服务器端程序运行 结束后,调用 ServerSocket对象的 close()方法停止等待客 户端请求。由此可以看出,对于一个网 络通信程序来 说,需要编写服务器端和客 户端两个程序才能 够实现相互通信,为了实现一个服务端程序能够对多个客户进行服务,需要使用到多线程,在服务器端创建客户请求的监听线程,一旦客户发起请求连接,在服务器端创建用于服务的 Socket,利用改 Socket 完成与客 户的通信,即每个线程针对一个客户进行服务,数据传输结束后,终止运行该 Socket 通信的线程,继

4、续在服务器端指定的端口 进行监听。2.数据报的通信的 发送和接收 过程:应用程序的工作流程如下:1()首先要建立数据报通信的 Socket,我们可以通过创建一个DatagramSocket对象实现它,在Java中 DatagramSocket类有如下两种构造方法:public DatagramSocket() 构造一个数据 报 socket,并使其与本地主机任一可用的端口连接。若打不开 socket则抛出 SocketException异常。public DatagramSocket(int port) 构造一个数据 报,并使其与本地主机指定的端口 连接。若打不开 socket或 socket

5、无法与指定的端口连接则抛出 SocketException异常。2()创建一个数据 报文包,用来实现无连接的包传送服务。每个数据报文包用 DatagramPacket类创建,DatagramPacket对象封装了数据报包数据、包长度、目标地址和目 标端口。客户端要发送数据报文包,要调用 DatagramPacket类以如下形式的构造 创建DatagramPacket对象,将要发送的数据和包文目的地址信息放入 对象之中。DatagramPacket(byte bufferedarray,int length,InetAddress address,int port)即构造一个包长度为 lengt

6、h 的包传送到指定主机指定端口号上的数据 报文包,参数 length 必须小于等于 bufferedarry.length。DatagramPacket类提供了 4 个类获取信息:public byte getData() 返回一个字 节数组,包含收到或要发送的数据报中的数据。public int getLength() 返回发送或接收到的数据的 长度。public InetAddress getAddress() 返回一个 发送或接收此数据报包文的机器的 IP 地址。public int getPort() 返回发送或接收数据 报的远程主机的端口号。3()创建完 DatagramSocket

7、和 DatagramPacket对象,就可以发送数据报文包了。发送是通过调用 DatagramSocket对象的 send方法实现,它需要以 DatagramPacket对象为参数,将刚才封装进DatagramPacket对象中的数据 组成数据报发出。4()当然,我们也可以接收数据 报文包。为了接收从服 务器返回的结果数据报文包,我们需要创建一个新的 DatagramPacket对象,这就需要用到 DatagramPacket的另一种构造方式 DatagramPacket (byte bufferedarray,int length),即只需指明存放接收的数据报的缓冲区和长度。调用 Datag

8、ramSocket对象的 receive()方法完成接收数据报的工作,此时需要将上面 创建的 DatagramPacket对象作为参数,该方法会一直阻塞直到收到一个数据 报文包,此时 DatagramPacket的缓冲区中包含的就是接收到的数据,数据 报文包中也包含 发送者的 IP 地址,发送者机器上的端口号等信息。5()处理接收内的数据,获取服务结果。6()当通信完成后,可以使用 DatagramSocket对象的 close()方法关闭数据报通信 Socket。当然,Java会自动关闭 Socket,释放DatagramSocket和 DatagramPacket所占用的 资源。但是作为一

9、种良好的习惯,还是要显式地予以关 闭。3.DatagramSocket 类详解Java使用 DatagramSocket代表 UDP 协议的 Socket,DatagramSocket本身只是 码头,不能产生 IO 流,它的唯一作用就是接收和发送数据报,Java使用 DatagramPacket来代表数据 报,DatagramSocket接收和发送的数据都是通 过 DatagramPacket对象完成的。DatagramSocket():创建一个 DatagramSocket实例,并将该对象绑定到本机默 认 IP 地址、本机所有可用端口中随机 选择的某个端口。DatagramSocket(in

10、t prot):创建一个 DatagramSocket实例,并将该对象绑定到本机默 认 IP 地址、指定端口。DatagramSocket(int port, InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定 IP 地址、指定端口。通过上面三个构造器中的任意一个构造器即可 创建一个DatagramSocket实例,通常在创建服务器时,创建指定端口的DatagramSocket实例-这样保证其他客户端可以将数据 发送到该服务器。一旦得到了 DatagramSocket实例之后,就可以通过如下两个方法来接收和 发送数据。receive(Datag

11、ramPacket p):从该 DatagramSocket中接收数据 报。send(DatagramPacket p):以该 DatagramSocket对象向外发送数据报。从上面两个方法可以看出,使用 DatagramSocket发送数据报时,DatagramSocket并不知道将 该数据报发送到哪里,而是由DatagramPacket自身决定数据 报的目的地。就像码头并不知道每个集装箱的目的地,码头只是将这些集装箱 发送出去,而集装箱本身包含了该集装箱的目的地。DatagramPacket的构造器:DatagramPacket(byte buf,int length):以一个空数组来创建

12、DatagramPacket对象,该对象的作用是接收 DatagramSocket中的数据。DatagramPacket(byte buf, int length, InetAddress addr, int port):以一个包含数据的数 组来创建 DatagramPacket对象,创建该DatagramPacket对象时还指定了 IP 地址和端口 -这就决定了 该数据报的目的地。DatagramPacket(byte buf, int offset, int length):以一个空数组来创建 DatagramPacket对象,并指定接收到的数据放入 buf 数组中时从offset 开始,

13、最多放 length 个字节。DatagramPacket(byte buf, int offset, int length, InetAddressaddress, int port):创建一个用于 发送的 DatagramPacket对象,指定发送 buf 数组中从 offset 开始,总共 length 个字节。当 Client/Server 程序使用 UDP 协议时,实际上并没有明 显的服务器端和客 户端,因为两方都需要先建立一个 DatagramSocket对象,用来接收或 发送数据报,然后使用 DatagramPacket对象作为传输数据的载体。通常固定 IP 地址、固定端口的 D

14、atagramSocket对象所在的程序被称为服务器,因为该 DatagramSocket可以主动接收客户端数据。在接收数据之前,应该采用上面的第一个或第三个构造器生成一个 DatagramPacket对象,给出接收数据的字 节数组及其长度。然后调用 DatagramSocket 的 receive()方法等待数据 报的到来,receive()将一直等待(该方法会阻塞 调用该方法的线程),直到收到一个数据报为止。如下代码所示:/ 创建一个接收数据的 DatagramPacket对象DatagramPacketpacket=new DatagramPacket(buf, 256);/ 接收数据

15、报socket.receive(packet);在发送数据之前,调用第二个或第四个构造器 创建DatagramPacket对象,此时的字节数组里存放了想 发送的数据。除此之外,还要给出完整的目的地址,包括 IP 地址和端口号。发送数据是通过 DatagramSocket的 send()方法实现的,send()方法根据数据 报的目的地址来 寻径以传送数据报。如下代码所示:/ 创建一个发送数据的 DatagramPacket对象DatagramPacketpacket = new DatagramPacket(buf, length, address, port);/ 发送数据报socket.se

16、nd(packet);使用 DatagramPacket接收数据 时,会感觉 DatagramPacket设计得过于烦琐 。开发者只关心 该 DatagramPacket能放多少数据,而DatagramPacket是否采用字 节数组来存储数据完全不想关心。但 Java 要求创建接收数据用的 DatagramPacket时,必须传入一个空的字 节数组,该数组的长度决定了 该 DatagramPacket能放多少数据,这实际上暴露了 DatagramPacket的实现细节 。接着DatagramPacket又提供了一个 getData()方法,该方法又可以返回 Datagram Packet对象里

17、封装的字节数组,该方法更显得有些多余 -如果程序需要 获取DatagramPacket里封装的字 节数组,直接访问传给 DatagramPacket构造器的字 节数组实参即可,无须调用该方法。当服务器端(也可以是客户端)接收到一个 DatagramPacket对象后,如果想向 该数据报的发送者反馈一些信息,但由于 UDP 协议是面向非连接的,所以接收者并不知道每个数据 报由谁发送过来,但程序可以调用 DatagramPacket的如下 3 个方法来 获取发送者的 IP 地址和端口。InetAddress getAddress():当程序准备发送此数据 报时,该方法返回此数据 报的目标机器的 I

18、P 地址;当程序刚接收到一个数据 报时,该方法返回 该数据报的发送主机的 IP 地址。int getPort():当程序准备发送此数据 报时,该方法返回此数据 报的目标机器的端口;当程序刚接收到一个数据 报时,该方法返回 该数据报的发送主机的端口。SocketAddress getSocketAddress():当程序准备发送此数据 报时,该方法返回此数据 报的目标 SocketAddress;当程序刚接收到一个数据报时,该方法返回 该数据报的发送主机的 SocketAddress。getSocketAddress()方法的返回 值是一个 SocketAddress对象,该对象实际上就是一个 IP 地址和一个端口号。也就是 说,SocketAddress对象封装了一个 InetAddress对象和一个代表端口的整数,所以使用SocketAddre

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论