iPhone8发布后如何在在位时间最短的皇帝时间内以原价购得

&&&&&&&&&&&&&&&&&&
posts - 39,comments - 11,trackbacks - 0
、传输层存在的必要性
由于网络层的分组传输是不可靠的,无法了解数据到达终点的时间,无法了解数据未达终点的状态。因此有必要增强网络层提供服务的服务质量。
、引入传输层的原因
&&&&&& 面向连接的传输服务与面向连接的网络服务类似,都分为建立连接、数据传输、释放连接三个阶段;编址、寻址、流控制也是类似的。无连接的传输服务与无连接的网络服务也非常类似。一个很显然的问题:既然传输层的服务与网络层的服务如此相似,那么为什么我们还要两个独立的层呢?
&&&&& 原因在于:传输层的代码完全运行在用户的机器上,但是网络层主要运行在由承运商控制的路由器上。试想以下几种情况?
&&&&&& 网络层提供的服务不够用;
&&&&&& 频繁的丢失分组;
&&&&&& 路由器时常崩溃。
&&&&&& 用户在网络层上并没有真正的控制权,所以他们不可能用最好的路由器或者在数据链路层上用更好的错误处理机制来解决服务太差的问题。唯一的可能是在网络层之上的另一层中提高服务质量。这就是传输层存在的必要性。
&&&&& 传输层的重要性:不仅仅是另外一层,它是整个协议层次的核心所在。如果没有传输层,那么分层协议的整个概念将变得没有意义。
&&&&& 传输层的任务:在源机器和目标机器之间提供可靠的、性价比合理的数据传输服务,并且与当前使用的物理网络完全独立。
、传输层的功能
&&&&&&& 数据传送,不关心数据含义,进程间通信。
&&&&&&& 弥补高层(上3层)要求与网络层(基于下3层)数据传送服务质量间的差异(差错率、差错恢复能力、吞吐率、延时、费用等),对高层屏蔽网络层的服务的差异,提供稳定和一致的界面。
、传输层协议与网络层协议的主要区别
&&&&&& 网络层(层)提供点到点的连接即提供主机之间的逻辑通信,传输层提供端到端的连接&&提供进程之间的逻辑通信。
、传输层的用途
&&&&& 传输层将数据分段,并进行必要的控制,以便将这些片段重组成各种通信流。在此过程中,传输层主要负责:
&&&&&& 跟踪源主机和目的主机上应用程序间的每次通信;
&&&&&& 将数据分段,并管理每个片段;
&&&&&& 将分段数据重组为应用程序数据流;
&&&&&& 标识不同的应用程序。
、端口号的概念
运行在计算机中的进程是用进程标识符来标志的。运行在应用层的各种应用进程却不应当让计算机操作系统指派它的进程标识符。这是因为在因特网上使用的计算机的操作系统种类很多,而不同的操作系统又使用不同格式的进程标识符。为了使运行不同操作系统的计算机的应用进程能够互相通信,就必须用统一的方法对体系的应用进程进行标志。
解决这个问题的方法就是在运输层使用协议端口号,或通常简称为端口。
虽然通信的终点是应用进程,但我们可以把端口想象是通信的终点,因为我们只要把要传送的报文交到目的主机的某一个合适的目的端口,剩下的工作(即最后交付目的进程)就由来完成。
、传输层的主要协议
传输层的两个主要协议都是因特网的重要标准,传输控制协议()、用户数据报协议()。
&&&&&&&&& 传输层的数据流要在网络端点之间建立逻辑连接。如果使用,传输层的首要任务是将数据从源设备传输到目的设备。如果使用,传输层主要通过滑动窗口来提供端到端控制,以及利用确认序列号和确认信息提供可靠性。传输层定义主机应用程序之间端到端的连接。
()可靠的、面向连接的协议(打电话)、传输效率低全双工通信(发送缓存接收缓存)、面向字节流。使用的应用:浏览器;电子邮件、文件传输程序。
()不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用的应用:域名系统;视频流;语音。
问题1:什么是面向连接、面向无连接?
面向连接举例:两个人之间通过电话进行通信。
面向无连接举例:邮政服务,用户把信函放在邮件中期待邮政处理流程来传递邮政包裹。显然,不可达代表不可靠。
&&&&&&& &从程序实现的角度解析面向连接、面向无连接如下:
面向连接,面向无连接(在默认的阻塞模式下):
&&&&&&&& 在协议中,当客户端退出程序或断开连接时,协议的函数会立即返回不再阻塞,因为服务端自己知道客户端已经退出或断开连接,证明它是面向连接的;
&&&&&&& 而在协议中,这个接收函数将会始终保持阻塞,因为服务端自己不知道客户端已经退出或断开连接,证明它是面向无连接的)。
&&&&&& 从上图也能清晰的看出,通信需要服务器端侦听、接收客户端连接请求,等待客户端建立连接后才能进行数据包的收发()工作。
&&&&&&&& 而则服务器和客户端的概念不明显,服务器端即接收端需要绑定端口,等待客户端的数据的到来。后续便可以进行数据的收发()工作。
问题2:什么是面向字节流、面向报文?
&&&&&& 面向字节流:虽然应用程序和的交互是一次一个数据块(大小不等),但把应用程序看成是一连串的无结构的字节流。有一个缓冲,当应用程序传送的数据块太长,就可以把它划分短一些再传送。如果应用程序一次只发送一个字节,也可以等待积累有足够多的字节后再构成报文段发送出去。
&&&&&& 面向报文:面向报文的传输方式是应用层交给多长的报文,就照样发送,即一次发送一个报文。因此,应用程序必须选择合适大小的报文。若报文太长,则层需要分片,降低效率。若太短,会是太小。(谢希仁,第五版。对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。这也就是说,应用层交给多长的报文,就照样发送),即一次发送一个报文)。
问题3:在默认的阻塞模式下,为什么说TCP无边界,UDP有边界?
&&&&&&&& 对于协议,客户端连续发送数据,只要服务端的这个函数的缓冲区足够大,会一次性接收过来,即客户端是分好几次发过来,是有边界的,而服务端却一次性接收过来,所以证明是无边界的;
&&&&&&& 而对于协议,客户端连续发送数据,即使服务端的这个函数的缓冲区足够大,也只会一次一次的接收,发送多少次接收多少次,即客户端分几次发送过来,服务端就必须按几次接收,从而证明,这种的通讯模式是有边界的。
问题4:UDP 如何发送大量的数据?如何处理分包?
&&&&&&& 用 updclient 一次不能发送太大的数据量,不然就会报错:一个在数据报套接字上发送的消息大于内部消息缓冲器或其他一些网络限制,或该用户用于接收数据报的缓冲器比数据报小。但不知道一次到底能发多少字节?如果把一个大的字节数组拆分成若干个字节数组发送,那么接收时如何判断和处理呢?
&&&&&& 答:方法很简单:
1、在客户端将你要发送的内容(文件什么的都可以)分块,每块内容进行编号,然后发送;
2、服务端在接收到你的分块数据以后,根据你的客户端数据内容的编号重新组装;
3、一般我们在发送数据的时候,尽量采用比较小的数据块的方式(我的都没有超过1024的),数据块太大的话容易出现发送和接收的数据时间长,匹配出问题。
问题5.UDP发包的问题
&&&&&& 问:发送两次数据,第一次字节,第二次字节,接包方一次收到是,还是,还是?
&&&&&& 答:是数据报文协议,是以数据包方式,所以每次可以接收,,在理想情况下,第一次是无论多少都是接收到。当然,可能由于网络原因,第二个包先到的话,有可能是了。对可能会由于网络原因乱序,所以可能先收到,所以自定义的协议包头里都要加上一个序列号,标识发送与收包对应。
问题6.TCP的发包问题
&&&&&& 问:同样如果换成第一次发送字节,第二次发送字节,会接收到多少?
&&&&&& 答:是流协议,所以,会收到自己处理好了重传,保证数据包的完整性
问题7.有分片的情况下如下处理
&&&&&&& 问:如果是,使用发送,那么是收到,还是
&&&&&&& 答:还是接收,数据分片由层处理了,放到还是一个完整的包。接收到的包是由路由路径上最少的来分片,注意转到已经在是组装好的组装出错的包会经校验出错而丢弃,是一个完整的数据包。
问题8.分片后的处理
&&&&&& 问:如果那个片丢了怎么办?又没有重传
&&&&&& 答:里有个检验,如果包不完整就会丢弃,也不会通知是否接收成功,所以是不可靠的传输协议,而且不存在这个问题,有自己的重传机制。在内网来说,基本不会有丢包,可靠性还是有保障。当然如果是要求有时序性和高可靠性,还是走,不然就要自己提供重传和乱序处理内网发包处理量可以达
问题9.不同连接到同一个端口的包处理
&&&&&& 问:
同时同一端口
会收到多少?
&&&&& 答:与是一个连接,与又是另一个连接,所以不同,所以分开处理。每个有自己的接收缓冲和发送缓冲
问题10.什么是TCP粘包
&&&&&&& 在应用开发过程中,基于网络传输的应用程序有时会出现粘包现象(即发送方发送的若干包数据到接收方接收时粘成一包)。详细解释如下:由于是流协议,对于一个的包,如发送两次,由于网络原因第一次又分成两次发送,和,如果接包的时候先读取包长度再读入后续数据,当接收得快,发送的慢时,就会出现先接收了会解释错误再接到,也解释错误的情况。这就是的粘包。
在网络传输应用中,通常需要在网络协议之上再自定义一个协议封装一下,简单做法就是在要发送的数据前面再加一个自定义的包头,包头中可以包含数据长度和其它一些信息,接收的时候先收包头,再根据包头中描述的数据长度来接收后面的数据。详细做法是:先接收包头,在包头里指定包体长度来接收。设置包头包尾的检查位(如群空间开头,结束来检查一个包是否完整)。对于来说:)不存在丢包,错包,所以不会出现数据出错)如果包头检测错误,即为非法或者请求,直接重置即可
为了避免粘包现象,可采取以下几种措施。
&&&&&&& 一是对于发送方引起的粘包现象,用户可通过编程设置来避免,提供了强制数据立即传送的操作指令,软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;
&&&&&&& 二是对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;
&&&&&&&& 三是由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。
问题11.图解TCP的3次握手建立连接,4次握手释放连接?
是面向连接的协议。运输连接是用来传送报文的。传输连接的建立和释放是每一次面向连接的通信中必不可少的过程。因此,传输连接就由三个阶段,即:连接建立、数据传送和连接释放。
这里的,表示连接请求报文段;同意建立连接则,,连接后所有的。
三次握手方案解决了由于网络层会丢失、存储和重复分组带来的问题。试想不进行三次握手可能出现的问题?
&&&&&&& 如上图所示,如果仅仅是次握手的话,可能出现的问题如下:
发送的数据包由于网络的原因,出现了滞留,即延时到达了。此时,以为发来了请求,于是就向发送确认报文,以建立连接。而收到报文后,由于其没有向发起建立连接的请求,因此不会理睬的确认,也不会向发送数据。而此时的认为已经建立起连接了,就等待发送的数据,导致的资源白白浪费!
连接释放:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& &&部分内容参考了《计算机网络》、网上查找内容。
阅读(...) 评论()Java中的TCP/UDP网络通信编程
Java中的TCP/UDP网络通信编程
  127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问.
  端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口.
  网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议.
  Socket连接套接字,Java分别为TCP和UDP提供了相应的类,TCP是.ServerSocket(用于服务器端)和.Socket(用于客户端);UDP是.DatagramSocket.
  1,Java编写UDP网络程序
  1.1,DatagramSocket
  DatagramSocket有如下构造方法:
  1,DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。
  2,DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。
  3,DatagramSocket(int port, InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.
  如果在创建DatagramSocket对象时,没有指定网卡的IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.
  发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.
  发送数据使用DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.
  1.2,DatagramPacket
  DatagramPacket类有如下构造方法:
  1,DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为length的数据包。
  2,DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。
  接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.
  1.3,InetAddress
  Java中对IP地址进行包装的类,
  DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.
  1.4,UDP程序例子
  发送程序:
  import .DatagramP
  import .DatagramS
  import .InetA
  public class UdpSend {
  public static void main(String[] args) throws Exception {
  DatagramSocket ds = new DatagramSocket();
  String str = "hello , world!";
  DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.105"),3000);
  ds.send(dp);
  ds.close(); //关闭连接
  接收程序:
  import .DatagramP
  import .DatagramS
  public class UdpRecv {
  public static void main(String[] args) throws Exception {
  DatagramSocket ds = new DatagramSocket(3000);
  byte[] buf = new byte[1024];
  DatagramPacket dp = new DatagramPacket(buf,buf.length);
  ds.receive(dp);
  String str = new String(dp.getData(),0,dp.getLength());
  System.out.println(str);
  System.out.println("IP:" + dp.getAddress().getHostAddress() + ",PORT:" + dp.getPort());
  ds.close();
  测试要先运行接收程序,再运行发送程序.如果接收程序没有接收到数据,则会一直阻塞,接收到数据后才会关闭程序.如果网络上没有数据发送过来,接收程序也没有阻塞,通常都是使用了一个已经被占用的端口.
  2,Java编写TCP网络程序
  2.1,ServerSocket
  编写TCP网络服务程序,首先要用到.ServerSocket类用以创建服务器Socket.它的常用构造方法有:
  1,ServerSocket(int port):创建绑定到特定端口的服务器套接字。
  2,ServerSocket(int port, int backlog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量),创建服务器套接字并将其绑定到指定的本地端口号。
  3,ServerSocket(int port, int backlog, InetAddress bindAddr):使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
  2.2,Socket
  客户端要与服务器建立连接,必须先创建一个Socket对象,它的常用构造方法有:
  1,Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。
  2,Socket(InetAddress address, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
  3,Socket(InetAddress address, int port, InetAddress localAddr, int localPort):创建一个套接字并将其连接到指定远程端口上的指定远程地址。
  4,Socket(String host, int port, InetAddress localAddr, int localPort):创建一个套接字并将其连接到指定远程主机上的指定远程端口。
  对于通常情况的应用,使用第1个构造方法来创建客户端的Socket对象,并与服务器建立连接,是非常简单和方便的.
  服务器端程序调用ServerSocket.accept方法等待客户端的连接请求,一旦accept接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象.建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket.getInputStream返回Socket的输入流对象,Socket.getOutputStream返回Socket的输出流对象.
  2.3,TCP程序例子的服务器程序:
  import java.io.InputS
  import java.io.OutputS
  import .ServerS
  import .S
  public class TcpServer {
  public static void main(String[] args) throws Exception {
  ServerSocket ss = new ServerSocket(8000);
  Socket s = ss.accept();
  InputStream ips = s.getInputStream();
  OutputStream ops = s.getOutputStream();
  ops.write("hello,World!".getBytes());
  byte[] buf = new byte[1024];
  int len = ips.read(buf);
  System.out.println(new String(buf,0,len));
  ips.close();
  ops.close();
  s.close();
  ss.close();
  在这个程序里,创建了一个在8000端口上等待连接的ServerSocket对象,当接收到一个客户的连接请求后,程序从与这个客户建立了连接的Socket对象中获得输入输出流对象,通过输出流首先向客户端发送一串字符,然后通过输入流读取客户端发送过来的信息,并将这些信息打印,然后关闭所有资源.
  要先运行服务器程序,然后才能运行客户端程序,当TCP服务器程序运行到Socket.accpet()方法等待客户连接时,accept方法将阻塞,一直到有客户连接请求到来,该方法才会返回,如果又没有请求到来,又没有发生阻塞,通常都是使用了一个已经被占用的端口.
  我们可以使用windows提供的telnet工具在命令行窗口中测试一下服务器程序:命令如下:telnet localhost 8000
  可以看到,telnet只要有输入就发送,因此我们如果想要在服务器端一次读多个字符的话,还需要进一步处理,看如下代码:
  import java.io.BufferedR
  import java.io.InputS
  import java.io.InputStreamR
  import java.io.OutputS
  import .ServerS
  import .S
  public class TcpServer {
  public static void main(String[] args) throws Exception {
  ServerSocket ss = new ServerSocket(8000);
  Socket s = ss.accept();
  InputStream ips = s.getInputStream();
  BufferedReader br = new BufferedReader(new InputStreamReader(ips)); //对InputStream进行包装,增加了缓存
  OutputStream ops = s.getOutputStream();
  ops.write("hello,World!".getBytes());
  System.out.println(br.readLine());
  br.close(); //关闭包装类,会自动关闭里面的基类
  ops.close();
  s.close();
  ss.close();
  再次使用telnet工具可以看到,这次可以发送不止一个字符了,按回车键后发送数据到服务器端.
  2.4,TCP程序例子改进后的服务器程序:
  大多数情况下,服务器端都要服务多个客户端,但一次accept方法调用只接收一个连接,因此,要把accept方法放在一个循环语句中,这样就可以接收多个连接.每个连接的数据交换代码也放在一个循环中,这样才能保证两者可以不停地交换数据.
  每个连接的数据交换代码必须放在独立的线程中运行,否则,这在段代码运行期间,就没法执行其他的程序代码,accept方法也得不到调用,新的连接无法进入.
  下面是一个例子,客户端向服务器发送一个字符串,服务器将这个字符串中的所有字符反向排列后回送给客户端.客户端输入"quit",退出程序.
  import java.io.BufferedR
  import java.io.DataOutputS
  import java.io.InputS
  import java.io.InputStreamR
  import java.io.OutputS
  import .ServerS
  import .S
  public class TcpServer {
  public static void main(String[] args) throws Exception {
  ServerSocket ss = new ServerSocket(8000);
  while(true){
  Socket s = ss.accept();
  new Thread(new Servicer(s)).start();
  class Servicer implements Runnable{
  public Servicer(Socket s){
  this.s =
  public void run(){
  InputStream ips = s.getInputStream();
  OutputStream ops = s.getOutputStream();
  BufferedReader br = new BufferedReader(new InputStreamReader(ips));
  DataOutputStream dos = new DataOutputStream(ops);
  while(true){
  String strWord = br.readLine();
  if(strWord.equalsIgnoreCase("quit")){
  String strEcho = (new StringBuffer(strWord).reverse().toString());
  dos.writeBytes(strWord + "-------&" + strEcho + System.getProperty("line.separator"));
  br.close();
  dos.close();
  s.close();
  }catch(Exception e){
  e.printStackTrace();
  2.5,TCP程序例子客户端程序:
  import java.io.BufferedR
  import java.io.DataOutputS
  import java.io.InputS
  import java.io.InputStreamR
  import java.io.OutputS
  import .InetA
  import .S
  public class TcpClient {
  public static void main(String[] args) throws Exception{
  if(args.length & 2){
  System.out.println("Usage:java TcpClient ServerIP ServerPort");
  Socket s = new Socket(InetAddress.getByName(args[0]),Integer.parseInt(args[1]));
  InputStream ips = s.getInputStream();
  OutputStream ops = s.getOutputStream();
  BufferedReader brKey = new BufferedReader(new InputStreamReader(System.in));
  DataOutputStream dos = new DataOutputStream(ops);
  BufferedReader brNet = new BufferedReader(new InputStreamReader(ips));
  while(true){
  String strWord = brKey.readLine();
  dos.writeBytes(strWord + System.getProperty("line.separator"));
  if("quit".equalsIgnoreCase(strWord)){
  }else{
  System.out.println(brNet.readLine());
  dos.close();
  brNet.close();
  brKey.close();
  s.close();
  先运行服务器程序,再在命令行使用java TcpClient 192.168.0.3 8000,这样就启动了客户端程序.我们可以启动多个客户端程序.
  我们可以利用netstat工具来查看已经被使用的端口
H3C认证Java认证Oracle认证
基础英语软考英语项目管理英语职场英语
.NETPowerBuilderWeb开发游戏开发Perl
二级模拟试题一级模拟试题一级考试经验四级考试资料
软件测试软件外包系统分析与建模敏捷开发
法律法规历年试题软考英语网络管理员系统架构设计师信息系统监理师
高级通信工程师考试大纲设备环境综合能力
路由技术网络存储无线网络网络设备
CPMP考试prince2认证项目范围管理项目配置管理项目管理案例项目经理项目干系人管理
职称考试题目
招生信息考研政治
网络安全安全设置工具使用手机安全
生物识别传感器物联网传输层物联网前沿技术物联网案例分析
Java核心技术J2ME教程
Linux系统管理Linux编程Linux安全AIX教程
Windows系统管理Windows教程Windows网络管理Windows故障
数据库开发Sybase数据库Informix数据库
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&Java中的TCP/UDP网络通信编程_Linux编程_Linux公社-Linux系统门户网站
你好,游客
Java中的TCP/UDP网络通信编程
来源:blog.csdn.net/shimiso&
作者:shimiso
网络应用中基本上都是TCP(Transmission Control Protocol传输控制协议)和UDP(User Datagram Protocol用户数据报协议),TCP是面向连接的通信协议,UDP是无连接的通信协议.
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问.
端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户的普通网络应用程序应该使用1024以上的端口.
Socket连接套接字,Java分别为TCP和UDP提供了相应的类,TCP是java.net.ServerSocket(用于服务器端)和java.net.Socket(用于客户端);UDP是java.net.DatagramSocket.
1,Java编写UDP网络程序
1.1,DatagramSocket
DatagramSocket有如下构造方法:1,DatagramSocket() :构造数据报套接字并将其绑定到本地主机上任何可用的端口。 2,DatagramSocket(int port):创建数据报套接字并将其绑定到本地主机上的指定端口。 3,DatagramSocket(int port, InetAddress laddr):创建数据报套接字,将其绑定到指定的本地地址。即指定网卡发送和接收数据.
如果在创建DatagramSocket对象时,没有指定网卡的IP 地址,在发送数据时,底层驱动程序会自动选择一块网卡去发送,在接收数据时,会接收所有的网卡收到的与端口一致的数据.
发送信息时,可以不指定端口号,接收信息时,要指定端口号,因为要接收指定的数据.
发送数据使用DatagramSocket.send(DatagramPacket p)方法,接收数据使用DatagramSocket.receive(DatagramPacket p)方法.
1.2,DatagramPacket
DatagramPacket类有如下构造方法:1,DatagramPacket(byte[] buf, int length):构造 DatagramPacket,用来接收长度为length的数据包。2,DatagramPacket(byte[] buf, int length, InetAddress address, int port):构造数据报包,用来将长度为length的包发送到指定主机上的指定端口号。
接收数据时使用第一次构造方法,发送数据时使用第二种构造方法.
1.3,InetAddress
Java中对IP地址进行包装的类,
DatagramPacket.getAddress()可以获取发送或接收方的IP地址.DatagramPacket.getPort()可以获取发送或接收方的端口.
1.4,UDP程序例子
import java.net.DatagramPimport java.net.DatagramSimport java.net.InetA
public class UdpSend {
public static void main(String[] args) throws Exception {DatagramSocket ds = new DatagramSocket();String str = "hello , world!";DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName("192.168.0.105"),3000);ds.send(dp);ds.close(); //关闭连接}}
import java.net.DatagramPimport java.net.DatagramS
public class UdpRecv {public static void main(String[] args) throws Exception {DatagramSocket ds = new DatagramSocket(3000);byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf,buf.length);ds.receive(dp);String str = new String(dp.getData(),0,dp.getLength());System.out.println(str);System.out.println("IP:" + dp.getAddress().getHostAddress() + ",PORT:" + dp.getPort());ds.close();}}
测试要先运行接收程序,再运行发送程序.如果接收程序没有接收到数据,则会一直阻塞,接收到数据后才会关闭程序.如果网络上没有数据发送过来,接收程序也没有阻塞,通常都是使用了一个已经被占用的端口.
相关资讯 & & &
& (08/31/:22)
& (07/31/:02)
& (12/05/:19)
& (08/24/:34)
& (07/04/:39)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款

我要回帖

更多关于 在位时间最短的皇帝 的文章

 

随机推荐