Java Socket编程

前言

今天跟大家分享网络编程相关的知识,很简单,可以用来练练手,如果认真看的话依旧会有收获,谢谢大家,感谢大家的阅读

原理
通过socket套接字实现A(客户端)和B(服务器),A可以发送信息给服务器,服务器接收信息,并返回相应的指示
概述:
  • 环境:IntelliJ IDEA 2019.3.4

  • 语言:Java

  • 特点:简单,易懂,效果爆炸

展示

客户端输入bye则退出

代码(具体实现)
  • 客户端
定义客户端类,添加main函数

创建socket,并连接到端口号为2000的本地服务器进程

打印客户端和服务器信息

结果需要等待客户端连接上服务器以后才能显示
私有方法,处理客户端的发送信息和接收信息,完整代码在文章末尾贴

客户端开启结果(需先开启服务器,否在3秒延迟过后会报异常退出)

  • 服务器
定义服务器类,添加main函数

创建serversocket

等待客户端连接,并将连接的客户端加入子线程,开启子线程

服务器开启结果

总结

今天跟大家分享网络编程相关的知识,很简单,可以用来练练手,如果认真看的话依旧会有收获,谢谢大家,感谢大家的阅读

完整代码
客户端

public class Client {

    public static void main(String[] args) throws IOException {

        Socket socket = new Socket();
        socket.setSoTimeout(3000);
        socket.connect(new InetSocketAddress(InetAddress.getLocalHost(),2000),3000);

        System.out.println("已发送服务器连接");
        System.out.println("客户端:"+socket.getLocalAddress()+" P:"+socket.getLocalPort());
        System.out.println("服务端:"+socket.getInetAddress()+" P:"+socket.getPort());

        try {
            todo(socket);//信息处理
        }catch (Exception e){
            System.out.println("异常退出");
        }

    }

    //客户端发送信息,接收服务器回送的信息
    private static void todo(Socket socket) throws IOException{

        boolean flag = true;//控制接收信息

        //获取键盘输入流
        InputStream in = System.in;
        BufferedReader input = new BufferedReader(new InputStreamReader(in));
        //获取socket输出流
        OutputStream os = socket.getOutputStream();
        PrintStream ps = new PrintStream(os);
        //获取socket输入流
        InputStream is = socket.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(is));

        do {

            //读取键盘的一行数据
            String str = input.readLine();
            //发送给服务器
            ps.println(str);

            //读取服务器回送的数据
            String echo = br.readLine();
            if ("bye".equalsIgnoreCase(echo)){
                flag = false;
            }else {
                System.out.println(echo);
            }

        }while (flag);

        //资源释放
        ps.close();
        br.close();
        System.out.println("客户端已断开连接");
    }
}
服务器
public class Server {

    public static void main(String[] args) throws IOException {

        ServerSocket server = new ServerSocket(2000);
        System.out.println("服务器:"+server.getLocalSocketAddress());
        System.out.println("准备就绪");

        //等待客户端连接
        for (;;){
            Socket socket = server.accept();//获取连接的客户端
            ClientHandler handler = new ClientHandler(socket);//将客户端加入异步线程
            handler.start();//开启线程
        }
    }


    /**
     * 自定义内部类,异步处理客户端发送的信息
     * */
    private static class ClientHandler extends Thread{

        private Socket socket;
        private boolean flag = true;

        ClientHandler(Socket socket){
            this.socket = socket;
        }

        @Override
        public void run() {
            super.run();
            System.out.println("客户端:"+socket.getInetAddress()+" P:"+socket.getPort());
            System.out.println("客户端已连接");
            try {

                //获取键盘输入流
                InputStream in = System.in;
                BufferedReader input = new BufferedReader(new InputStreamReader(in));
                //获取socket输出流
                PrintStream ps = new PrintStream(socket.getOutputStream());
                //获取socket输入流
                BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

                do {

                    //从客户端读取一条数据
                    String echo = br.readLine();
                    if ("bye".equalsIgnoreCase(echo)) {
                        ps.println(echo);
                        flag = false;
                    }else {
                        ps.println("回送:" + echo.length());
                    }
                }while (flag);
            }catch (Exception e){
                System.out.println("异常退出");
            }
            finally {
                try {
                    //释放资源
                    socket.close();
                }
                catch (IOException e){
                    e.printStackTrace();
                }
            }
            System.out.println("客户端已断开连接");
        }
    }
}

posted @ 2020-03-26 22:35  Java开发爱好者  阅读(559)  评论(0)    收藏  举报