专业的JAVA编程教程与资源

网站首页 > java教程 正文

Java学习:基础(网络编程二)(java程序设计之网络编程)

temp10 2024-09-10 21:02:24 java教程 13 ℃ 0 评论

TCP通信

  • tcp消息一发一收
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 客服端
 */
public class ClinetDemo1 {
    public static void main(String[] args) {

        try {
            System.out.println("客户端启动...");
            // 创建socket 通信管道连接
            String ip = "127.0.0.1";// 服务器端p
            int port = 9999;// 服务端端口
            Socket socket = new Socket(ip, port);
            // 获取字节输出流
            OutputStream os = socket.getOutputStream();
            // 转换成打印流
            PrintStream ps = new PrintStream(os);
            // 输出数据
            ps.println("我是客户端");
            // 刷新数据
            ps.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

/**
 * 服务端
 */
class ServerDemo1 {
    public static void main(String[] args) {
        try {
            System.out.println("服务端启动...");
            // 注册端口
            int port = 9999;
            ServerSocket serverSocket = new ServerSocket(port);
            // 建立通信管道,阻塞等待接收客户端连接
            Socket socket = serverSocket.accept();
            // 读取管道数据字节流
            InputStream is = socket.getInputStream();
            // 字节流转换缓冲字符流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 读取消息
            String msg;
            if ((msg = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + " 消息:" + msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • tcp消息多发多收,只能处理一个客户端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客服端
 */
public class ClinetDemo2 {
    public static void main(String[] args) {

        try {
            System.out.println("客户端启动...");
            // 创建socket 通信管道连接
            String ip = "127.0.0.1";// 服务器端p
            int port = 9999;// 服务端端口
            Socket socket = new Socket(ip, port);
            // 获取字节输出流
            OutputStream os = socket.getOutputStream();
            // 转换成打印流
            PrintStream ps = new PrintStream(os);
            // 输出数据
            Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("请输入:");
                String msg = sc.nextLine();
                ps.println(msg);
                // 刷新数据
                ps.flush();
            }

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

/**
 * 服务端
 */
class ServerDemo2 {
    public static void main(String[] args) {
        try {
            System.out.println("服务端启动...");
            // 注册端口
            int port = 9999;
            ServerSocket serverSocket = new ServerSocket(port);
            // 建立通信管道,阻塞等待接收客户端连接
            Socket socket = serverSocket.accept();
            // 读取管道数据字节流
            InputStream is = socket.getInputStream();
            // 字节流转换缓冲字符流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 读取消息
            String msg;
            while ((msg = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + " 消息:" + msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  • tcp消息多发多收,处理多个客户端
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

/**
 * 服务端
 */
class ServerDemo3 {
    public static void main(String[] args) {
        try {
            System.out.println("服务端启动...");
            // 注册端口
            int port = 9999;
            ServerSocket serverSocket = new ServerSocket(port);
            // 定义主线线程,负责接收socket管道
            while (true) {
                // 建立通信管道,阻塞等待接收客户端连接
                Socket socket = serverSocket.accept();
                // 子线程处理多个客户端
                new ServerReaderThread(socket).start();

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

/**
 * 服务端,线程类
 */
class ServerReaderThread extends Thread{
    private Socket socket;
    public ServerReaderThread(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 读取管道数据字节流
            InputStream is = socket.getInputStream();
            // 字节流转换缓冲字符流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 读取消息
            String msg;
            while ((msg = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + " 消息:" + msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  • tcp消息多发多收,线程池处理多个客户端
/**
 * 服务端
 */
class ServerDemo4 {

    // 使用静态变量记住一个线程池对象
    private static ExecutorService pool = new ThreadPoolExecutor(3, 5,6,TimeUnit.SECONDS, new ArrayBlockingQueue<>(2), Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
    public static void main(String[] args) {
        try {
            System.out.println("服务端启动...");
            // 注册端口
            int port = 9999;
            ServerSocket serverSocket = new ServerSocket(port);
            // 定义主线线程,负责接收socket管道
            while (true) {
                // 建立通信管道,阻塞等待接收客户端连接
                Socket socket = serverSocket.accept();
                // 线程池处理多个客户端
                Runnable target = new ServerReaderRunnable(socket);
                pool.execute(target);

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

/**
 * 任务类
 */
class ServerReaderRunnable implements Runnable{
    private Socket socket;
    public ServerReaderRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 读取管道数据字节流
            InputStream is = socket.getInputStream();
            // 字节流转换缓冲字符流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 读取消息
            String msg;
            while ((msg = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + " 消息:" + msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

即时通信

Java学习:基础(网络编程二)(java程序设计之网络编程)

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 客服端
 */
public class ClinetDemo5 {
    public static void main(String[] args) {

        try {
            System.out.println("客户端启动...");
            // 创建socket 通信管道连接
            String ip = "127.0.0.1";// 服务器端p
            int port = 9999;// 服务端端口
            Socket socket = new Socket(ip, port);

            // 独立线程接收服务端消息
            new ClinetReaderThread5(socket).start();

            // 获取字节输出流
            OutputStream os = socket.getOutputStream();
            // 转换成打印流
            PrintStream ps = new PrintStream(os);
            // 输出数据
            Scanner sc = new Scanner(System.in);
            while (true) {
                System.out.println("请输入:");
                String msg = sc.nextLine();
                ps.println(msg);
                // 刷新数据
                ps.flush();
            }

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

/**
 * 独立线程接收服务端消息
 */
class ClinetReaderThread5 extends Thread{
    private Socket socket;
    public ClinetReaderThread5(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 读取管道数据字节流
            InputStream is = socket.getInputStream();
            // 字节流转换缓冲字符流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 读取消息
            String msg;
            while ((msg = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress()+ "收到消息:" + msg);
            }
        } catch (Exception e) {
            System.out.println("服务器异常");
        }
    }
}


/**
 * 服务端
 */
class ServerDemo5 {
    // 存储所有在线socket 管道
    public static List<Socket> allOnlineSockets = new ArrayList<>();
    public static void main(String[] args) {
        try {
            System.out.println("服务端启动...");
            // 注册端口
            int port = 9999;
            ServerSocket serverSocket = new ServerSocket(port);
            // 定义主线线程,负责接收socket管道
            while (true) {
                // 建立通信管道,阻塞等待接收客户端连接
                Socket socket = serverSocket.accept();
                // 上线添加
                allOnlineSockets.add(socket);
                // 子线程处理多个客户端
                new ServerReaderThread5(socket).start();

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

/**
 * 服务端,线程类
 */
class ServerReaderThread5 extends Thread{
    private Socket socket;
    public ServerReaderThread5(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            // 读取管道数据字节流
            InputStream is = socket.getInputStream();
            // 字节流转换缓冲字符流
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            // 读取消息
            String msg;
            while ((msg = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + " 消息:" + msg);
                // 端口转发
                sendMsgToAll(msg);
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "下线");
            // 下线移除
            ServerDemo5.allOnlineSockets.remove(socket);

        }
    }

    /**
     * 端口转化数据
     * @param msg
     * @throws Exception
     */
    private void sendMsgToAll(String msg) throws Exception {
        for (Socket socket : ServerDemo5.allOnlineSockets) {
            PrintStream ps = new PrintStream(socket.getOutputStream());
            ps.println(msg);
            ps.flush();
        }
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表