网络协议七层结构:
什么是Socket?
socket(套接字)是两个程序之间通过双向信道进行数据交换的端,可以理解为接口。使用socket编程也称为网络编程,socket只是接口并不是网络通信协议。
HTTP协议和Socket的区别
http协议是应用层,其模式是请求-应答,客户端发送请求,服务器端进行响应。传输的数据是原始格式的数据,eg :json、xml、text等数据格式。
socket不是协议是接口,socket提供TCP/UDP socket 的实例,供java 或者其他语言操作数据的传输,socket是对传输层(TCP/UPD协议)的封装。
Socket通信分为两种
TCP Socket :使用流传输,提供inputStream 和 outputStream 方法对数据进行流操作。要理解TCP套接字首先要对TCP协议有所理解。
1)TCP协议是传输层的协议,他的下一层是IP协议(网络层),IP协议在网络数据传输是通过ip寻址,将源地址和目的地址进行连接。TCP协议是在IP协议上多加一层端口寻址,光只通过IP寻址只能定位到主机,tcp通过端口找到对应的应用程序。
2)TCP 建立连接需要三次握手,将源应用程序和目的应用程序之间搭建一个连接,所以源应用和目的应用程序之间必须是one by one。IP 协议只管数据的传输,不保证数据是否丢失,重复传,顺序是否正确,TCP会对这些问题做一些补偿机制,丢失数据重传,用队列保证数据的顺序。
3) TCP 缺点:因为每个客户端和服务器端传输数据都要建立连接,三次握手是不传输数据并且有耗时,当有大量短连接的时候并且对数据的正确性要求不高的时候,将会占用带宽。
UDP Socket:使用数据报文进行传输,创建UDP socket 发送和接收数据报文。
1)UDP协议同TCP协议一样都是应用层协议,也是通过端口寻址,找到对应的应用程序。
2)UDP传输数据报文不需要和目的应用程序建立连接,他在数据报文中指定目的主机和目的端口号,发送出的数据自动寻址到对应的主机和端口号。因为不用和目的主机建立连接,所以一个源应用程序可以以广播的形式将数据报文传输给多主机。因为不用建立连接,耗时和带宽占用量都比TCP协议更优秀
3)UDP缺点:数据有可能丢失,丢失的数据不会重传
java socket 实例
TCP Socket client
package socket.transmission.tcp; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; //TCP 套接字 客户端负责发送请求 public class TcpClient { private static final int BUF_SIZE=32; /** * TCP客户端发送一个请求要有三个步骤: * 1.创建一个socket的实例,创建一个指向server主机ip和端口号的TCP连接 * 2.通过套接字的输入和输出流进行通信 * 3.使用socket close关闭 */ public static void main(String[] args){ String ip="192.168.197.1"; int port=8080; try { // 创建一个socket实例 Socket socket=new Socket(ip,port); System.out.println("创建一个socket连接"); InputStream inputStream=socket.getInputStream(); OutputStream outputStream=socket.getOutputStream(); //向socket中写入数据 outputStream.write("this is a word".getBytes()); int totalByrecive=0; //到目前为止接收到的数据 byte[] readBuff=new byte[BUF_SIZE]; int lastReadByte; //最后接收的字节 System.out.println("从服务器中接收的数据:"); int receiveMsgSize; while ((receiveMsgSize=inputStream.read(readBuff))!=-1){ System.out.println(new String(readBuff)); } socket.close(); //关闭 } catch (IOException e) { e.printStackTrace(); } } }
tcp sokect server
package socket.transmission.tcp; //TCP 服务器端进行接收请求 import sun.java2d.pipe.OutlineTextRenderer; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketAddress; /** * TCP服务器对客户端发送的请求会进行以下处理 * 1.创建serverSocket实例并且指定本机端口,功能:监听指定端口发送过来的连接 * 2.重复执行: * 1).调用的serverSocket 的accept() 监听客户端发送过来的请求,并创建socket * 2).使用socket的inputStream 和 outputStream 进行通讯 * 3).通信完使用socket.close() 方法将连接关闭 */ public class TcpServer { private static final int BUF_SIZE=32; public static void main(String[] args){ int port=8080; Socket socket = null; InputStream inputStream = null; OutputStream outputStream = null; try { ServerSocket serverSocket=new ServerSocket(port);//创建一个socket实例用于监听客户端发送的连接 System.out.println("创建serverSocket 实例"); int reviceMsgSize; // 接收msg的大小 byte[] receiveBuf=new byte[BUF_SIZE]; //创建一个信息接收的缓冲区 System.out.println("开始处理接收的数据"); while (true) { socket = serverSocket.accept(); //接收客户端的连接 SocketAddress socketAddress = socket.getRemoteSocketAddress(); // System.out.println("访问的地址:" + socketAddress); inputStream = socket.getInputStream(); outputStream = socket.getOutputStream(); while ((reviceMsgSize = inputStream.read(receiveBuf)) != -1) { System.out.println(new String(receiveBuf)); outputStream.write("aaaaa".getBytes(), 0, 4); } outputStream.flush(); socket.close(); } } catch (IOException e) { e.printStackTrace(); }finally { try { if(socket!=null){ socket.close(); } if(inputStream!=null){ inputStream.close(); } if(outputStream!=null){ outputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
原文地址:https://www.cnblogs.com/blogxiao/p/9304107.html