Socket的速成版

59 阅读3分钟

1.InetAddress类的方法调用:

InetAddress address = InetAddress.getByName("xumingweideMacBook-Air.local");
//通过主机名然后利用getByName,确认主机的ip地址


//然后获取主机名,以及ip地址
String name = address.getHostName();
String ipAddress = address.getHostAddress();


System.out.println("主机名:"+name);
System.out.println("ip地址:"+ipAddress);

2.端口:设备上应用程序的唯一标识

3.端口号:普通应用程序需要使用1024以上的端口号

4.协议

UDP:

是一种面向无连接的通信协议,简单的说就是发送端发出数据,不确定接收端是否存在,同样接收端在收到数据时也不会给发送端反馈数据.

特点:UDP协议消耗资源小,通信效率高,但是因为他的无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议.

UDP通信原理:

本身一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接受数据对象,没有明确的客户端与服务端.

Java提供的DatagramSocket类作为基于UDP协议的Socket.

UDP发送数据的创建:

//创建发送端的Socket对象(DatagramSocket)
DatagramSocket ds = new DatagramSocket();


//创建数据,并打包数据
byte [] bys = "hello".getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("192.168.1.66");
int port = 10086;


DatagramPacket dp = new DatagramPacket(bys,length,address,port);


//调用DatagramSocket对象的方法发送数据
ds.send(dp);


//关闭发送端
ds.close();

UDP接受数据的创建:

//创建接收端的Socket对象(DatagramSocket)
//DatagramSocket(int port)
DatagramSocket ds = new DatagramSocket(10086);


//创建一个数据包,用于接受数据
byte [] bys = new byte[5];
DatagramPacket dp = new DatagramPacket(bys, bys.length);


//接受数据
ds.receive(dp);


//解析数据包的内容,并打印出数据
byte[] datas = dp.getData();
String dataString = new String(datas,0, datas.length);


System.out.println("数据是:"+dataString);


//关闭接收端
ds.close();

 

 

TCP:

是一种面向连接的通信协议,在发送端和接受端建议逻辑连接,然后再传输数据,他提供了两台计算机之间可靠无差错的数据传输,在tcp连接必要要明确客户端与服务端,由客户端向服务端发送连接请求,每次连接的创建都需要经过"三次握手".

三次握手:

在发送数据准备阶段,客户端与服务端之间的三次交互,以保证连接的可靠性.

第一次握手,客户端向服务端发出连接请求,等待客户端确认

第二次握手,服务端向客户端送一个响应,通知客户端收到了连接请求.

第三次握手,客户端再次向服务端发送确认信息,确认连接.  

TCP通信原理:

TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象,从而在通信的两端形成网络虚拟链路,一旦建立了虚拟的网络链路,两端的程序就可以虚拟链路进行通信.

JAVA对基于TCP协议的网路提供了良好的封装,使用Socket对象来表达两端的通信端口,并通过Socket产生IO流来进行网络通信.

JAVA为客户端提供了Socket类,为服务器提供了ServerSocket类.

 

TCP客户端发送数据:

 public static void main(String[] args) throws IOException {


    //创建客户端的Socket对象
    Socket s = new Socket("192.168.31.55", 10000);




    //获取输出流,写数据
    OutputStream os = s.getOutputStream();
    os.write("hello,tcp".getBytes());






    //接受服务器反馈
    InputStream is = s.getInputStream();
    byte [] bys = new byte[1024];
    int len = is.read(bys);
    String data = new String(bys,0,len);
    System.out.println("客户端:"+data);


    //释放资源
    s.close();




}

服务端:

public class ServerDemo {


    public static void main(String[] args) throws IOException {
        //创建服务器短的Socket对象(ServerSocket)
        ServerSocket ss = new ServerSocket(10000);


        //监听客户端连接,返回一个Socket对象
        Socket s = ss.accept();


        //获取输入流,读数据,并把数据显示在控制台
        InputStream is = s.getInputStream();
        byte [] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("服务器:"+data);


        //给出反馈
        OutputStream os = s.getOutputStream();
        os.write("数据已经收到".getBytes());


        //释放资源
//        s.close();
        ss.close();


    }


}

服务器一般是不关闭的.