tcp/ip

来源:互联网 发布:电影源码 编辑:程序博客网 时间:2024/06/10 05:17


 TCP/IP是传输层协议,主要解决如何在网络传输数据;而HTTP是应用层协议,主要解决如何包装数据的问题。

接下来我们怎么使用这个协议:

Socket是对TCP/IP协议的封装,Socket本身并不是协议通过Socket,我们才能使用TCP/IP协议.

在说一下Http和Socket连接区别:

1、TCP连接
TCP连接。要使用联网功能是因为手机底层实现了TCP/IP协议,

手机通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。

TCP连接的建立需要经过“三次握手”。这里不详细说明。

2、HTTP连接
HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的协议

HTTP协议是建立在TCP协议之上的一种应用。 HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,

在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

接下来说一下SOCKET的连接

SOCKET就是套接字,建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,

另一个运行于服务器端,称为ServerSocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认

由于通常情况下Socket连接就是TCP连接,因此Socket连接一旦建立,通信双方即可开始相互发送数据内容,直到双方连接断开。

下面用例子来展示:

使用UDP建立信息发送端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
public class UDPSendDemo {
public static void main(String[] args) throws IOException {
    System.out.println("发送端启动......");
    /*
     * 创建UDP传输的发送端。
     * 思路:
     * 1,建立udp的socket服务。
     * 2,将要发送的数据封装到数据包中。 
     * 3,通过udp的socket服务将数据包发送出去。
     * 4,关闭socket服务。
     */
    //1,udpsocket服务。使用DatagramSocket对象。
    DatagramSocket ds = new DatagramSocket(8888); 
    //2,将要发送的数据封装到数据包中。
    String str = "udp传输";
      //使用DatagramPacket将数据封装到的该对象包中。
    byte[] buf = str.getBytes();
    DatagramPacket dp =  new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000); 
    //3,通过udp的socket服务将数据包发送出去。使用send方法。
    ds.send(dp);
    //4,关闭资源。
    ds.close();  
  }
}
使用UDP建立信息接收端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPReceDemo {
  public static void main(String[] args) throws IOException {
    System.out.println("接收端启动......");
    /*
     * 建立UDP接收端的思路。
     * 1,建立udp socket服务,因为是要接收数据,必须要明确一个端口号。
     * 2,创建数据包,用于存储接收到的数据。方便用数据包对象的方法解析这些数据.
     * 3,使用socket服务的receive方法将接收的数据存储到数据包中。
     * 4,通过数据包的方法解析数据包中的数据。
     * 5,关闭资源 
     */  
    //1,建立udp socket服务。
    DatagramSocket ds = new DatagramSocket(10000);  
    //2,创建数据包。
    byte[] buf = new byte[1024];
    DatagramPacket dp = new DatagramPacket(buf,buf.length);  
    //3,使用接收方法将数据存储到数据包中。
    ds.receive(dp);//阻塞式的。 
    //4,通过数据包对象的方法,解析其中的数据,比如,地址,端口,数据内容。
    String ip = dp.getAddress().getHostAddress();
    int port = dp.getPort();
    String text = new String(dp.getData(),0,dp.getLength());
    System.out.println(ip+":"+port+":"+text);
    //5,关闭资源。
    ds.close();
  }
}

介绍了udp,接下来看下tcp。

使用TCP建立交互方式:

//客户端:
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class ClientDemo2 {
 public static void main(String[] args) throws UnknownHostException,
   IOException {
  // 客户端发数据到服务端
  /*
   * Tcp传输,客户端建立的过程。
   *  1,创建tcp客户端socket服务。使用的是Socket对象。
   *     建议该对象一创建就明确目的地。要连接的主机。
   *  2,如果连接建立成功,说明数据传输通道已建立。 该通道就是socket流 ,是底层建立好的。
   *     既然是流,说明这里既有输入,又有输出。 想要输入或者输出流对象,可以找Socket来获取。
   *     可以通过getOutputStream(),和getInputStream()来获取两个字节流。
   *  3,使用输出流,将数据写出。
   *  4,关闭资源。
   */
  Socket socket = new Socket("127.0.0.1", 10002);
  OutputStream out = socket.getOutputStream();
  out.write("tcp".getBytes());
  // 读取服务端返回的数据,使用socket读取流。
  InputStream in = socket.getInputStream();
  byte[] buf = new byte[1024];
  int len = in.read(buf);
  String text = new String(buf, 0, len);
  System.out.println(text);
  // 关闭资源。
  socket.close();
 }
}

 

//服务器端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSendDemo {
public static void main(String[] args) throws IOException {
    System.out.println("发送端启动......");
    /*
     * 创建UDP传输的发送端。
     * 思路:
     * 1,建立udp的socket服务。
     * 2,将要发送的数据封装到数据包中。 
     * 3,通过udp的socket服务将数据包发送出去。
     * 4,关闭socket服务。
     */
    //1,udpsocket服务。使用DatagramSocket对象。
    DatagramSocket ds = new DatagramSocket(8888); 
    //2,将要发送的数据封装到数据包中。
    String str = "udp传输";
      //使用DatagramPacket将数据封装到的该对象包中。
    byte[] buf = str.getBytes();
    DatagramPacket dp =  new DatagramPacket(buf,buf.length,InetAddress.getByName("127.0.0.1"),10000); 
    //3,通过udp的socket服务将数据包发送出去。使用send方法。
    ds.send(dp);
    //4,关闭资源。
    ds.close();  
  }
}
0 0