Socket 客户端与服务端通信及控制台乱码问题解决

此片博客是根据慕课网Socket网络编程进阶与实战的学习记录。

简介

Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以较为方便的编写网络上数据的传递。在Java中,有专门的Socket类来处理用户的请求和响应。利用Socket类的方法,就可以实现两台计算机之间的通讯。

如果想了解Socket通讯原理及三次握手请移步。

Client客户端代码实现。

 public static void main(String[] args) throws IOException {
        Socket socket = new Socket();
        /*超时时间*/
        socket.setSoTimeout(3000);
        /*连接本地   端口2000  超时时间3000*/
        socket.connect(new InetSocketAddress(InetAddress.getLocalHost(), 2000), 3000);
        System.out.printf("已发起服务器连接,并进入后续流程");
        System.out.printf("客户端信息:" + socket.getLocalAddress() + "P:" + socket.getLocalPort());
        System.out.printf("服务器信息:" + socket.getInetAddress() + "P:" + socket.getPort());

        try {
            /*发送数据*/
            todo(socket);
        } catch (Exception e) {
            System.out.printf("异常关闭");
        }
        /*释放资源*/
        socket.close();
        System.out.println("客户端已退出~");
    }

    private static void todo(Socket client) throws IOException {
        /*键盘输入*/
        InputStream in = System.in;
        BufferedReader inpu = new BufferedReader(new InputStreamReader(in));
        /*得到socket输出流,转换成打印流*/
        OutputStream outputStream = client.getOutputStream();
        PrintStream socketPrintStream = new PrintStream(outputStream);

        /*得到Soclet输入流,转换为BufferedReader*/
        InputStream inputStream = client.getInputStream();
        BufferedReader socketBufferedReader = new BufferedReader(new InputStreamReader(inputStream));


        boolean flag = true;
        do {
            /*键盘读取一行*/
            String str = inpu.readLine();
            /*发送到服务器*/
            socketPrintStream.println(str);
            /*从服务器读取一行*/
            String echo = socketBufferedReader.readLine();
            if ("bye".equalsIgnoreCase(echo)) {
               flag = false;
            }else{
                System.out.println(echo);
            }

        } while (flag);

        /*释放资源*/
        socketPrintStream.close();
        socketBufferedReader.close();

    }

Server服务端代码实现。

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

        /**
         *  port:指定的端口号
         */
        ServerSocket serverSocket = new ServerSocket(2000);

        System.out.printf("服务器准备就绪~");
        System.out.printf("服务器信息:" +serverSocket.getInetAddress());


        /*等待客户端连接*/
        for (;;){
            /*套接字 得到客户端*/
            Socket client = serverSocket.accept();
            ClientHandler clientHandler = new ClientHandler(client);
            clientHandler.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());

            try {
                PrintStream socketOutPut = new PrintStream(socket.getOutputStream());
                BufferedReader socketInput = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                do {
                      String str = socketInput.readLine();

                      if("bye".equalsIgnoreCase(str)){
                          flag =false;
                          /*回送*/
                          socketOutPut.println("bye");
                      }else{
                          /*打印数据长度,并回送*/
                          System.out.println(str);
//                          System.out.println(getEncoding("编码格式为:"+str));
                          socketOutPut.println("字符长度:"+str.length());
                      }
                }while (flag);
             }catch (Exception e){
                System.out.println("连接异常断开");
            }finally {
                /*连接关闭*/
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                System.out.println("客户端已退出:"+ socket.getInetAddress()+" P:"+socket.getPort());
            }
        }
    }

至此我们就实现了客户端和服务端的通信。

可以看到我们虽然实现了客户端和服务端的通信但是会有乱码这里提供一种解决方案 

方案来源

Socket 客户端与服务端通信及控制台乱码问题解决_第1张图片Socket 客户端与服务端通信及控制台乱码问题解决_第2张图片

结尾追加

-Dfile.encoding=UTF-8

并且在你的builder.gradle中添加

tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

这样就可以解决乱码的问题了!

你可能感兴趣的:(java,socket,java,网络)