网络编程的详解

一.什么是网络编程?

1.在网络通信协议下,实现网络互连的不同计算机上运行的程序间可以进行数据交换。
2.网络编程三要素 :IP地址 、端口、协议(TCP、UDP)

iso七层模型:

二.  IP

Java中ip地址类:InetAddress

        1.唯一定位一台网络上的计算机(127.0.0.1   本机:localhost)

        2.ip地址的分类:ipv4 /  ipv6

                                ipv4:127.0.0.1,由四个字节组成。

                                ipv6:128位,8个无符号整数!

                              公网(互联网)---私网(局域网)

        域名:记忆ip问题。

                ip:www.baidu.com

三.端口

        端口表示计算机上的一个程序进程:

               1. 不同的进程有不同的端口!来区分软件 !

                2.端口规定:0-65535

                3.TCP,UDP,单个协议下,端口号不能冲突

查看所有端口命令:netstat -ano

查看指定端口命令:netstat -ano|findstr "8080"

四.通信协议

        协议:约定,规则。

TCP:(类似打电话)

        1.双方必须建立连接,稳定。

        2.三次握手,四次挥手

最少需要三次,保证稳定连接!

三次握手:

       A:你愁啥!

       B:瞅你咋的!

       A:来打一架!

四次挥手:

       A:我要走了!

      B:你真的要走了吗?

       B:你真的真的要走了吗?

       A:我真的要走了!

        3.客户端,服务端

        4.传输完成,释放连接,效率低。

TCP:面向连接的协议,在正式收发数据的时候,必须和对方建立可靠的连接。

TCP 代码演示(先启动服务端):

        创建服务端:

public class ServerTest {
    public static void main(String[] args) throws Exception {
        //创建服务端
        ServerSocket serverSocket = new ServerSocket(8089);
                //侦听连接
                 Socket accept = serverSocket.accept();
                 //获取输入流
                 InputStream inputStream = accept.getInputStream();
                 byte[] bytes = new byte[1024];
                 int len = inputStream.read(bytes);
                 String str = new String(bytes, 0, len);
                 inputStream.close();
                 serverSocket.close();
                 System.out.println("数据:" + str);
    }
}

        创建客户端:

public class ClientTest {
    public static void main(String[] args) throws Exception {
        //创建客户端
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),8089);
        //获取输出流
       OutputStream outputStream = socket.getOutputStream();
        outputStream.write("在吗?我来了...".getBytes());
        outputStream.close();
        socket.close();
    }
}

UDP:(类似发短信)

        1.不用建立连接,不稳定,可能有网络导致数据发送失败。

        2.客户端,服务端:没有明确的界限

        3.不管有没有准备好,都可以发送给你

UDP:面向非连接协议,不用与对方建立连接,可以直接把数据报发送出去。

UDP 代码演示(先启动服务端):

        创建服务端:

//等待客户端发送
public class ServerTest {
    public static void main(String[] args) throws Exception {
            //开放端口
        DatagramSocket datagramSocket = new DatagramSocket(9090);
        //接收数据包
        byte[] bytes = new byte[1024];
        //接收
        DatagramPacket datagramPacket = new DatagramPacket(bytes, 0, bytes.length);
        //阻塞接收
        datagramSocket.receive(datagramPacket);
        System.out.println(datagramPacket.getAddress().getHostAddress());
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()));
        //关闭流
        datagramSocket.close();
    }
}

        创建客户端:

//不需要连接服务器
public class ClientTest {
    public static void main(String[] args) throws Exception {
        //建立一个socket
        DatagramSocket datagramSocket = new DatagramSocket();
        //建个包
        String msg="你好,服务器!";
        //发送给谁
        InetAddress localhost = InetAddress.getByName("localhost");
        //定义端口号
        int port=9090;
        //数据,数据的长度,要发送给谁
        DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, localhost, port);
        //发送包
        datagramSocket.send(datagramPacket);
        //关闭流
        datagramSocket.close();
    }
}

URL:   

        例如:https://www.baidu.com/

        URL:统一资源定位符,定位互联网上的某一资源。

DNS:域名解析 。   www.baidu.com  解析成ip:127.0.0.1

url组成:协议://ip地址:端口/项目名/资源

url下载网络资源代码示例:

public class UrlTest {
    public static void main(String[] args) throws IOException {
        //下载地址
        URL url = new URL("https://t13.baidu.com/it/u=3879914021,2320932645&fm=224&app=112&f=JPEG?w=500&h=500&s=D93FF1FAD80860CE4806C65C030040D7");
        //连接这个资源
        HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();

        InputStream inputStream = urlConnection.getInputStream();

        FileOutputStream fileOutputStream = new FileOutputStream("a.jpg");
        byte[] bytes = new byte[1024];
        int len;
        while ((len=inputStream.read(bytes))!=-1){
            fileOutputStream.write(bytes,0,len);
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值