BIO+多线程实现BIO模型
服务端
public class BIOServer{
//默认的端口号
private static int DEFAULT_PORT = 12345;
//单例的ServerSocket
private static ServerSocket server;
//根据传入参数设置监听端口,如果没有参数调用以下方法并使用默认值
public static void start() throws IOException {
//使用默认值
start(DEFAULT_PORT);
}
public synchronized static void start(int port) throws IOException{
if(server != null) return;
try{
//通过构造函数创建ServerSocket
//如果端口合法且空闲,服务端就监听成功
server = new ServerSocket(port);
System.out.println("服务器已启动,端口号:" + port);
//通过循环监听客户端连接
//如果没有客户端接入,将阻塞在accept操作上。
while(true){
Socket socket = server.accept();
System.out.println("客户端"+socket.getRemoteSocketAddress()+" 连接上了。。。");
//当有新的客户端接入时,会执行下面的代码
//然后创建一个新的线程处理这条Socket链路
new Thread(new ServerHandler(socket)).start();
}
}finally{
//一些必要的清理工作
if(server != null){
System.out.println("服务器已关闭。");
server.close();
server = null;
}
}
}
public static void main(String[] args) {
try {
BIOServer2_24.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ServerHandler implements Runnable{
private Socket socket;
public ServerHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
BufferedReader in = null;
PrintWriter out = null;
try{
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(socket.getOutputStream(),true);
String expression;
String result;
while(true){
//通过BufferedReader读取一行
//如果已经读到输入流尾部,返回null,退出循环
//如果得到非空值,就尝试计算结果并返回
if(((expression = in.readLine())==null) || "".equals(expression)) {
continue;
}
System.out.println(socket.getRemoteSocketAddress()+"消息:" + expression);
result = "Bio服务端收到消息\n";
out.println(result);
if (expression.equals("exit")) {
System.out.println("客户端"+socket.getRemoteSocketAddress()+" 退出了。。。");
break;
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
//一些必要的清理工作
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
if(out != null){
out.close();
out = null;
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
socket = null;
}
}
}
}
客户端
public class BIOCline{
//默认的端口号
private static int DEFAULT_SERVER_PORT = 12345;
private static String DEFAULT_SERVER_IP = "127.0.0.1";
private static Socket socket = null;
public static void send(Socket socket){
BufferedReader in = null;
PrintWriter out = null;
try {
Scanner input = new Scanner(System.in);//客户手动输入内容
input.useDelimiter("\n");//可以将分隔符号修改为"回车",或者其他字符
out = new PrintWriter(socket.getOutputStream(), true);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while (true) {
System.out.println("输入发送消息:");
String line = input.nextLine();
out.println(line);
System.out.println("服务端返回:" + in.readLine());
if ("exit".equals(line)) {
System.out.println("客户端退出了");
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//一下必要的清理工作
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
in = null;
}
if(out != null){
out.close();
out = null;
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
socket = null;
}
}
}
public static void main(String[] args) throws IOException {
Socket socket = new Socket(DEFAULT_SERVER_IP,DEFAULT_SERVER_PORT);
Scanner in = new Scanner(System.in);
in.useDelimiter("\n");
BIOCline2_24.send(socket);
}
}