Socet

一、什么是Socket

  Socket就是为了网络服务提供的一种机制;

  通讯的两端都有Socket;

  网络通讯其实就是Socket间的通讯;

  数据在两个Socket间通过10传输

二、TCP与UDP造概念上的区别

  1、UDP:

    (1)是面向无连接,将数据及源的封装成数据包中,不需要建立连接

    (2)每个数据报的大小在限制64k内

    (3)因无连接,是不可靠协议

    (4)不需要建立连接,速度快

  2、TCP:

    (1)建议连接,形成传输数据的通道

    (2)在连接中进行大数据量传输,以字节流方式

    (3)通过三次握手完成连接,是可靠协议

    (4)必须建议连接m效率会稍低

三、UDP协议

  1、UDP协议服务端代码

复制代码
package com.socket.UDP;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

/**
 * UDP协议的服务端
 */
public class UDPServer {
    public static void main(String[] args) throws Exception {
        System.out.println("UDP服务端启动==========================");
        //创建一个连接,没有传入IP地址就是本机 127.0.0.1
        DatagramSocket socket=new DatagramSocket(8080);

        //接收客户端传递的数据
        byte[] bytes=new byte[1024];
        DatagramPacket packet=new DatagramPacket(bytes,bytes.length);

        //等待客户端发送数据包,如果客户端没有建立的情况下,那么会堵塞
        socket.receive(packet);

        //获取来源的IP和端口
        System.out.println("IP地址:"+packet.getAddress()+"	端口:"+packet.getPort());
        //接受数据
        String str=new String(packet.getData(),0,packet.getLength());
        System.out.println("客户端发送过来的数据:"+str);
    }
}
复制代码

  2、UDP协议客户端代码

复制代码
package com.socket.UDP;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
 * UDP协议的客户端
 */
public class UDPClient {
    public static void main(String[] args) throws Exception {
        System.out.println("UDP客户端启动成功~");
        //创建Scoket对象
        DatagramSocket socket=new DatagramSocket();
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入传输内容:");
        String str=scanner.next();

        //创建数据包
        DatagramPacket packet=new DatagramPacket(str.getBytes(),str.getBytes().length,InetAddress.getByName("192.168.60.29"),8080);

        //发送数据包
        socket.send(packet);

        //关闭
        socket.close();
    }
}
复制代码

  3、效果如下

    (1)首先启动服务端

      

     (2)启动客户端并发送请求

      

     (3)服务端接收客户端请求

      

 四、TCP协议

  1、TCP握手协议

    在TCP/IP协议中,TCP协议采用三次握手建立一个连接。

    第一次握手:建立连接时,客户端发送SYM包(SYM=J)到服务器,并进入  SYM_SEND状态,等待服务器确认

    第二次握手:服务器收到SYM包,必须确认客户的SYM(ACK=J+1),同时自己也发送一个SYM包(SYM=K),即SYM+ACK包,此时服务器V状态

    第三次握手:客户端收到服务器的SYM+ACK包,向服务器发送确认包ACK(ACK=K+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

    完成三次握手,客户端与服务器开始传送数据

    

   2、四次分手

    由于TCP连接是全双工的,因此每个方向必须单独进行关闭,这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍然能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭

    客户端A发送一个FIN,用它来关闭客户A到服务B的数据传输;

    服务器B收到这个FIN,他发回一个ACK,确认序号为收到的序号加1,和SYM一样,一个FIN将占用一个序号。

    服务器B关闭与客户端A的连接,发送一个FIN给客户端A。

    客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

    

   3、TCP协议服务端代码

复制代码
package com.socket.TCP;

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

public class TCPServer {
    public static void main(String[] args) throws IOException {
        System.out.println("tcp服务端启动成功==============================");

        //创建连接
        ServerSocket socket=new ServerSocket(8080);

        //获取客户端请求,如果客户端没有请求则堵塞
        Socket accept=socket.accept();

        //获取客户端传输数据
        InputStream inputStream=accept.getInputStream();

        byte[] bytes=new byte[1024];
        int length = inputStream.read(bytes);

        System.out.println(new String(bytes,0,length));
    }
}
复制代码

  4、TCP协议客户端代码

复制代码
package com.socket.TCP;

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

public class TCPClient {
    public static void main(String[] args) throws IOException {
        //创建一个连接
        Socket socket=new Socket("127.0.0.1",8080);

        OutputStream outputStream=socket.getOutputStream();

        outputStream.write("我不配".getBytes());
    }
}
复制代码

  5、效果如下

    (1)服务端

      

     (2)客户端

      

     (3)服务端接收客户端请求

      

原文地址:https://www.cnblogs.com/mayuan01/p/12382449.html