网络编程

1、InetAddress类

概念

  • 表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。

方法

// 获得本地 主机地址对象
public static InetAddress getLoclHost()

// 根据主机名称获得地址对象
public static InetAddress getByName(String host)

// 获得所有相关地址对象
public static InetAddress[] getAllByName(String host)

// 获取IP地址字符串
public String getHostAddress()

// 获得IP地址主机名
public String getHostName()
package com.kingtl.NetCode;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * InetAddress类
 * 1、创建本机IP地址对象
 * 2、创建局域网IP地址对象
 * 3、创建外网IP地址对象
 */
public class Demo01 {
    public static void main(String[] args) throws Exception {
        // 1、创建本机IP地址对象
        //1.1 getLocalhost() 方法
        InetAddress ia1 = InetAddress.getLocalHost();
        System.out.println("ip地址:"+ia1.getHostAddress()+" 主机名:"+ia1.getHostName());
        // 1.2 getByName("ip地址")
        InetAddress ia2 = InetAddress.getByName("192.168.5.99");
        System.out.println("ip地址:"+ia2.getHostAddress()+" 主机名:"+ia2.getHostName());
        // 1.3 getByName("127.0.0.1")
        InetAddress ia3 = InetAddress.getByName("127.0.0.1");
        System.out.println("ip地址:"+ia3.getHostAddress()+" 主机名:"+ia3.getHostName());
        // 1.4 getByName("localhost)
        InetAddress ia4 = InetAddress.getByName("localhost");
        System.out.println("ip地址:"+ia4.getHostAddress()+" 主机名:"+ia4.getHostName());


        // 2、创建局域网的IP地址对象
        //InetAddress ia5 = InetAddress.getByName("192.168.5.10");
        //System.out.println("ip地址:"+ia5.getHostAddress()+" 主机名:"+ia5.getHostName());
        //System.out.println("2秒钟是否可达:"+ia5.isReachable(2000));

        // 3、创建外网IP地址对象
        InetAddress ia6 = InetAddress.getByName("www.baidu.com");
        System.out.println("ip地址:"+ia6.getHostAddress()+" 主机名:"+ia6.getHostName());
        System.out.println("2秒钟是否可达:"+ia6.isReachable(2000));

        InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");
        for (InetAddress ia : ias) {
            System.out.println(ia.getHostAddress());
        }
    }
}

2、基于TCP的网络编程

Socket编程

  • Socket(套接字)是网络中的一个通信节点。
  • 分为客户端Socket与服务器ServerSocket。
  • 通信要求:IP地址 + 端口号。

开发步骤

服务器端
  • 创建ServerSocket,指定端口号。
  • 调用accept等待客户端接入。
  • 使用输入流接收请求数据到服务器(等待)
  • 使用输出流发送响应数据给客户端
  • 释放资源
客户端:
  • 创建Socket,指定服务器IP + 端口号
  • 使用输出流发送请求数据给服务器。
  • 使用输入流接收响应数据到客户端(等待)

3、案例部分

4、单客户端发送数据给服务器端

服务器端代码:

package com.kingtl.NetCode;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基于TCP协议的服务器端开发
 * 1、创建ServerSocket ,并制定端口号
 * 2、调用accept() ,接收客户端请求
 * 3、获取输入流,读取客户端发送的数据
 * 4、获取输出流,发送数据给客户端
 * 5、释放资源
 */
public class TcpServer {
    public static void main(String[] args) throws Exception {
        //1、创建ServerSocket ,并制定端口号
        ServerSocket listener = new ServerSocket(8899);
        //2、调用accept() ,接收客户端请求,阻塞方法(如果没有客户端请求,则阻塞)
        System.out.println("服务器已经启动.....");
        Socket socket = listener.accept();
        //3、获取输入流,读取客户端发送的数据
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is,"utf-8"));
        String data = br.readLine();
        System.out.println("客户端发送:" + data);
        //4、获取输出流,发送数据给客户端【可选】
        //5、释放资源
        br.close();
        socket.close();
        listener.close();
    }
}

客户端代码:

package com.kingtl.NetCode;

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

/**
 * 基于TCP的客户端开发
 * 1、创建客户端套接字,并指定服务器的地址和端口号
 * 2、获取输出流,发送数据给服务器
 * 3、获取输入流,读取服务器的数据
 * 4、释放资源
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        //1、创建客户端套接字,并指定服务器的地址和端口号
        Socket socket = new Socket("127.0.0.1", 8899);
        //2、获取输出流,发送数据给服务器
        OutputStream os = socket.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
        bw.write("许久不见");
        //3、获取输入流,读取服务器的数据 【服务器没写回复的代码】
        //4、释放资源
        bw.close();
        socket.close();
    }
}

结果:

5、单客户端上传文件给服务器端

服务器端代码:

package com.kingtl.NetCode2;

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * TCP服务器端
 */
public class TcpFileServer {
    public static void main(String[] args) throws Exception {
        // 1、创建ServerSocket
        ServerSocket listener = new ServerSocket(9999);
        // 2、侦听接收客户端请求
        System.out.println("服务器已启动....");
        Socket socket = listener.accept();
        // 3、获取输入流
        InputStream is = socket.getInputStream();
        // 4、边读取边保存
        FileOutputStream fos = new FileOutputStream("d:\\002.jpg");
        byte[] buf = new byte[1024 * 4];
        int count = 0;
        while ((count=is.read(buf)) != -1) {
            fos.write(buf,0,count);
        }
        // 关闭
        fos.close();
        is.close();
        socket.close();
        listener.close();
        System.out.println("接收结束!");
    }
}

客户端代码:

package com.kingtl.NetCode2;

import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
 * TCP的客户端
 */
public class TcpFileClient {
    public static void main(String[] args) throws Exception {
        // 1、创建 Socket
        Socket socket = new Socket("127.0.0.1",9999);
        // 2、获取输出流
        OutputStream os = socket.getOutputStream();
        // 3、边读取边发送
        FileInputStream fis = new FileInputStream("E:\\photos\\bizhi\\fengjing1.jpg");
        byte[] buf = new byte[1024 * 4];
        int count = 0;
        while ((count=fis.read(buf)) != -1) {
            os.write(buf,0,count);
        }
        //关闭
        fis.close();
        os.close();
        socket.close();
        System.out.println("发送完毕!");
    }
}

6、多客户端发送数据给服务器端

服务器端

package com.kingtl.NetCode3;

import java.net.ServerSocket;
import java.net.Socket;

/**
 * 使用TCP实现接收多个客户端请求
 */
public class TcpServer {
    public static void main(String[] args) throws Exception {
        // 1、创建 ServerSocket
        ServerSocket listener = new ServerSocket(10086);
        // 2、调用 accept() ,接收客户端请求
        System.out.println("服务器已启动.....");
        while (true){
            Socket socket = listener.accept();
            System.out.println(socket.getInetAddress()+"连接了服务器!");
            // 创建线程对象,负责接收数据
            new SocketThread(socket).start();
        }

    }
}

线程类

package com.kingtl.NetCode3;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket;

public class SocketThread extends Thread {
    private Socket socket;

    public SocketThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        if (socket != null) {
            BufferedReader br = null;
            try {
                InputStream is = socket.getInputStream();
                br = new BufferedReader(new InputStreamReader(is,"utf-8"));

                while (true) {
                    String data = br.readLine();
                    if (data == null) {  // 客户端已经关闭
                        break;
                    }
                    System.out.println(socket.getInetAddress()+"说:" +data);
                    if (data.equals("886") || data.equals("byebye")) {
                        break;
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    br.close();
                    socket.close();
                    System.out.println(socket.getInetAddress()+"退出了...");
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }
    }
}

客户端

package com.kingtl.NetCode3;

import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Scanner;

/**
 * TCP客户端:一直往服务器发送数据
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        // 1、创建 Socket
        Socket socket = new Socket("127.0.0.1", 10086);
        // 2、获取输出流
        OutputStream os = socket.getOutputStream();
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,"utf-8"));
        // 3、控制台输入
        Scanner input = new Scanner(System.in);
        while (true) {
            String data = input.nextLine();
            bw.write(data);
            bw.newLine();   // 发送换行符
            bw.flush();
            if (data.equals("886") || data.equals("byebye")) {
                break;
            }
        }
        // 4、关闭
        bw.close();
        socket.close();
    }
}

7、总结

  • 计算机网络:
    • 为实现资源共享和信息传递,通过通信线路连接起来的若干主机。
  • TCP协议:
    • 是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。
  • IP:
    • 分配给互联网设备的数字标签(唯一标识)。
  • Port:
    • 在通信实体上进行网络通讯的程序的唯一标识。
  • Socket编程:
    • 建立连接、接收请求、发送响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值