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