IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> JavaDay4——网络编程 -> 正文阅读

[网络协议]JavaDay4——网络编程

1、什么是网络编程:
网络编程就是通过写的一段程序代码在多台计算机中相互交换数据
2、网络编程三要素:
ip地址:想让网络中的计算机相互通信,必须为每台计算机都指定一个标识符,来指定接收数据,ip就是这个标识符,也是设备的标识。
端口:网络通信本质上是两个应用程序的通信,计算机中有很多的应用程序,可以说ip地址是两台计算机通信的标识符,那么端口就是应用程序的标识符。
通信协议:是计算机相互通信需要遵守的规则,它对传输速率,传输格式等一些有具体的规定,只有双方都遵守规定才可以进行数据交换。常用的协议有UDP和TCP协议
3、InetAdress类的使用
这个类没有构造方法(所以不能直接使用new关键字)但是可以用静态的方法(InetAddress.getByName(“String”);String 可以是主机名或者是主机IP地址)来获得。通过InterAddress.getHostName()获取当前主机的名字;通过InterAddress.getHostAddress()获取当前主机IP地址,都是通过文本形式返回的。

public static void main(String[] args) throws UnknownHostException {
        InetAddress inetAddress =InetAddress.getByName("192.168.3.3");//通过静态方法getByName获得
        String name=inetAddress.getHostName();//通过文本形式显示当前主机名
        String address=inetAddress.getHostAddress();//通过文本形式获得当前主机IP地址
        System.out.println(name);
        System.out.println(address);
    }

在这里插入图片描述

什么是UDP协议:UDP是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
UDP发送数据步骤:
1、创建一个socket对象,
2、创建数据包,并把数据打包
3、调用DatagramSocket对象发送数据
4、关闭发送端

		//1、创建一个socket对象
        DatagramSocket ds = new DatagramSocket();
        //2、创建数据包,并把数据打包
        byte [] bys="hello,UDP".getBytes();
        //创建一个DatagramPack数据报包对象
        DatagramPacket dp = new DatagramPacket(bys,bys.length,InetAddress.getByName("192.168.3.3"),10086);
        // 3、调用DatagramSocket对象发送数据
        ds.send(dp);
        // 4、关闭发送端
        ds.close();

UDP接收数据步骤:
1、创建一个socket对象,
2、创建数据包,并把数据打包
3、调用DatagramSocket对象中的方法接收数据
4、解析数据,并在控制台显示
4、关闭接收端

//    UDP接收数据步骤:
    public static void main(String[] args) throws IOException {
        //1、创建一个DatagramSocket对象
        DatagramSocket ds = new DatagramSocket(10086);
//2、创建数据包,并把数据打包
        byte[] bys=new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, bys.length);
//3、调用DatagramSocket对象中的方法接收数据
        ds.receive(dp);
//4、解析数据,并在控制台显示
        System.out.println("数据是:"+new String(dp.getData(),0,bys.length));
//4、关闭接收端
        ds.close();
    }

什么是TCP协议:TCP是一种可靠的网络协议,它在通信的两端都建立了socker对象,从而在通信的两端形成网络虚拟链路。Java为TCP协议的通信提供了很好的封装,使用socket对象表示通信两端的端口,并通过socker对象产生的IO流来进行网络通信,Java为客户端提供Socket类,为服务端提供ServerSocket类
TCP协议发送数据步骤:
1、创建Socket对象
2、获取输出流,写数据
3、释放资源

public static void main(String[] args) throws IOException {
        Socket socket = new Socket("192.168.3.3",10000);//创建Socket对象,指定Host和port
        OutputStream outputStream = socket.getOutputStream();//获取输出流,写数据
        outputStream.write("hello,tcp".getBytes());//写数据
        socket.close();//释放资源
    }

TCP协议接收数据步骤:
1、创建ServerSocket对象
2、监听客户端连接,返回一个socket对象
2、获取输入流,读数据,并显示在控制台上
3、释放资源

public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(10000);//创建ServerSocket对象,指定port
        Socket ss = serverSocket.accept();//监听客户端的连接
        InputStream is = ss.getInputStream();//获取输入流,读数据
        byte[] bys=new byte[1024];
        System.out.println("数据是:"+new String(bys,0,is.read(bys)));//解析数据,并显示在控制台上
        serverSocket.close();//释放资源
    }

TCP通信练习:
1、客户端获取键盘输入,886作为结束 服务端接受客户端输入。

public class test05_Client {
    public static void main(String[] args) throws IOException {
        //创建Socket对象
        Socket s = new Socket("192.168.3.3",10000);
        //获取输出流对象
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//从键盘录入数据
        //封装输出流对象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line=br.readLine())!=null){
            if("886".equals(line)){
                break;
            }
            bw.write(line);//将指定的字节写入缓冲的输出流。
            bw.newLine();//写一个行分隔符。
            bw.flush();//刷新缓冲输出流。
        }
        s.close();

    }
}
public class test05_Server {
    public static void main(String[] args) throws IOException {
        //创建一个ServerSocket对象
        ServerSocket ss = new ServerSocket(10000);
        //监听
        Socket s = ss.accept();
        //获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        //解析数据,显示在控制台上
        String line;
        while ((line=br.readLine())!=null){//确保获取内容不为空
            System.out.println(line);
        }
        ss.close();
    }
}

2、客户端获取键盘输入,886作为结束 服务端接受客户端输入,存储到文本中。
因为客户端和1一致就不贴代码了

public class test05_Server {
    public static void main(String[] args) throws IOException {
        //创建一个ServerSocket对象
        ServerSocket ss = new ServerSocket(10000);
        //监听
        Socket s = ss.accept();
        //获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        BufferedWriter bw = new BufferedWriter(new FileWriter("text.txt",true));//写内容到文件中,追加方式写进
        while ((line=br.readLine())!=null){//确保获取内容不为空
            bw.append(line);
            bw.newLine();
            bw.flush();
        }
        bw.close();
        ss.close();
    }
}

3、客户端获取文本文件内容获得服务端给出的反馈 服务端接受客户端输入,存储到文本中,给客户端一个反馈。

Socket s = new Socket("192.168.3.3",10000);
        BufferedReader br = new BufferedReader(new FileReader("textClient.txt"));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line;
        while ((line=br.readLine())!=null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //void	shutdownOutput()
        //Disables the output stream for this socket.
        s.shutdownOutput();//Disables the output stream for this socket.
        //接收反馈
        BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
        System.out.println("服务器的反馈"+brClient.readLine());
        br.close();
        s.close();

在写服务器反馈遇到的问题是,客户端在读取完文本文件后开始获取服务端的反馈,但是服务器端仍然在等待客户端发送数据,没有结束等待。解决办法:在客户端读取文本文件结束后,调用shutdownOutput()方法来告诉服务端已经停止读取了。也可以自定义一个结束标记但是不推荐使用

public static void main(String[] args) throws IOException {
        //创建一个ServerSocket对象
        ServerSocket ss = new ServerSocket(10000);
        //监听
        Socket s = ss.accept();
        //获取输入流
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line;
        BufferedWriter bw = new BufferedWriter(new FileWriter("textServer.txt",true));//写内容到文件中,追加方式写进
        while ((line=br.readLine())!=null){//确保获取内容不为空
            bw.append(line);
            bw.newLine();
            bw.flush();
        }
        //给出反馈
        BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        bwServer.write("文件上传成功");
        bwServer.newLine();
        bwServer.flush();
        bw.close();
        ss.close();
    }

4、客户端获取文本文件内容 服务端接受客户端输入,存储到文本中,代码用线程封装一个客户端一个线程。

ServerSocket ss = new ServerSocket(10000);
        Socket s = ss.accept();
        //为每一个客户端开启一个线程
        new Thread(new ServerThread(s)).start();
class ServerThread implements Runnable {
    private Socket s;
    public ServerThread(Socket s) {
        this.s=s;
    }

     @Override
     public void run() {
         try {
             int count=0;
             BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
             //避免文件名重复
             File file = new File("text[" + count + "].txt");
             String line;
             while (file.exists()){
                 count++;
                 file = new File("text[" + count + "].txt");
             }
             BufferedWriter bw = new BufferedWriter(new FileWriter(file));
             while ((line=br.readLine())!=null){
                 bw.write(line);
                 bw.newLine();
                 bw.flush();
             }
//             给出反馈
             BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
             bwServer.write("文件上传成功");
             bwServer.newLine();
             bwServer.flush();
             s.close();
         } catch (IOException e) {
             e.printStackTrace();
         }
     }
 }

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-07-28 08:11:23  更:2021-07-28 08:14:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 22:04:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码