网络编程

一.初始网络编程

1.什么是网络编程

计算机跟计算机之间通过网络进行数据传输

2.创建的软件架构有哪些?

CS/BS

3.CS/BS的优缺点

CS:客户端服务端模式需要开发客户端
BS:浏览器服务端模式不需要开发客户端
CS:适合定制专业化的办公软件和网游
BS:适合移动物联网应用,可以在任何地方随时访问的系统

二.网络编程三要素

IP:设备在网络上的地址,是唯一标识符。
端口号:应用程序在设备中唯一的标识
协议:数据在网络上传输的规则,常见的协议有UDP,TCP,http,https,ftp

1.1IP

ipv4(internet protocol version4)采用32位地址长度,分成4组,转换方式:点分十进制,目前主流方式,但是已经用完了
目前解决方法:利用局域网ip解决ip不够用的问题

特殊ip地址127.0.0.1,本机ip,永远只会寻找当前所在本机

常用cmd命令
inconfig:查看本机ip地址
ping:检查网络(局域网也可以检查外网)是否连通

ipv6:采用128位地址长度,分成8组一组16位,转换方式:冒分十六进制,为了解决ipv4不够用才出现的

1.2java中用来表示ip的类

InetAddress:给定主机的名称,根据系统上配置的名称服务返回其IP地址数组。

package com.wyx.ip;

import java.net.InetAddress;
import java.net.UnknownHostException;

public class Demo1 {
    public static void main(String[] args) throws UnknownHostException {
        //InetAddress.getByName(string host)确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址,返回此对象
//        InetAddress inetAddress = InetAddress.getByName("192.168.0.103");
        InetAddress inetAddress = InetAddress.getByName("LAPTOP-4R43I4O8");
        //打印这个对象
        System.out.println(inetAddress);//LAPTOP-4R43I4O8/192.168.0.103
        //调用下面的方法
        System.out.println(inetAddress.getHostAddress());//192.168.0.103
        System.out.println(inetAddress.getHostName());//LAPTOP-4R43I4O8
    }
}

2.1端口号

端口号:由两个字节表示的整数,取值范围:0~65535
其中0~1023之间端口号用于一些知名的网络服务或者应用
一个端口号只能被一个应用程序使用

3.1协议

UDP协议
用户数据报协议
UDP是面向无连接的通信协议(不管是否链接成功,都要发送消息)
速度快,有大小限制最多发送64k,数据不安全,易丢失数据

发送端

package com.wyx.udp;

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

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //发送数据

        //1.创建DatagramSocket()对象
        //参数:空参所有端口号中随机一个进行使用
        //有参:从指定的端口号中发送
        DatagramSocket datagramSocket = new DatagramSocket();

        //2.打包数据
        String str="你好";//需要发送的数据
        byte[] bytes = str.getBytes();//把需要发送的数据转成字节数组
        //创建InetAddress对象,用于指定接收方的ip地址
        InetAddress byName = InetAddress.getByName("127.0.0.1");//发送给指定电脑
        int port = 10086;//接收端的端口号

        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, byName, port);//打包数据

        //3.发送数据
        datagramSocket.send(datagramPacket);

        //4.释放资源
        datagramSocket.close();
    }
}

接收端

package com.wyx.udp;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //接受数据

        //1.创建DatagramSocket对象
        //在创建接受数据对象时候,一定要绑定接口,并且与发送端  发送的的接口一致
        DatagramSocket datagramSocket = new DatagramSocket(10086);

        //2.接受数据(接收到的数据是一个数据包)
        byte[] bytes = new byte[1024];//用来存放数据
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//创建一个数据包,用来存放接收到的数据包

        //receive该方法是阻塞的,程序执行到这一步的时候,会在这里死等,等发送端发送消息
        datagramSocket.receive(datagramPacket);//接受数据,把接收到的数据放到datagramPacket包中

        //3.解析数据包
        byte[] data = datagramPacket.getData();//获取数据,获取到的数据就是上面bytes变量中存的数据
        int length = datagramPacket.getLength();//获取数据的字节数
        InetAddress address = datagramPacket.getAddress();//获取发送方的ip地址
        int port = datagramPacket.getPort();//获取发送方的端口

        System.out.println("接受数据:" + new String(data,0,length));//接受数据:你好
        System.out.println("发送方的ip地址是:" + address);//发送方的ip地址是:/127.0.0.1
        System.out.println("发送方端口号是:" + port);//发送方端口号是:50574

        //4.释放资源
        datagramSocket.close();
    }
}

先运行接收端,再运行发送端

练习

UDP发送数据:数据来源于键盘录入,直到输入的数据是886,发送数据结束
UDP接受数据:因为接收端不知道发送端什么时候停止发送,故采用死循环的方式接受

发送端

package com.wyx.udp2;

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

public class SendMessageDemo {
    public static void main(String[] args) throws IOException {
        //1创建对象
        DatagramSocket datagramSocket = new DatagramSocket();

        //2打包数据
        Scanner scanner = new Scanner(System.in);

        while (true){
            System.out.println("请输入你要发送的数据");
            String next = scanner.next();
            if (next.equals("886")) {
                break;
            } else {
                byte[] bytes = next.getBytes();
                InetAddress byName = InetAddress.getByName("127.0.0.1");
                int port = 10086;
                DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, byName, port);
                //3发送数据
                datagramSocket.send(datagramPacket);
            }
        }
        //4.释放资源
        datagramSocket.close();


    }
}

接收端

package com.wyx.udp2;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        //1创建对象
        DatagramSocket datagramSocket = new DatagramSocket(10086);
        //2接受数据
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        while (true) {
            datagramSocket.receive(datagramPacket);
            //3解析数据
            System.out.println("接受数据:" + new String(datagramPacket.getData(),0,datagramPacket.getLength()) );
        }
        //4.释放资源
//        datagramSocket.close();
    }
}

UDP的三种通信方式

1.单播(一对一发送数据)
2.组播(一对一组发送数据)
3.广播(一对局域网中全部发送数据)

TCP协议

传输控制协议
TCP协议是面向链接的通讯协议。(先判断是否链接成功,链接成功之后,再去发送消息)
速度慢,没有大小限制,数据安全
TCP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket对象
通信之前要保证链接已经建立
通过Socket产生IO流来进行网络通信

客户端发送数据

package com.wyx.tcp;

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

//客户端,发送数据,tcp协议
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建Socket对象
        //细节:在创建对象同时会连接服务器
        //如果连接不上,会报错
        Socket socket = new Socket("127.0.0.1", 10000);

        //2.可以从连接通道中获取输出流
        OutputStream os = socket.getOutputStream();
        os.write("你好呀".getBytes());//需要发送的数据

        //3.释放资源
        os.close();
        socket.close();
    }
}

服务端接受数据

package com.wyx.tcp;

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

//服务端,接受数据,tcp协议
public class Server {
    public static void main(String[] args) throws IOException {
        //1.创建ServerSocket对象,端口号要和发送方端口号一致
        ServerSocket ss = new ServerSocket(10000);
        //2.监听客户端链接,就是调用accept方法,死等,等客户端来链接,链接成功会返回客户端的链接对象
        Socket socket = ss.accept();

        //3.从链接通道中获取输入流读取数据
        InputStream is = socket.getInputStream();//字节输入流

        InputStreamReader isr = new InputStreamReader(is);//将字节流转为字符流
        int b;
        while ((b=isr.read())!=-1){
            System.out.println((char)b);
        }

        //4.释放资源
        socket.close();//断开与客户端链接
        ss.close();//关闭服务器

    }
}

TCP通信程序(三次握手)

TCP通信程序(四次挥手)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容