Day43 网络编程入门

网络编程入门

  1. 网络编程是在网络通信协议下,实现网络互联的不同计算机上运行的程序间可以进行数据交换。

  2. 网络编程三要素: IP地址:为每台计算机指定一个标识,通过标识号来指定要接收数据的计算机和识别发送的计算机,而Ip地址就是标识号(设备标识)。端口:是应用程序的标识,网络通信是应用程序通信,计算机有多个程序,通信时需要端口区分。 协议:通过计算机网络使多台计算机连接,位于同一个网络中的计算机进行连接和通信需要遵守一定规则(网络通信协议),它对数据传输格式,速率,步骤有统一规定,通信双方同时遵守才能完成数据交换。常见协议有UDP协议和TCP协议。

  3. IP地址(IP v4 IP v6):常用命令:ipconfig:查看本机IP地址 ping IP地址:检查网络是否连通

  4. InetAddress的使用:为了方便对IP地址的获取和操作,Java提供了一个类InetAddress使用。

InetAddress:此类表示Internet协议(IP)地址

方法名说明
static InetAddress getByName(String host)确认主机名称的IP地址,主机名称可以是机器名称,也可以是IP地址
String getHostName()获取此IP地址的主机名
String getHostAddress()返回文本显示中的IP地址字符串
public class InetAddressDemo{
    public static void main(String[] args) throws UnknownHostExcetion{
        //确定主机名称IP地址
        InetAddress address = InetAddress.getByName("192.168.1.66");
        //获取IP地址主机名
        String name = address.getHostName();
        //返回文本显示中IP地址字符串
        String ip = address.getHostAddress();
        System.out.println("主机名:"+name);
        System.out.println("IP地址:"+ip);
    }
}
  1. 端口是设备上应用程序的唯一标识

    端口号是用两个字节表示的整数,取值范围是0~65535,其中0~1023之间的端口号用于一些知名的网络服务和应用,普通程序需要使用1024以上的端口号,如果端口号被占用,会导致当前程序启动失败。

  2. 协议是连接和通信的规则:UDP协议(用户数据报协议User Datagram Protocol)UDP是无连接通信协议,发送端和接收端不建立逻辑连接。发送到不会确认接收端是否存在就发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据(消耗资源小,通信效率高,用于音频,视频和普通数据传输)

    TCP协议(传输控制协议Transmission Control Protocol)是面向连接的通信协议,在传输数据之前,在发送到和接收端建立逻辑连接,然后传输数据,提供可靠无差错的数据传输。连接要明确客户端和服务器端,由客户端向服务器端发出连接请求,每次连接的创建都需要经过“三次握手” (1 客户端发出连接请求,等待确认 2 服务器端回送响应,通知客户端收到连接请求 3 客户端再次发送确认信息,确认连接)上传,下载文件和浏览网页等。

//UDP协议
public class SendDemo{
    public static void main(String[] args) throws IOException{
        //创建发送端Socket对象
        //DatagramSocket()构造数据报套接字并将其绑定到本地主机上的任何可用端口
        DatagramSocket ds = new DatagramSocket();
        //DatagramPacket(byte[] buf,int length, InerAddress address, int port)
        //构造数据包,发送长度为length的数据包到指定主机上的指定端口号
         byte[] bys = "hello,udp,我来了".getBytes();
        int length = bys.length;
        InetAddress address = InetAddress.getByName("192.168.1.16");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bys,length,address,port);
        //调用DatagramSocket对象方法发送数据
        //void send (DatagramPacket p)从此套接字发送数据报包
        ds.send(dp);
        //关闭发送端
        ds.close();
    }
}
public class ReceiveDemo{
     public static void main(String[] args) throws IOException{
         //创建接收端Socket对象
         //构造数据报套接绑定到本地主机上指定端口
         DatagramSocket ds = new DatagramSocket(10086);
         //创建数据包,接收数据
         byte[] bys = new byte[1024];
         DatagramPacker dp = new DatagramPacker(bys,bys.length);
         //调用DatagramSocket对象方法接收数据
         ds.receive(dp);
         byte[] datas = dp.getData();
         int len = dp.getLength();
         String dataString = new String(datas,0,len);
         System.out.println("数据是:"+dataString);
         //关闭接收端
         ds.close();
         
}
//TCP协议
//TCP发送数据
public class ClientDemo{
    public static void main(String[] args) throws IOException{
        //创建客户端Socket对象
        Socket s = new Socket("192.168.1.66",10000);
        //获取输出流,写数据
        OutputStream os s.getOutputStream();
        os.write("hello,tcp,我来了".getBytes());
        //释放资源
        s.close();
    }
}
//TCP接收数据,服务器端
public class ServerDemo{
    public static void main(String[] args) throws IOException{
        //创建服务器端的Socket对象
        ServerSocket ss = new ServerSocket(10000);
        //侦听要连接到此套接字并接受它
        Socket s = ss.accept();
        //获取输入流,读数据,把数据显示在控制台
        InputStream is = s.getInputStream();
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("数据是:"+data);
        //释放资源
        s.close();
        ss.close();
    }
}

  1. 案例:UDP发送数据(数据来自键盘录入,直到输入数据886,结束) UDP接收数据(不知道发送端停止时间,采用死循环接收)

public class SendDemo{
    public static void main(String[] args) throws IOException{
        //创建发送端Socket对象
        DatagramSocket ds = new DatagramSocket();
        //自己封装键盘录入数据
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line;
        while ((line = br.readLine())!=null){
            if("886".equals(line)){
                break;
            }
            byte[] bys = line.getBytes();
            DatagramPacket dp=new                           DatagramPacker(bys,bys.length,InetAddress.getByName("192.168.1.16"),12345);
            //调用DatagramSocket对象方法发送数据
            ds.send(dp);
        }
        //关闭发送端
        ds.close();}}
//接收端
public class ReceiveDemo{
     public static void main(String[] args) throws IOException{
         //创建接收端Socket对象
         DatagramSocket ds = new DatagramSocket(12345);
         while(true){
             byte[] bys = new byte[1024];
             DatagramPacket dp = new DatagramPacket(bys,bys.length);
             ds.receive(dp);
             //解析数据包,并把数据在控制台显示
             System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
             //不需要关闭接收端ds.close;
         }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值