学习java 第八天

网络编程

打电话:TCP 发短信:UDP

网络通信的要素

1、网络编程中有两个主要的问题

  • 如何准确的定位网络上的一台或多台主机

  • 找到主机之后如何进行编程

2、网络编程中的要素

  • ip 和 端口号

  • 网络通信协议 UDP TCP

3、万物皆对象

IP

ip地址:InetAddress(无构造器)

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

  • 127.0.0.1 : 本机localhost

  • ip地址分类

    • ipv4/ipv6

      • ipv4 127.0.0.1 ,由4个字节组成,,0-255 ,42亿个;

      • ipv6 128位 ,8个无符号整数

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

      • 192.168.xx.xx 专门给组织内部使用

      • ABCD类地址

端口

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

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

  • 被规定 0-65536

  • 单个协议下,端口号不能冲突

  • 端口分类

    • 公有端口 0~1023

      • http:80

      • https:443

      • ftp:21

      • Telent:23

    • 程序注册端口: 1024-49151,分配用户程序

      • Tomcat:8080

      • MySQL:3306

      • Oracle:1521

    • 动态、私有端口:49152~65535

      • cmd查看所有端口:netstat -ano

      • cmd查看指定端口:netstat -ano|findstr “”

通信协议

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

TCP/IP:用户传输协议 UDP:用户数据协议

TCP UDP对比:

  • TCP:打电话

    • 连接,稳定

    • 三次握手,四次挥手

      • 至少需要三次通信才能保证稳定连接(/ \ /)

      • 至少需要四次通信才能保证断开(/ \ \ /)

    • 客户端,服务端

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

  • UDP:发短信

    • 不连接,不稳定

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

    • 无论有没有准备好,都可以发

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

TCP

客户端

1、连接服务器Socket

2、发送消息

服务器

1、建立服务的端口 SeverSocket

2、等待用户的连接 accept

3、接收用户的消息

Tomcat

服务端

  • 自定义S

  • Tomcat服务器S : java后台开发!

客户端

  • 自定义C

  • 浏览器B

★ 同一个协议下端口号不能重复使用

UDP

发短信:不用连接,需要知道对方的地址

发送端

package UDP;
​
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
​
public class udpClientDemo01 {
public static void main(String[] args) throws Exception {
   //创建socket
   DatagramSocket socket = new DatagramSocket();
   //建一个包
   String msg = "你好呀,服务器!";
​
   InetAddress localhost = InetAddress.getByName("localhost");
​
   int poor = 9090;
   //发送的数据,数据长度,发送给谁,
   DatagramPacket Packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,localhost,poor);
   //发送数据
   socket.send(Packet);
   //关闭流
   socket.close();
}
}
​

接收端

package UDP;
​
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
​
public class udpServerDemo01 {
public static void main(String[] args) throws Exception {
   //开放端口
   DatagramSocket socket = new DatagramSocket(9090);
   //接收数据包
   byte[] buffer = new byte[1024];
   DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
   socket.receive(packet);
   System.out.println(new String(packet.getData(),0,packet.getLength()));
   //关闭连接
   socket.close();
}
}
​

互相发送(模拟聊天)

发送方

import java.awt.desktop.SystemSleepEvent;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
​
public class TalkSend implements Runnable{
    DatagramSocket socket = null;
    BufferedReader reader = null;
​
    private int  fromprot;
    private String toIP;
    private int toPort;
​
    public TalkSend(int fromprot, String toIP, int toPort) {
        this.fromprot = fromprot;
        this.toIP = toIP;
        this.toPort = toPort;
        try {
            socket = new DatagramSocket(fromprot);
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }
​
    @Override
    public void run() {
        while (true){
            try {
                String data = reader.readLine();
                byte[] datas = data.getBytes();
                DatagramPacket packet = new DatagramPacket(datas,0,datas.length, new InetSocketAddress(this.toIP,this.toPort));
                socket.send(packet);
​
                if (data.equals("bye")){
                    break;
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

接收方

import javax.sound.sampled.Port;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
import java.net.SocketException;
import java.text.BreakIterator;
​
public class TalkReceive implements Runnable{
    DatagramSocket socket = null;
    private int Prot;
    private  String from;
​
    public TalkReceive( int Prot,String from) {
        this.Prot = Prot;
        this.from = from;
        try {
            socket = new DatagramSocket(Prot);
        }catch (SocketException e){
            e.printStackTrace();
        }
​
    }
​
    @Override
    public void run() {
        while (true){
            try {
                //准备接收包裹
                byte[] bytes = new byte[1024];
                DatagramPacket Package = new DatagramPacket(bytes,0,bytes.length);
                socket.receive(Package);//阻塞式接收包
​
                //断开连接 bye
                byte[] data = Package.getData();
                String receivedata = new String(data,0,data.length);
                System.out.println(from+":"+receivedata);
​
                if (receivedata.equals("bye")){
                    break;
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        socket.close();
    }
}

URL

统一资源定位符:用来定位互联网上的某一个资源

协议://IP地址:端口/项目名/资源
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值