0
点赞
收藏
分享

微信扫一扫

Java网络编程基础

前行的跋涉者 2022-02-27 阅读 67

文章目录

一.网络通信概念

1.网络通信
在这里插入图片描述
2.网络
在这里插入图片描述
3.ip地址
在这里插入图片描述
在这里插入图片描述
4.域名和端口
在这里插入图片描述
通过ping指令可以查询对应域名的ip
在这里插入图片描述
5.网络协议
人类语言的本身也是一种协议!
在这里插入图片描述
在这里插入图片描述
6.TCP和UDP
在这里插入图片描述
7.Socket
在这里插入图片描述

二.代码

1.InetAddress
在这里插入图片描述

import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * @author ZHR
 * @version 1.0
 **/
public class InetAddress_ {
    public static void main(String[] args) throws UnknownHostException {
        //1.获取本机的InetAddress对象
        System.out.println(InetAddress.getLocalHost());//DESKTOP-9GPVRSO/10.165.181.208

        //2.根据指定主机名获取InetAddress对象
        System.out.println(InetAddress.getByName("DESKTOP-9GPVRSO"));//DESKTOP-9GPVRSO/10.165.181.208

        //3.根据域名获取InetAddress对象
        System.out.println(InetAddress.getByName("www.baidu.com"));//www.baidu.com/180.101.49.12

        //4.通过InetAddress对象获取对应IP地址
        System.out.println(InetAddress.getByName("www.baidu.com").getHostAddress());//180.101.49.12

        //5.通过InetAddress对象获取对应的主机名
        System.out.println(InetAddress.getLocalHost().getHostName());//DESKTOP-9GPVRSO
    }
}

2.TCP网络编程
在这里插入图片描述
在这里插入图片描述

字节流编程
在这里插入图片描述

服务端代码:

package socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {

        //1.在本机 端口9999监听 ,等待连接
        //细节:要求本机没有其他服务器监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);

        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回一个socket对象
        //这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
        Socket socket = serverSocket.accept();

        //3.接收服务器传的数据,显示数据
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen = inputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,readLen));
        }

        //4.向服务端发送数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello client".getBytes());
        socket.shutdownOutput();

        //5.关闭流和socket
        socket.close();
        inputStream.close();
        outputStream.close();
        serverSocket.close();
    }
}

客户端代码:

package socket;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {

        //1.在本机 端口9999监听 ,等待连接
        //细节:要求本机没有其他服务器监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);

        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回一个socket对象
        //这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
        Socket socket = serverSocket.accept();

        //3.接收服务器传的数据,显示数据
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen = inputStream.read(buf))!=-1){
            System.out.println(new String(buf,0,readLen));
        }

        //4.向服务端发送数据
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("hello client".getBytes());
        socket.shutdownOutput();

        //5.关闭流和socket
        socket.close();
        inputStream.close();
        outputStream.close();
        serverSocket.close();
    }
}

注意!
需要用socket.shutdownOutput() 提示已经发送完成

字符流编程
在这里插入图片描述
注意!!!!!!

1.字符流写的时候需要手动刷新!!!! flush!!

2. bufferedWriter.newLine() 表示写入内容结束,相当于socket.shutdownOutput() ,但是要求对方使用readline()方法接受!

3.需要用转换流进行转换

服务端代码:

package zijieliu;

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

/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.在本机 端口9999监听 ,等待连接
        //细节:要求本机没有其他服务器监听9999端口
        ServerSocket serverSocket = new ServerSocket(9999);

        //2.当没有客户端连接9999端口时,程序会阻塞,等待连接
        //如果有客户端连接,则会返回一个socket对象
        //这个serverSocket可以通过accept()返回多个socket[],多个客户端连接服务器
        Socket socket = serverSocket.accept();

        //3.接收服务器传的数据,显示数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //需要用readline()方法读
        System.out.println(bufferedReader.readLine());


        //4.向服务端发送数据
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("hello client");
        bufferedWriter.newLine();
        bufferedWriter.flush();
        //socket.shutdownOutput();

        //5.关闭流和socket
        socket.close();
        bufferedWriter.close();
        bufferedReader.close();
        serverSocket.close();

    }
}

客户端代码:

package zijieliu;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

/**
 * @author ZHR
 * @version 1.0
 **/
public class Client {
    public static void main(String[] args) throws IOException {
        //客户端发送hello server送给服务端

        //1.连接服务器(服务器ip,端口),连接本机的9999端口
        Socket socket = new Socket(InetAddress.getLocalHost(),9999);

        //2.连接上后,得到和该socket关联的输出流,通过该流发送内容
        //使用字符流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bufferedWriter.write("hello server");
        bufferedWriter.newLine();//表示写入内容结束,要求对方使用readline()方法读!
        bufferedWriter.flush();

        //提示已经发送完成
        //socket.shutdownOutput();

        //3.接受服务端发送的数据
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        System.out.println(bufferedReader.readLine());

        //4.关闭流和socket
        bufferedReader.close();
        bufferedWriter.close();
        socket.close();



    }
}

上传文件
在这里插入图片描述

采取边读边写的方法

客户端代码:

        //提供端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //接受socket
        Socket socket = serverSocket.accept();

        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("src/copy.jpg"));
        BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
        //边读边写
        byte[] buf = new byte[1024];
        int readLen = 0;
        while((readLen = bis.read(buf))!=-1){
            bos.write(buf,0,readLen);
            bos.flush();
        }


        //关闭流
        serverSocket.close();
        socket.close();
        bos.close();
        bis.close();

客户端代码:

        //连接服务端
        Socket socket = new Socket(InetAddress.getLocalHost(),8888);
        //设置客户端传入文件的路径
        String filePath = "c:/io/copy.jpg";
        //讲数据送到通路,边读边写
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        int readLen = 0;
        byte[] buf = new byte[1024];
        while((readLen = bis.read(buf))!=-1){
            bos.write(buf,0,readLen);
            bos.flush();
        }
        //告诉客户端已经写完
        socket.shutdownOutput();
        //关闭流
        bos.close();
        bis.close();
        socket.close();

3.netstat
在这里插入图片描述
4.UDP网络编程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发送端代码:

package UDP;

import java.io.IOException;
import java.net.*;

/**
 * @author ZHR
 * @version 1.0
 **/
public class Server {
    public static void main(String[] args) throws IOException {
        //1.创建 DatagramSocket 对象,准备在9998端口数据 接受/发送数据
        DatagramSocket socket = new DatagramSocket(9998);

        //2.讲需要发送的数据封装到DatagramPacket对象
        byte[] data = "明天吃火锅吗".getBytes();

        //new DatagramPacket(byte内容数组,数组长度,ip地址,端口)
        DatagramPacket packet =
                new DatagramPacket(data,data.length, InetAddress.getByName("10.165.181.208"),9999);

        //3.发送数据
        socket.send(packet);

        byte[] receiveData = new byte[1024];
        DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);
        socket.receive(receivePacket);

        int length = receivePacket.getLength();
        receiveData = receivePacket.getData();
        System.out.println(new String(receiveData,0,length));
        
        socket.close();
    }
}

接收端代码:

package UDP;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

/**
 * @author ZHR
 * @version 1.0
 **/
public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建一个 DatagramSocket 对象,在9999端口接受对象
        DatagramSocket socket = new DatagramSocket(9999);

        //2.创建一个 DatagramPacket 对象 , 准备接收数据
        //  UDP中,一个数据包最大传送的大小为64k

        byte[] buf = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buf,buf.length);
        //3.调用接收方法,讲网络上传输的 DatagramPacket 对象填充到 socket对象
        //  当有数据包发送到本机的9999端口时,就会接收到数据,否则,就会阻塞等待
        socket.receive(packet);

        //4.讲packet进行拆包,取出数据,并提示
        int length = packet.getLength();
        byte[] data = packet.getData();
        System.out.println(new String(data,0,length));

        byte[] dataSend = "收到".getBytes();
        DatagramPacket sendPacket =
                new DatagramPacket(dataSend,dataSend.length, InetAddress.getLocalHost(),9998);
        socket.send(sendPacket);

        socket.close();


    }
}

举报

相关推荐

0 条评论