java--TCP通信基础

本文展示了Java Socket编程实现客户端与服务端的一对一、一对多及多对多即时通信。客户端通过Socket连接服务端,发送消息,并可循环接收输入,服务端能接收并转发多个客户端的消息,支持用户离线通知。
摘要由CSDN通过智能技术生成

一、客户端到服务端一发一收

public class Send {
    public static void main(String[] args) throws Exception {
        System.out.println("========客户端========");
        //1.创建Socket通信管道请求
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);

        //2.从Socket通信管道中获取字节输出流
        OutputStream os = socket.getOutputStream();

        //3.将字节输出流包装成打印流 提高发送效率
        PrintStream ps = new PrintStream(os);

        //4.发送消息
        ps.println("我爱小迪");

        //5.关闭通信管道
        socket.close();
    }
}

public class Receive {
    public static void main(String[] args) throws Exception {
        System.out.println("=======服务端=======");
        //1.注册服务端口
        ServerSocket serverSocket = new ServerSocket(8888);

        //2.接收来自客户端的Socket通信管道请求
        Socket socket = serverSocket.accept();

        //3.从Socket通信管道中获取字节输入流
        InputStream is = socket.getInputStream();

        //4.将字节输入流包装成缓冲字符流 提高效率
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        //5.输出
        String info;
        while ((info = br.readLine()) != null) {
            System.out.println(info);
        }

        //6.关闭通信管道
        socket.close();
    }
}

运行结果: 

二、客户端到服务端多发多收

 仅在客户端基础上加以循环输入,服务端不需要动。

public class Send {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        System.out.println("========客户端========");
        //1.创建Socket通信管道请求
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);

        //2.从Socket通信管道中获取字节输出流
        OutputStream os = socket.getOutputStream();

        //3.将字节输出流包装成打印流 提高发送效率
        PrintStream ps = new PrintStream(os);

        //4.循环发送消息
        while (true) {
            System.out.println("请输入:");
            String info = sc.nextLine();
            if ("exit".equals(info)) {
                socket.close();
                break;
            } else {
                ps.println(info);
            }
        }
    }
}

运行结果:

三、服务端接收多个客户端请求

 服务端要不停的接收来自客户端的Socket信息通道请求,每接收一个通道请求就启动一个线程。

public class Receive {
    public static void main(String[] args) throws Exception {
        System.out.println("=======服务端=======");
        ServerSocket serverSocket = new ServerSocket(8888);
        while (true) {
            Socket socket = serverSocket.accept();
            new MyThread(socket).start();
        }
    }
}
public class MyThread extends Thread{
   private Socket socket;
   public MyThread(Socket socket) {
       this.socket = socket;
   }

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info;
            while ((info = br.readLine()) != null) {
                System.out.println(socket.getRemoteSocketAddress() + info);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

 运行结果:

  

四、即时通信 

public class Send {
    public static void main(String[] args) throws Exception {
        Scanner sc = new Scanner(System.in);
        System.out.println("=======客户端=======");
        //创建Socket通信管道请求
        Socket socket = new Socket(InetAddress.getLocalHost(), 8888);
        //从Socket通信管道中获取字节输出流
        OutputStream os = socket.getOutputStream();
        //将输出流包装成打印流 提高效率
        PrintStream ps = new PrintStream(os);

        //开启分支线程等待接收消息
        new SendThread(socket).start();

        //发送信息
        while (true) {
            String info = sc.nextLine();
            if ("exit".equals(info)) {
                Server.allSocket.remove(socket);
                socket.close();
                break;
            } else {
                ps.println(info);
                ps.flush();
            }
        }
    }
}

 

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

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String info;
            while ((info = br.readLine()) != null) {
                System.out.println(socket.getLocalSocketAddress() + ":" + info);
            }
        } catch (Exception e) {
            System.out.println("离线成功!");
        }
    }
}
public class Server {
    public static ArrayList<Socket> allSocket = new ArrayList<>(); //保存全部的用户
    public static void main(String[] args) throws Exception {
        System.out.println("=======服务端=======");
        //注册服务端端口
        ServerSocket serverSocket = new ServerSocket(8888);
        //循环接收来自客户端的Socket请求
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println(socket.getRemoteSocketAddress() + "已上线~");
            allSocket.add(socket);
            new ServerThread(socket).start();
        }

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

    @Override
    public void run() {
        try {
            //从Socket通信管道中获取字节输入流
            InputStream is = socket.getInputStream();
            //将字节输入流包装成缓冲字符流 提高效率
            BufferedReader br = new BufferedReader(new InputStreamReader(is));

            //中转,  服务端将来自客户端的信息发送给另外一个客户端
            String info;
            while ((info = br.readLine()) != null) {
                for (Socket socket1 : Server.allSocket) {
                    if (socket1 != this.socket) {
                        OutputStream os = socket1.getOutputStream();
                        PrintStream ps = new PrintStream(os);
                        ps.println(info);
                        ps.flush();
                    }
                }
            }
        } catch (Exception e) {
            System.out.println(socket.getRemoteSocketAddress() + "已离线!");
        }
    }
}

运行结果: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值