Java网络编程学习·1

InetAddress的使用

package JavaInternetPrograming.QianFeng;

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

public class Demo01 {
    public static void main(String[] args) throws IOException {
        // 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("169.254.195.255");
        System.out.println("Ip地址:" + ia2.getHostAddress() + ", 主机名" + ia2.getHostName());
        // 1.3 getByName("127.0.0.1")方法  //127.0.0.1表示本机
        InetAddress ia3 = InetAddress.getByName("127.0.0.1");
        System.out.println("Ip地址:" + ia2.getHostAddress() + ", 主机名" + ia2.getHostName());
        // 1.3 getByName("localhost")方法  //localhost表示本机
        InetAddress ia4 = InetAddress.getByName("localhost");
        System.out.println("Ip地址:" + ia4.getHostAddress() + ", 主机名" + ia4.getHostName());


        // 2.创建局域网IP对象
        InetAddress ia5 = InetAddress.getByName("192.168.0.4");
        System.out.println("两秒钟是否可达:"+ia5.isReachable(2000));// 判断是否可达,单位为毫秒,这里的2000表示2秒
        System.out.println("Ip地址:" + ia5.getHostAddress() + ", 主机名" + ia5.getHostName());

        // 3.创建外网IP地址对象
        InetAddress ia6 = InetAddress.getByName("www.baidu.com");
        System.out.println("两秒钟是否可达:"+ia6.isReachable(2000));// 判断是否可达,单位为毫秒,这里的2000表示2秒
        System.out.println("Ip地址:" + ia6.getHostAddress() + ", 主机名" + ia6.getHostName());
        // 获取目标服务器的所有地址
        InetAddress[] ias = InetAddress.getAllByName("www.baidu.com");
        for ( InetAddress i: ias
             ) {
            System.out.println(i);
        }
    }
}

基于TCP的网络编程

TCP编程实现客户端发送数据给服务器端

TCP服务器端
package JavaInternetPrograming.QianFeng;

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

/**
 * @author kingdeguo
 *  服务器端:
 *  创建ServerSocket, 指定端口号
 *  调用accept等待客户端接入
 *  使用输入流,接收请求数据到服务器端(等待)
 *  使用输出流,发送响应数据给客户端 (可选)
 *  释放资源
 * */
public class TcpServer {
    public static void main(String[] args) throws IOException {
        // 创建ServerSocket, 指定端口号
        ServerSocket listener = new ServerSocket(8899);
        // 调用accept等待客户端接入
        // 是一个阻塞方法,即:如果没有客户端请求,则会一直等待
        // 注意返回值是一个客户端Socket
        Socket socket = listener.accept();
        // 使用输入流,接收请求数据到服务器端(等待)
        InputStream inputStream = socket.getInputStream();
        // 为了能够接受中文,需要创建一个转换流
        // 将字节流转化为字符流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
        String data = bufferedReader.readLine();
        System.out.println("客户端发送的数据:" + data);
        // 释放资源
        bufferedReader.close();
        socket.close();
        listener.close();
    }
}

TCP客户端
package JavaInternetPrograming.QianFeng;

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

/**
 * @author kingdeguo
 *  客服端:
 *  创建Socket,指定服务器IP + 端口号
 *  使用输出流, 发送请求数据给服务器
 *  使用输入流, 读取服务器回复的数据
 *  关闭资源
 * */
public class TcpClient {
    public static void main(String[] args) throws IOException {
        // 创建Socket,指定服务器IP + 端口号
        Socket socket = new Socket("192.168.137.1",8899);
        // 使用输出流, 发送请求数据给服务器
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
        bufferedWriter.write("好久不见");
        // 使用输入流, 读取服务器回复的数据(可选)
        // 关闭资源
        bufferedWriter.close();
        socket.close();
    }
}
运行

运行时先运行服务器端,再运行客户端。

客户端发送的数据:好久不见

TCP编程实现客户端上传文件给服务器

TCP服务器端
package JavaInternetPrograming.QianFeng;

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

public class TcpFileUploadServer {
    public static void main(String[] args) throws IOException {
        // 1.创建ServerSocket
        ServerSocket listener = new ServerSocket(9999);
        // 2.监听,接受客服端请求
        Socket socket = listener.accept();
        // 3.获取输入流
        InputStream inputStream = socket.getInputStream();
        // 4.边读取,边保存
        FileOutputStream fos = new FileOutputStream("d:\\002.jpg");
        byte[] buf = new byte[1024 * 4];
        int count = 0;
        while ((count = inputStream.read(buf)) != -1) {
            fos.write(buf,0,count);
        }
        // 5.关闭资源
        fos.close();
        inputStream.close();
        socket.close();
        System.out.println("接受完毕");
    }
}

TCP客户端
package JavaInternetPrograming.QianFeng;

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

public class TcpFileUploadClient {
    public static void main(String[] args) throws IOException {
        // 1.创建Soctet
        Socket socket = new Socket("192.168.137.1", 9999);
        // 2.获取输出流
        OutputStream outputStream = socket.getOutputStream();
        // 3.边读取文件,边发送文件
        FileInputStream fileInputStream = new FileInputStream("d:\\001.jpg");
        byte[] buf = new byte[1024 * 4];
        int count=0;
        while ((count=fileInputStream.read(buf))!=-1) {
            outputStream.write(buf,0,count);
        }
        // 4.关闭资源
        fileInputStream.close();
        socket.close();
        System.out.println("发送成功");
    }
}

TCP编程实现多个客户端发送数据给服务器

多线程套接字
package JavaInternetPrograming.QianFeng;

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

public class ScoketThread extends Thread {
    private Socket socket;
    public ScoketThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run(){
        if (socket != null) {

            BufferedReader bufferedReader = null;
            try {
                InputStream inputStream  = socket.getInputStream();
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
                while (true) {
                    String data = bufferedReader.readLine();
                    if (data == null) {
                        break;
                    }
                    System.out.println(socket.getInetAddress()+"说"+data);
                    if (data.equals("886") || data.equals("Bye")) {
                        break;
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                try {
                    bufferedReader.close();
                    socket.close();
                    System.out.println(socket.getInetAddress()+"退出了");
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
    }
}

TCP服务器端
package JavaInternetPrograming.QianFeng;

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

public class TCPMultiServer {
    public static void main(String[] args) throws IOException {
        // 1.创建ServerSocket
        ServerSocket listener = new ServerSocket(10086);
        // 2.调用accept(),接收客户端请求
        // 3.为了接受多个客户端,这里用到while循环
        System.out.println("服务器已启动......");
        while (true) {
            Socket socket = listener.accept();
            System.out.println(socket.getInetAddress()+"进来了.....");
            // 创建线程对象
            // 负责接收数据
            new ScoketThread(socket).start();
        }
    }
}


TCP客户端
package JavaInternetPrograming.QianFeng;

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

public class TCPMultiClient {
    public static void main(String[] args) throws IOException {
        // 1.创建Socket
        Socket socket = new Socket("192.168.137.1", 10086);
        // 2.获取输出流
        OutputStream outputStream = socket.getOutputStream();
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"));
        // 3.控制台输入
        Scanner input = new Scanner(System.in);
        while (true) {
            String data = input.nextLine();
            bufferedWriter.write(data);
            //发送换行符
            bufferedWriter.newLine();
            bufferedWriter.flush();
            if (data.equals("886") || data.equals("Bye")) {
                break;
            }
        }
        bufferedWriter.close();
        socket.close();
    }

Socket编程实现注册登录

注册线程
package JavaInternetPrograming.QianFeng;

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

public class RegistThread  extends Thread{
    @Override
    public void run(){
        try {
            // 1.创建一个ServerSocket
            ServerSocket linstener = new ServerSocket(6666);
            // 2.调用accept方法
            System.out.println("服务器注册已启动......");
            Socket socket = linstener.accept();
            // 3.获取输入输出流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
            // 4.接收客户端发送的数据
            // 这里用到的格式为: {id:1001, name:tom, pwd:123, age:20}
            String json = bufferedReader.readLine();
            String[] infos = json.substring(1, json.length() - 1).split(",");
            String id = infos[0].split(":")[1];
            // 5.加载数据文件
            Properties properties = Tools.loadProperties();
            // 6.判断
            if (properties.containsKey(id)) {
                bufferedWriter.write("此用户已存在");
            } else {
                // 保存属性文件
                Tools.saveProperties(json);
                bufferedWriter.write("注册成功");
            }
            bufferedWriter.newLine();
            bufferedWriter.flush();
            bufferedWriter.close();
            bufferedReader.close();
            socket.close();
            linstener.close();

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

登录线程
package JavaInternetPrograming.QianFeng;

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

public class LoginThread extends Thread {
    @Override
    public void run() {
        try {
            // 1.创建一个ServerSocket
            ServerSocket linstener = new ServerSocket(6666);
            // 2.调用accept方法
            System.out.println("服务器注册已启动......");
            Socket socket = linstener.accept();
            // 3.获取输入输出流
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
            BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
            // 4.接收客户端发送的数据
            // 这里用到的格式为: {id:1001, name:tom, pwd:123, age:20}
            String json = bufferedReader.readLine();
            String[] infos = json.substring(1, json.length() - 1).split(",");
            String id = infos[0].split(":")[1];
            // 5.加载数据文件
            Properties properties = Tools.loadProperties();
            // 6.判断
            if (properties.containsKey(id)) {
                // 判断密码是否正确
                String pwd = infos[1].split(":")[1];
                String value = properties.getProperty(id);
                String[] arr = value.substring(1, value.length() - 1).split(",");
                String pwd2 = arr[2].split(":")[1];
                if (pwd.equals(pwd2)) {
                    bufferedWriter.write("登录成功");
                } else {
                    bufferedWriter.write("密码错误");
                }
            } else {
                bufferedWriter.write("用户名错误");
            }
            bufferedWriter.newLine();
            bufferedWriter.flush();
            bufferedWriter.close();
            bufferedReader.close();
            socket.close();
            linstener.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

工具类
package JavaInternetPrograming.QianFeng;
import java.io.*;
import java.util.Properties;

public class Tools {
    // 1.加载属性文件
    public static Properties loadProperties() throws IOException {
        // 1. 创建属性集合
        Properties properties = new Properties();
        // 2.判断文件是否存在
        File file = new File("users.properties");
        if (file.exists()) {
            FileInputStream fileInputStream = null;
            try {
                fileInputStream = new FileInputStream(file);
                properties.load(fileInputStream);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }finally {
                if (fileInputStream != null) {
                    try {
                        fileInputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

        }
        return null;
    }
    // 2.保存属性文件
    public static void saveProperties(String json) throws IOException {
        String[] infos = json.substring(1, json.length() - 1).split(",");
        String id = infos[0].split(":")[1];
        //保存
        FileOutputStream fileOutputStream = null;
        try  {
            fileOutputStream = new FileOutputStream("users.properties", true);
            Properties properties = new Properties();
            properties.setProperty(id, json);
            properties.store(fileOutputStream,"");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

用户类
package JavaInternetPrograming.QianFeng;

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

public class UserClient {
    public static void main(String[] args) throws IOException {
        System.out.println("---请选择:1,注册 2,登录---");
        Scanner input = new Scanner(System.in);
        int choice = input.nextInt();
        switch (choice) {
            case 1:regist();
                    break;
            case 2:login();
                break;
        }
    }
    public static void regist() throws IOException {
        // 1.创建socket
        Socket socket = new Socket("192.168.137.1", 6666);
        // 2.获取流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
        // 3.获取用户信息
        String jsom = getRegistInfo();
        // 4.发送
        bufferedWriter.write(jsom);
        bufferedWriter.newLine();
        bufferedWriter.flush();
        // 5.接收
        String reply = bufferedReader.readLine();
        System.out.println("服务器回复:" + reply);
        // 6.关闭
        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
    }

    public static String getRegistInfo(){
        Scanner input = new Scanner(System.in);
        System.out.println("请输入编号");
        int id = input.nextInt();
        System.out.println("请输入姓名");
        String name = input.next();
        System.out.println("请输入密码");
        String pwd = input.next();
        System.out.println("请输入年龄");
        int age = input.nextInt();
        String json = "{id:" + id + ", name:" + name + ", pwd:" + pwd + ", age:" + age + "}";
        return json;
    }

    public static String login() throws IOException {
        Scanner input = new Scanner(System.in);
        System.out.println("请输入编号");
        int id = input.nextInt();
        System.out.println("请输入姓名");
        String name = input.next();
        System.out.println("请输入密码");
        String pwd = input.next();
        System.out.println("请输入年龄");
        int age = input.nextInt();
        String json = "{id:" + id + ", pwd:" + pwd + "}";
        return json;
    }

    public static String getLoginInfo() throws IOException {
        // 1.创建socket
        Socket socket = new Socket("192.168.137.1", 6666);
        // 2.获取流
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"));
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "utf-8"));
        // 3.获取用户信息
        String jsom = getLoginInfo();
        // 4.发送
        bufferedWriter.write(jsom);
        bufferedWriter.newLine();
        bufferedWriter.flush();
        // 5.接收
        String reply = bufferedReader.readLine();
        System.out.println("服务器回复:" + reply);
        // 6.关闭
        bufferedWriter.close();
        bufferedReader.close();
        socket.close();
        return jsom;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值