关闭

Java中的TCP/UDP网络通信编程

发表于:2010-2-02 10:23

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
java

  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是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.DatagramPacket;
  import java.net.DatagramSocket;
  import java.net.InetAddress;
  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.DatagramPacket;
  import java.net.DatagramSocket;
  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();
  }
  }

  测试要先运行接收程序,再运行发送程序。如果接收程序没有接收到数据,则会一直阻塞,接收到数据后才会关闭程序。如果网络上没有数据发送过来,接收程序也没有阻塞,通常都是使用了一个已经被占用的端口。

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号