Java的网络编程(TCP/IP)

时间:2022-07-01 10:18:03

    毫无疑问,正是java优秀的网络程序设计功能使java能够风靡全世界。
    java关于网络编程的API,类不多,但是要熟练的、深入的掌握,需要下很足功夫,多多练习

    网络编程:简单的说,就是使两台计算机能够互相通讯数据而已。

    网络通讯:就是网络上计算机直接或间接地通过网络协议与其他计算机进行通讯。

    网络协议:
    TCP/IP
        Transmission Control Protocol 传输控制协议
        Internet Protocol 互联网协议
   
UDP
        User Datagram Protocol 用户数据协议


连接协议:
    分为:
   
面向连接协议Connection Oriented Protocol
    非连接协议Connectionless Protocol
    1).面向连接协议是指两台电脑在传输数据前,先会建立一个专属的连接。就如电信局的交换机会为打电话双方提供专属连接一样。
    Internet上的面向连接协议就是TCP/IP
    特点:确认回应;分组序号;流量控制。
    TCP/IP属于可靠性传输,适合不容许有传输错误的网络程序设计使用

    2).非连接协议:无专属连接,无分组,容错,距离短,可同时对多台电脑进行数据传输
    Internet上的非连接协议就是UDP

    TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输。相比之下UDP操作简单,而且仅需要较少的监护,因此通常用于局域网高可靠性的分散系统中client/server应用程序。

    Socket 是程序与网络间的一种接口,大部分网络应用程序都是点对点的,所谓点就是服务器端和客户端所执行的程序。Socket是用来接收和传送分组的一个端点。

    总之,学习java网络编程就是学习如何使用java的关于网络通讯的5个API,掌握并熟练运用它们

    这5个类分别是:InetAddress类,Socket类,ServerSocket类,Datagram类,MulticastSocket类

    1).InetAddress类没有提供构建者,不能用new来产生对象,只能它的方法来产生对象

    InetAddress inetadd = InetAddress.getLocalHost();
    inetadd.getHostAddress();
    inetadd.getHostName();
    inetadd.toString();

    2).Socket类
    InetAddress和Socket类是属于TCP面向连接协议,Datagram类和DatagramPacket类则属于UDP非连接协议的传送类
 构造
  Socket(InetAddress address, int port);
  Socket(InetAddress address, int port, boolean stream);
  Socket(String host, int prot);
  Socket(String host, int prot, boolean stream);
  Socket(SocketImpl impl)
  Socket(String host, int port, InetAddress localAddr, int localPort)
  Socket(InetAddress address, int port, InetAddress localAddr, int localPort)
  ServerSocket(int port);
  ServerSocket(int port, int backlog);
  ServerSocket(int port, int backlog, InetAddress bindAddr)
 连接
  Socket client = new Socket("127.0.01.", 80);
  ServerSocket server = new ServerSocket(80);
     注意:
     1).在选择端口时,必须小心。每一个端口提供一种特定的服务,只有给出正确的端口,才能获得相应的服务。0~1023的端口号为系统所保留,例如http服务的端口号为80,telnet服务的端口号为21,ftp服务的端口号为23, 所以我们在选择端口号时,最好选择一个大于1023的数以防止发生冲突。
  
     2).在创建socket时如果发生错误,将产生IOException,在程序中必须对之作出处理。所以在创建Socket或ServerSocket是必须捕获或抛出例外。
 ...
 private void makeConnection()
 {
  try
  {
   InetAddress srvAddr = InetAddress.getName(srvName);
   socket = new Socket(srvAddr,srvPort);
   dataIn = new DataInputStream ( new BufferedInputStream( sock.getInputStream() ) ) ;
   dataOut = new DataOutputStream ( new BufferedOutputStream( sock.getOutputStream() ) ) ;

   System.err.println("Connection to server ok");
  }
  catch ( IOExcept io )
  {
   System.err.println("Error" + io);
  }
  public void stop()
  {
   try
   {
    dataOut.close();
    dataIn.close();
    sock.close();
   }
   catch ( IOExcept io )
   {
   }
  }
 }
 ...
 发送
 dataOut.writeUTF( strmsg );
 dataOut.flush();

    3.Datagram类是用来建立UDP的socket
 构造
  DatagramSocket();
  DatagramSocket(int prot);
  DatagramSocket(int port, InetAddress laddr)

    4.DatagramPacket类是负责UDP的数据传送
 构造
         DatagramPacket(byte buf[],int length);
  DatagramPacket(byte buf[], int length, InetAddress addr, int port);
  DatagramPacket(byte[] buf, int offset, int length);
  DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port);

 接收
  DatagramPacket packet=new DatagramPacket(buf, 256);
  Socket.receive (packet);
发送
         DatagramPacket packet=new DatagramPacket(buf, length, address, port);
  Socket.send(packet);

    学好Java网络编程,Java语言,最重要的还是在于多多练习!