Java 网络编程

157 阅读3分钟

Java 网络编程

Port

端口号:在通信实体上进行网络通讯的唯一标识。

端口分类:

  • 公认端口:0 ~ 1023
  • 注册端口:1024 ~ 49151
  • 动态或私有端口:49152 ~ 65535

常用端口

  • MySql:3306
  • Oracle:1521
  • Tomcat:8080
  • SMTP:25
  • Web服务器:80
  • FTP服务器:21

InetAddress类

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

方法

方法名作用
public static InetAddress getLocalHost()获取本地主机地址对象
public static InetAddress getByName(String host)根据主机名称获取地址对象
public static InetAddress[] getAllByName(String host)获取所有相关地址对象
public String getHostAddress()获取IP地址字符串
public String getHostName()获取IP地址主机名

基于TCP的网络编程

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

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

客户端

public class Client {
    public static void main(String[] args) throws Exception {
        Socket socket = new Socket("10.9.45.89", 7777);

        OutputStream os = socket.getOutputStream();
        InputStream is = socket.getInputStream();

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        bw.write("好久不见");
        bw.newLine();
        bw.flush();

        String data = br.readLine();
        System.out.println("服务器 -> " + data);

        bw.close();
        br.close();
        socket.close();
    }
}

服务器端

public class Server {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(8888);

        // 开启监听客户端连接,返回客户端连接
        Socket socket = serverSocket.accept();

        InputStream is = socket.getInputStream();
        OutputStream os = socket.getOutputStream();

        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os));

        String data = br.readLine();
        System.out.println("客户端 -> " + data);

        bw.write("甚是想念");
        bw.newLine();
        bw.flush();

        br.close();
        bw.close();
        socket.close();
        serverSocket.close();
    }
}

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

客户端

public class FileClient {
    public static void main(String[] args){
        Socket socket = null;
        OutputStream outputStream = null;
        BufferedInputStream bufferedInputStream = null;
        try {
            socket = new Socket("127.0.0.1", 8888);
            System.out.println("客户端启动");

            outputStream = socket.getOutputStream();
            bufferedInputStream = new BufferedInputStream(new FileInputStream("2.png"));

            byte[] buffer = new byte[1024 * 8];
            int len;
            while ((len = bufferedInputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (bufferedInputStream != null) {
                try {
                    bufferedInputStream.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (outputStream != null) {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("发送完毕");
        }
    }
}

服务器端

public class FileServer {
    public static void main(String[] args) {
        ServerSocket listener = null;
        Socket socket = null;
        InputStream inputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            listener = new ServerSocket(8888);
            socket = listener.accept();
            System.out.println("服务器启动");

            inputStream = socket.getInputStream();
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("1.png"));

            byte[] buffer = new byte[1024 * 8];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                bufferedOutputStream.write(buffer, 0, len);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    System.out.println("缓冲流关闭失败");
                }
            }
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    System.out.println("输入流管理失败");
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            if (listener != null) {
                try {
                    listener.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            System.out.println("接收完毕");
        }
    }
}

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

客户端

public class Client {
    public static void main(String[] args) {
        Socket socket = null;
        BufferedWriter bufferedWriter = null;
        try {
            socket = new Socket("127.0.0.1", 8888);
            System.out.println("客户端启动");
            OutputStream outputStream = socket.getOutputStream();
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
            Scanner input = new Scanner(System.in);
            while (true) {
                String data = input.next();
                bufferedWriter.write(data);
                bufferedWriter.newLine();
                bufferedWriter.flush();
                if ("Bye".equals(data)) {
                    break;
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (bufferedWriter != null) {
                try {
                    bufferedWriter.close();
                } catch (IOException e) {
                    System.out.println("流关闭失败");
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println("流关闭失败");
                }
            }
        }
    }
}

服务器端

public class Server {
    public static void main(String[] args) {
        Socket socket = null;
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(8888);
            System.out.println("服务器启动");
            while (true) {
                socket = serverSocket.accept();
                System.out.println(socket.getInetAddress() + "->" + socket.getPort() + "进入群聊");
                SocketThread socketThread = new SocketThread(socket);
                socketThread.start();
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    System.out.println("流关闭失败");
                }
            }
            if (serverSocket != null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    System.out.println("流关闭失败");
                }
            }
        }
    }
}

服务器端多线程处理

public class SocketThread extends Thread{
    Socket socket;

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

    @Override
    public void run() {
        BufferedReader bufferedReader = null;
        try {
            InputStream inputStream = socket.getInputStream();
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
            String data;
            while ((data = bufferedReader.readLine()) != null) {
                System.out.println(socket.getInetAddress() + "->" + socket.getPort() + ":说" + data);
                if ("Bye".equals(data)) {
                    break;
                }
            }
            System.out.println(socket.getInetAddress() + "->" + socket.getPort() + "退出群聊");
        } catch (IOException e) {
            System.out.println(socket.getInetAddress() + "->" + socket.getPort() + "退出群聊");
        } finally {
            if (bufferedReader != null) {
                try {
                    bufferedReader.close();
                } catch (IOException e) {
                    System.out.println("流关闭失败");
                }
            }
        }
    }
}