Java Socket编程代码优化

1.问题:在学习Java的Socket编程,写了一些代码练习,但是又不知道是否规范,是否有优化的空间?
2.代码:

package com.nekolr.socket;

import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.*;

/**
 * @author nekolr
 */
public class TcpSocket {

    static class TcpServer implements Runnable {

        private int port = 8888;

        @Override
        public void run() {
            try (
                    //创建服务端Socket,监听端口
                    ServerSocket serverSocket = new ServerSocket(port)
            ) {
                //打开监听,等待客户端的连接(在连接到来之前一直阻塞)
                Socket socket = serverSocket.accept();

                try (
                        //获取输入流(获取客户端的消息)
                        InputStream is = socket.getInputStream();
                        InputStreamReader isr = new InputStreamReader(is, "utf-8");
                        BufferedReader reader = new BufferedReader(isr)
                ) {
                    String line;
                    while ((line = reader.readLine()) != null) {
                        System.out.println("客户端" + socket.getInetAddress().getHostAddress() + "发送消息:" + line);
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

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

    static class TcpClient implements Runnable {

        private String host = "localhost";

        private int port = 8888;

        @Override
        public void run() {
            try (
                    //创建客户端Socket,指定主机名和端口号
                    Socket socket = new Socket(host, port)
            ) {
                try (
                        //获取输出流(向服务端发送消息)
                        OutputStream os = socket.getOutputStream();
                        OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
                        BufferedWriter writer = new BufferedWriter(osw)
                ) {
                    int i = 0;
                    while (true) {
                        i++;
                        writer.write("hello" + i);
                        writer.newLine();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

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

    public static void main(String[] args) {
        TcpServer tcpServer = new TcpServer();
        TcpClient tcpClient = new TcpClient();

        ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("thread-pool").build();
        ExecutorService executor = new ThreadPoolExecutor(2, 2,
                0L, TimeUnit.MILLISECONDS,
                new LinkedBlockingQueue<>(1024), factory, new ThreadPoolExecutor.AbortPolicy());

        executor.execute(tcpServer);
        executor.execute(tcpClient);
    }
}
阅读 3.3k
2 个回答

简单的连接就是这样写,没有太大的毛病。既然考虑了线程池,那就多尝试将网络和多线程进行结合,比如 Server 如何处理多个 Client 连接请求和消息处理;再做些更复杂的网络操作,比如局域网内如何发送文件,如何从互联网上下载文件;再往就是往 NIO 的方向学习,先学习 JDK 的 NIO,然后是 Netty(强烈建议你熟悉 Netty)。多思考,多总结。

没什么问题,不过有些代码写法可以优雅点。

BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "utf-8"))

然后BIO基本就差不多这样了,你可以基于BIO先写一个简单http服务器,熟悉TCP粘包、拆包。再就可以研究NIO,理解java NIO的概念,再用NIO实现一个http服务器,再深入的话可以顺便把websockt协议也一起实现了,这些都是非常常用的应用层协议,写完之后相信你会对socket编程技术有质的提升。
接下来就是netty了,当前面的基础打牢之后相信netty也不是问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题