网络编程

来源:互联网 发布:手机视频监控软件 编辑:程序博客网 时间:2024/06/05 11:49
------- android培训、java培训、期待与您交流! ----------
 

 

1.网络通讯要素

         网络通讯要素是:IP地址、端口号、传输协议。

    (1)IP地址

         IP地址是网络中设备的标识,不易记忆,可用主机名。本地回环地址:127.0.0.1,主机名:localhost。

      InetAddress类:

              InetAddress i = InetAddress.getLocalHost();//调用对象
                System.out.println(i); //得到IP地址的主机名+IP地址字符串
                System.out.println(i.getHostName()); //得到IP地址的主机名
               System.out.println(i.getHostAddress()); //得到IP地址字符串

     拿任意一台主机的IP地址:

            InetAddress ia = InetAddress.getByName("www.baidu.com") ;       //也可以写的是IP地址
              System.out.println(ia.getHostName());
             System.out.println(ia.getHostAddress());
           InetAddress[] ib = InetAddress.getAllByName("www.google.com");   //返回IP地址组成的数组,说明有多台主机服务器
                for(InetAddress is:ib){
                    System.out.println(is.getHostAddress());
                  }

     (2)端口号

            端口号用于标识进程的逻辑地址,不同进程的标识。

            有效端口号:0~65535,其中0~1024是系统使用或保留端口,尽量不要使用。

     (3)传输协议

         传输协议,即通讯的规则。常见协议有:UDP和TCP。

         TCP(Transmission Control Protocol,传输控制协议):
 
         是基于连接的协议,在正式收发数据前,必须和对方建立可靠的连接,形成传输数据的通道。一个TCP连接必须要经过三次“对话”才能建立起来,是可靠 协议。在连接中可以进行大数据量的传输,同时因为要建立连接,所以效率会稍低。


        UDP(User Data Protocol,用户数据报协议):
 
        是与TCP相对应的协议,它是面向非连接的协议,它不与对方建立连接,而是将数据及源和目的封装成数据包发送过去。
 
          UDP适用于一次只传送少量数据(64K)、对可靠性要求不高的应用环境,它的可靠性不如TCP协议高。例如:QQ就使用UDP发消息,因此有时会出

               现收不到消息的情况。因为不需要建立连接,所以速度快。

      总结:TCP是基于连接的协议,是可靠协议,而UDP是面向非连接的协议,是不可靠协议;
  
                 TCP课进行大数据量传输,UDP的传输数据量有限,但可以将大数据切割封装成小数据包发送;
      
                 TCP传输效率低速度慢,UDP传输效率高速度快。

2.Socket(套接字)

   Socket就是为网络服务提供的一种机制,通信两端都有Socket。网络通信其实Socket间的通信,数据在两个Socket间通过IO传输。

     UDP传输(UDP的Socket服务):

         DatagramSocket类 : void send(DatagramPacket p) 发送数据包

                                             void receive(DatagramPacket p) 接受数据包

               DatagramPacket 数据包类,

                  常用构造方法:DatagramPacket(byte[] buf,int lenght,InetAddress address,int port) //将数据以字节形式发送到目标地址的目的端口。

                                           DatagramPacket(byte[] buf, int length); // 仅仅一个数据包,没有目标地址

      (1)将一段文字用UDP传输方式发送出去

             DatagramSocket ds = new DatagramSocket();
                 byte[] buf = "udp 我来了!!".getBytes();
             DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.103"), 10000);
                 ds.send(dp); //发送数据包
                 ds.close();

           因为面向无连接,接收端未开,所以这段数据会丢失掉。

     (2)用一个接收端来接收上面的数据

         DatagramSocket ds = new DatagramSocket(10000);
           byte[] buf = new byte[1024];
         DatagramPacket dp = new DatagramPacket(buf, buf.length);
           ds.receive(dp); //接收数据包
         String ip = dp.getAddress().getHostAddress();
            String data = new String(dp.getData(),0,dp.getLength());
            int port = dp.getPort();
         System.out.println(ip+"...."+data+"..."+port);
        ds.close();

 

3.TCP传输

   Socket(客户端)和ServerSocket(服务器端)

 (1) 简单的TCP客户端与服务器端交流    

客户端  

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TcpClient1 {
 public static void main(String[] args) throws Exception{
  Socket s = new Socket("192.168.1.103",9001);
  OutputStream out = s.getOutputStream();
  out.write("服务端,你好啊".getBytes());
  InputStream in = s.getInputStream();
  byte[] buf = new byte[1024];
  int len = in.read(buf);
  System.out.println(new String(buf,0,len));
  s.close();
 }

}

 

服务器端

import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer1 {
 public static void main(String[] args)throws Exception {
  ServerSocket ss = new ServerSocket(9001);
  Socket s = ss.accept();
  String ip = s.getInetAddress().getHostAddress();
  System.out.println(ip+"...connected");
  InputStream in = s.getInputStream();
  byte[] buf = new byte[1024];
  int len = in.read(buf);
  System.out.println(new String(buf,0,len));
  OutputStream out = s.getOutputStream();
  out.write("哥们收到,你也好啊".getBytes());
  s.close();
  ss.close();
  
 }

}

 

 

  

原创粉丝点击