网络编程

网络编程

网络编程概述

计算机网络

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

网络编程

在网络通信协议下,不同计算即上运行的程序,可以进行数据传输

网路编程三要素

IP地址:计算机设备的标识,类似身份证的作用

端口:计算机内部各个程序之间用来识别身份的标识

协议:相互通信的规则,互相遵守才能完成数据交换,常见的协议有UDP协议和TCP协议

DOS常用命令:

ipconfig:查看本机IP地址

ping IP地址:检查网络是否连通

特殊IP地址:

127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

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 UnknownHostException {
          //InetAddress address = InetAddress.getByName("itheima");
            InetAddress address = InetAddress.getByName("192.168.1.66");
    
            //public String getHostName():获取此IP地址的主机名
            String name = address.getHostName();
            //public String getHostAddress():返回文本显示中的IP地址字符串
            String ip = address.getHostAddress();
    
            System.out.println("主机名:" + name);
            System.out.println("IP地址:" + ip);
        }
    }
    

端口和协议

端口:设备上应程序的唯一标识.俩个字节表示的整数,取值范围为0-65535.

协议分为俩个

UDP协议

面向无连接通信协议,不建立接连,只管发送和接收,这个协议消耗系统资源小,通信效率高,但是数据不安全,传输重要数据还是不建议使用UDP协议

TCP协议

面向连接的通信协议,就是在传输数据之前,先建立连接,然后在传输数据,每次连接的创建都需要经过三次握手.

三次握手:TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠

第一次握手,客户端向服务器端发出连接请求,等待服务器确认

第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

第三次握手,客户端再次向服务器端发送确认信息,确认连接

完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。由于这种面向连接的特性,TCP协议可以保证传输数据的安全,所以应用十分广泛。例如上传文件、下载文件、浏览网页等

UDP通信程序

固定信息发送

package com.heima.test;

import java.io.IOException;
import java.net.*;
//发送端
public class test09 {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        //创建数据包
        byte[] bys = "hello udp,我来了".getBytes();
        DatagramPacket ps = new DatagramPacket(bys,bys.length, InetAddress.getByName("127.0.0.1"),1234);
        ds.send(ps);
        ds.close();
    }
}
//接受端
class test091{
    public static void main(String[] args) throws Exception {
        DatagramSocket da = new DatagramSocket(1234);
        //创建一个数据包  用于接受数据
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys,bys.length);
        //调用DatagramSocket方法  接受数据
        da.receive(dp);
       System.out.println("数据是:"+new String(dp.getData(),0,dp.getLength()));
    }
}

键盘输入练习

package com.heima.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class test10 {
    public static void main(String[] args)throws Exception {
        DatagramSocket ds = new DatagramSocket();
        Scanner sc = new Scanner(System.in);
        while(true){
            String s = sc.nextLine();
            if("886".equals(s)){
                break;
            }
            //创建数据  并把数据打包
            byte[] bys = s.getBytes();
            //数据打包
            DatagramPacket dp = new DatagramPacket(bys,0,bys.length, InetAddress.getByName("127.0.0.1"),2020);
            //数据发送
            ds.send(dp);
        }
        ds.close();
    }
}
class test101{
    public static void main(String[] args)throws Exception {
        DatagramSocket ds = new DatagramSocket(2020);
        while(true){

            byte [] bys = new byte[1024];
            DatagramPacket dr = new DatagramPacket(bys,0,bys.length);
            ds.receive(dr);
            System.out.println("他说:"+new String(dr.getData(),0,dr.getLength()));
        }
    }
}

UDP组播实现

package com.heima.test;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;

//发送端
public class test11 {
    public static void main(String[] args) throws Exception{
       //创建发送端Socket对象
        DatagramSocket socket = new DatagramSocket();
        String s ="你好,信号良好吗";
        byte [] bytes = s.getBytes();
        InetAddress inetAddress = InetAddress.getByName("224.0.1.0");//组播 地址  224.0.1.0
        int port = 10000;
        //打包
        DatagramPacket packet = new DatagramPacket(bytes,bytes.length,inetAddress,port);
        //调用DatagramSocket对象的方法发送给数据(在单播中,这是发给指定IP 电脑但是在组播中,这是发给组播地址)
        socket.send(packet);

        socket.close();
    }
}
//接收端
class test110{
    public static void main(String[] args) throws Exception{
        //创建接受端Socket对象(MulticastSocket)
        MulticastSocket ms = new MulticastSocket(10000);
        //创建一个箱子
        DatagramPacket box = new DatagramPacket(new byte[1024],1024);
        //把当前计算机绑定一个组播地址,表示添加到这一组中
        ms.joinGroup(InetAddress.getByName("224.0.1.0"));
        //将数据接收到箱子中
        ms.receive(box);
        //解析数据包
        byte[] data = box.getData();
        int len = box.getLength();
        System.out.println(new String(data , 0,len));
        ms.close();
    }
}

UDP广播实现

package com.heima.test;

import javax.xml.transform.SourceLocator;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//发送端
public class test12 {
    public static void main(String[] args)throws Exception {
//        1. 创建发送端Socket对象(DatagramSocket)
        DatagramSocket socket = new DatagramSocket();
//        2. 创建存储数据的箱子,将广播地址封装进去
        String s = "嗨喽,你们都在吗";
        byte [] bys = s.getBytes();
        InetAddress address = InetAddress.getByName("255.255.255.255");
        DatagramPacket dp = new DatagramPacket(bys,0,bys.length,address,10000);
//        3. 发送数据
        socket.send(dp);
//        4. 释放资源
        socket.close();
    }
}
//接收端
class test121{
    public static void main(String[] args) throws  Exception{
//        1. 创建接收端的Socket对象(DatagramSocket)
        DatagramSocket socket = new DatagramSocket(10000);
//        2. 创建一个数据包,用于接收数据
        byte [] bytes = new byte[1024];
//        3. 调用DatagramSocket对象的方法接收数据
        DatagramPacket dp = new DatagramPacket(bytes,0,bytes.length);
//        4. 解析数据包,并把数据在控制台显示
        socket.receive(dp);
       byte[] data =  dp.getData();
       int length = dp.getLength();
        System.out.println(new String(data,0,length));
//        5. 关闭接收端
        socket.close();
    }
}

TCP通信程序

Java中的TCP通信

Java对基于TCP协议的网络提供了良好的封装,使用Socket对象来代表俩端的通信端口,并通过Socket产生了IO流来进行网络通信

Java为客户端提供了Socket类,为服务器提供了ServerSocket类

TCP发送数据和TCP接受数据

package com.heima.test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//发送信息
public class test13 {
    public static void main(String[] args) throws IOException {
        //创建客户端的Socket对象       Socket(String host,int port)
        Socket s = new Socket("127.0.0.1",10000);
        //获取输出流 写数据  OutputStream getOutputStream() 返回输出流
        OutputStream os = s.getOutputStream();
        os.write("你好昂啊 我是好人".getBytes());
        //释放资源
        s.close();
    }
}
//接受信息
class test131{
    public static void main(String[] args) throws IOException {
        //创建服务器端的Socket对象(ServerSocket)
        //SrverSocket(int port)  创建绑定到指定端口的服务器套接字
        ServerSocket ss = new ServerSocket(10000);
        //等待连接     侦听要连接到次套接字并接受它
        Socket accept = ss.accept();
        //获取输入流  读数据 把数据显示在控制台上
        InputStream is = accept.getInputStream();
        byte [] bys = new byte[1024];
        int len = is.read(bys);
        String data = new String(bys,0,len);
        System.out.println("数据是:"+data);
        //释放资源
        is.close();
        accept.close();
        ss.close();

    }
}

TCP程序练习

  • 案例需求

    客户端:发送数据,接受服务器反馈

    服务器:收到消息后给出反馈

  • 案例分析

    • 客户端创建对象,使用输出流输出数据
    • 服务端创建对象,使用输入流接受数据
    • 服务端使用输出流给出反馈数据
    • 客户端使用输入流接受反馈数据
  • 代码实现

    package com.heima.test;
    
    import java.io.BufferedInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    //客户端
    public class test14 {
        public static void main(String[] args) throws IOException {
            //客户端发送确认信息
            Socket s = new Socket("127.0.0.1",2021);
            OutputStream os = s.getOutputStream();
            os.write("你好,服务器".getBytes());
            s.shutdownOutput();//如果  os.close(); 将流关闭 会导导致整个socket都无法使用
            //Socket中的shutdownOutput()方法仅仅关闭输出流
            BufferedInputStream bis = new BufferedInputStream(s.getInputStream());//使用字符缓冲流最方便
            int len;
            byte[] buffer = new byte[1024];
            while((len=bis.read(buffer)) != -1){
                System.out.println(new String(buffer,0,len));
            }
            bis.close();
            os.close();
            s.close();
        }
    }
    //服务器
    class test141{
        public static void main(String[] args) throws IOException {
            ServerSocket ss = new ServerSocket(2021);
            Socket accept = ss.accept();
            InputStream is = accept.getInputStream();
            int len;
            byte [] buffer = new byte[1024];
            while((len=is.read(buffer)) != -1){
                System.out.println(new String(buffer,0,len));
            }
            System.out.println("看看我执行了吗");
            OutputStream os = accept.getOutputStream();//使用字符缓冲流最方便
           os.write("你谁啊".getBytes());
           os.close();
           is.close();
            accept.close();
           ss.close();
    
        }
    }
    

    TCP程序文件上传练习

package com.heima.test;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//客户端
public class test15 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",2021);
        //读取本地文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream("E:\\ps.cc\\ps素材\\证件照\\蕊.jpg"));
        //发送到网络流
        OutputStream os = socket.getOutputStream();
        int len;
        byte [] buffer= new byte[1024];
        while((len=bis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        socket.shutdownOutput();
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String line;
        while((line=br.readLine()) != null){
            System.out.println(line);
        }
        bis.close();
        br.close();
        socket.close();

    }
}
//服务器端
class test151{
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(2021);
        Socket accept = ss.accept();
        //接受客户端发来的文件
        BufferedInputStream bis = new BufferedInputStream(accept.getInputStream());
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("itHeiMa\\美女.jpg"));
        int len;
        byte [] buffer = new byte[1024];
        while((len=bis.read(buffer))!=-1){
            bos.write(buffer,0,len);

        }

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
        bw.write("上传成功");

        bw.close();
        bis.close();
        accept.close();
        bos.close();
        ss.close();
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容