基于Java的网络编程实践

网络编程


2.网络通信的两要素(如何实现网络的通信?)

地址(IP+端口号)

规则 (网络通信协议)TCP 、UTP


3. IP

IP地址 InetAddress

  • 唯一定位一台网络上的计算机

  • 127.0.0.1 本机localhost

  • IP地址的分类

    • Ipv4 / Ipv6

      • IPV4 四个字节 0-255 2011年已经用完

      • IPV6 八个无符号整数

    • 公网IP 私网IP

      • 192.168.xx.xx 一般都是局域网

import java.net.Inet4Address;
import java.net.UnknownHostException;
​
public class TestInetAdddress {
    public static void main(String[] args) {
        try {
            Inet4Address inet4Address = (Inet4Address) Inet4Address.getByName("localhost");
            System.out.println(inet4Address);//localhost/127.0.0.1
​
            Inet4Address inet4Address1 = (Inet4Address) Inet4Address.getLocalHost();
            System.out.println(inet4Address1);//DESKTOP-5D4I4TV/172.20.10.2     电脑型号(主机名)
            
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

4. 端口

端口概念

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

  • 不同的进程有不同的端口号,用这来区分软件

  • 被规定为0-65536

  • TCP , UDP


5.通信协议

协议,约定,就好比我们说的普通话

网络通信协议: 速率 、 传输速率、代码结构 、 传输控制

问题:非常复杂?但我们通过分层来简化。

TCP/IP协议簇 :实际上是一组协议

重要

  • TCP:用户传输协议

  • UDP:用户数据报协议

出名的协议

  • TCP

  • IP :网际互联协议


6.TCP与UDP对比

TCP :打电话

  • 连接 ,稳定

  • 三次握手,四次挥手

    //三次握手(最少需要三次)
    A:你愁啥
    B:瞅你咋地?
    A:干一场 !
    ​
    //四次挥手
    A:我要走了
    B:你真的要走了吗?
    B:你真的真的要走了吗?
    A:我真的要走了!
    
  • 客户端,服务端

  • 传输完成,释放连接,效率低

UDP :发短信

  • 不连接 ,不稳定

  • 客户端,服务端,没有明确的界限

  • 不管有没有准备好,都可以发给你

  • 导弹

  • DDOS :洪水攻击(饱和攻击)


7.TCP实现聊天 (打电话)

Client

public class TcpClient {
    //客户端
    public static void main(String[] args) throws IOException {
        Socket socket = null;
        OutputStream os = null;
        System.out.println("Client is running---------");
        try {
            //1.要知道服务器的ip和端口号
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            int port=9999;
            //2.创建一个socket连接
            socket = new Socket(serverIP,port);
            //3.发送消息 IO流
            os = socket.getOutputStream();
            os.write("客户端:server你好,我是客户端长城!".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            socket.close();
            os.close();
        }
    }
}

Server

public class TcpServer {
    //服务器端
    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream inputStream =null;
        ByteArrayOutputStream baos = null;
        System.out.println("Server is running--------");
        try {
            //1.作为服务器,我得有一个地址 和端口
            serverSocket = new ServerSocket(9999);
            //2.等待客户端连接我
            socket = serverSocket.accept();
            //3.读取客户端发来的信息
            inputStream = socket.getInputStream();
​
            //管道流(显式读取到得数据)
            baos = new ByteArrayOutputStream();
​
            byte[] buffer = new byte[1024];
            int len;
            while ((len=inputStream.read(buffer))!=-1){
                baos.write(buffer,0,len);
            }
            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            serverSocket.close();
            socket.close();
            inputStream.close();
            baos.close();
        }
    }
}

8. TCP实现文件上传

-


9.初步认识tomcat


10. UDP 消息发送 (发短信)

发短信:不用连接,只需知道对方地址即可。

//模拟A向B发送短信

A:
public class UdpA {
    public static void main(String[] args) throws Exception {
        //1.创建socket,获取目标IP、Port
        DatagramSocket socket = new DatagramSocket();
        InetAddress localhost = InetAddress.getByName("127.0.0.1");//127.0.0.1即代表本主机
        int port = 8080;
​
        //2.创建(准备)数据包
        String msg = "你好啊B,我是A, 恭喜你收到了我的短信!";
​
        //数据内容、发送数据起始点 、发送数据的总长度、目标IP、目标端口port
        DatagramPacket dataPackage = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,port);
​
        //3.使用socket发送数据包
        socket.send(dataPackage);
​
        //4.关闭socket资源
        socket.close();
    }
}
B:
public class UdpB {
    public static void main(String[] args) throws Exception {
        //1.开放端口-持续监听
        DatagramSocket socket = new DatagramSocket(8080);
        
        //2.接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket dataPacket = new DatagramPacket(buffer, 0, buffer.length);//接收方
        socket.receive(dataPacket);
        
        //3.显示数据包
        System.out.println(new String(dataPacket.getData()));//新建一个Stirng对象,以便显示数据
        
        //4.关闭连接
        socket.close();
    }
}

10. UDP在线聊天

1. 循环获取键盘输入+循环获取发送发的内容

(1)循环接收键盘输入

//模拟A向B发送短信场景
public class UdpA {
    public static void main(String[] args) throws Exception{
        //1.打开socket,获取目标ip与端口
        DatagramSocket socket = new DatagramSocket();
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        int port = 8080 ;
​
        //2.准备数据包(讲原本写死的转换成键盘输入的)
        //String msg = "这里是A,呼叫B,听到请回答!";
        while(true){
            BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));//获取键盘的输入
            String msg = reader.readLine();
            DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,inetAddress,port);
​
            if(datagramPacket.getData().equals("bye")){
                break;
            }
            //3.发送数据包
            socket.send(datagramPacket);
        }
​
        //4关闭资源
        socket.close();
    }
}

(2)循环接受发送方的内容

public class UdpB {
​
    public static void main(String[] args) throws Exception{
        //1,使用socket,持续监听
        DatagramSocket socket = new DatagramSocket(8080);
​
        while(true){
            //2.接收数据
            byte[] buffer = new byte[1024];
            DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
            socket.receive(packet);
            if (packet.getData().equals("bye")) {
                break;
            }
            //3.显示数据
            System.out.println(new String(packet.getData()));
        }
        //4.关闭资源
        socket.close();
    }
}

2. 引入多线程实现同时在线聊天

-


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北溟南风起

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值