网络编程 详解

  1. 概述

计算机网络:将不同地理区域的计算机(广义)通过通信线路(光纤)连接起来,通过功能完备的软件实现数据共享,信息传递。

网络编程 :使程序借助网络在不同计算机间传输数据。

Java提供的网络类库,可以实现网络连接 ,且Java支持网络传输。

2.网络通信要素

2.1 IP

网络中的计算机通过IP地址来进行寻找主机。

局域网ip(192.168.110)

广域网ip

打开cmd,输入命令:ipconfig,回车即可查看。

2.2 端口号

与计算机上的程序相对应,每个运行中的程序会分配一个端口号,不可重复。

端口号范围是0-65535,其中 0-1024被系统占用,定义时1024-65535。

2.3 通信协议

通信双方有一些约定,如何安全可靠的传输数据,速率,传输代码,出错控制等。

传输层协议中有两个重要的协议:

● 传输控制协议TCP(Transmission Control Protocol)

安全、可靠;

使用前,”三次握手“,必须测试网络是否通畅;

进行通信的两个应用进程:客户端——>服务端;

传输完成,释放已建立的连接,效率低;

断开时,“四次挥手“。

三次握手详解:

(1)Cilent端发送连接请求

(2)Server端接受连接后回复Ack报文,并向此次连接分配资源

(3)Client端接收到Ack报文后向Server端发生Ack报文,这样就建立了TCP连接。

图解:

网络编程 详解_第1张图片

举例详解:

网络编程 详解_第2张图片

总结:三次握手是要确认对方收到了自己的数据。若只有两次,客户端无回应,这会浪费服务端的资源。三次握手的2个重要功能:双方做好发送数据的准备工作;允许双方协商初始序列号。

四次挥手详解:

(1)Client发送一个FIN,来关闭Client到Server的数据传送

(2)Server接收到FIN后,发送一个ACK给Client

(3)Server发送一个FIN,来关闭Server到Client的数据传送

(4)Client收到FIN后,发送ACK给Server,完成四次挥手

网络编程 详解_第3张图片

举例详解:

网络编程 详解_第4张图片

客户端

import java.io.*;
import java.net.Socket;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket=new Socket("127.0.0.1",55555);
        OutputStream out=socket.getOutputStream();//获取输出流
        DataOutputStream d=new DataOutputStream(out);
        d.writeUTF("你好服务器");

        //获取输入流对象
        InputStream in =socket.getInputStream();
        DataInputStream din=new DataInputStream(in);
        System.out.println("来自服务端的消息:"+din.readUTF());
    }
}

服务端

import java.io.*;
import java.net.DatagramSocket;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    public static void main(String[] args) throws IOException {
        //创建了一个服务器  端口为55555
        ServerSocket server=new ServerSocket(55555);
        System.out.println("服务器启动");
        Socket socket=server.accept();//监听客户端是否连接了服务器,是阻塞式的
        System.out.println("客户端连接成功"+socket);//socket就是连接到服务器的socket

        //获取输入流对象
        InputStream in=socket.getInputStream();
        DataInputStream d=new DataInputStream(in);
        System.out.println("来自客户端的信息:"+d.readUTF());

        //获取输出流对象
        OutputStream out=socket.getOutputStream();
        DataOutputStream dout=new DataOutputStream(out);
        dout.writeUTF("你好,找到客户端了!");

    }
}

运行结果:

//服务端
服务器启动
客户端连接成功Socket[addr=/127.0.0.1,port=55402,localport=55555]
来自客户端的信息:你好服务器
//客户端
来自服务端的消息:你好,找到客户端了!

● 用户数据报协议UDP(User Datagram Protocol)

将数据、源、目标封装在一个数据包中;因无需连接,故不安全,发送成功与否都不知道;发送数据结束时不用释放资源,速度快。

import java.io.IOException;
import java.net.*;

public class Send {
    public static void main(String[] args) throws IOException {
        //负责发送和接收信息
        DatagramSocket datagramSocket=new DatagramSocket();
        while(true){
            String s="你好,接收端";
            DatagramPacket datagramPacket=new DatagramPacket(s.getBytes(),s.getBytes().length, InetAddress.getByName("127.0.0.1"),55555);
            datagramSocket.send(datagramPacket);
        }
    }
}
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class Receieve {
    public static void main(String[] args) throws IOException {
        DatagramSocket datagramSocket=new DatagramSocket(55555);
        byte[] b=new byte[1024];
            DatagramPacket datagramPacket=new DatagramPacket(b,b.length);
            datagramSocket.receive(datagramPacket);
            String s=new String(datagramPacket.getData(),0,datagramPacket.getLength());
            System.out.println(s);//你好,接收端
            datagramSocket.close();
    }

}

你可能感兴趣的:(网络协议,网络)