截图如下:
Server.java:
package com.example.wcsocket;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
public class Server {
public static void main(String[] args) throws Exception{
String turnLine = "\n";
final String client = "Client:";
final String sever = "Server:";
int port = 60000;
ServerSocket serverSocket = new ServerSocket(port);
Socket socket = serverSocket.accept();
BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));
BufferedReader socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter socketOut = new PrintWriter(socket.getOutputStream());
PrintWriter systemOut = new PrintWriter(System.out,true);
BlockingQueue<String> socketInQueue = new LinkedBlockingQueue<String>();
BlockingQueue<String> SystemInQueue = new LinkedBlockingQueue <String>();
IoComsumer socketComsumer = new IoComsumer(socketOut,socketInQueue);
IoComsumer systemComsumer = new IoComsumer(systemOut,socketInQueue);
IoProducer socketProducer = new IoProducer(socketIn,socketInQueue);
IoProducer systemProducer = new IoProducer(systemIn,socketInQueue);
ExecutorService service = Executors.newCachedThreadPool();
service.execute(socketProducer);
service.execute(systemProducer);
service.execute(socketComsumer);
service.execute(systemComsumer);
Thread.sleep(5*60+1000);
socketProducer.stopRun();
systemProducer.stopRun();
socketComsumer.stopRun();
systemComsumer.stopRun();
systemIn.close();
}
}
Ioproduce.java:
package com.example.wcsocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class IoProducer implements Runnable{
private BufferedReader in;//输入流
private BlockingQueue<String> queue;// 内存缓冲区
private boolean isRunning = true;//停止信号
IoProducer(BufferedReader in, BlockingQueue<String> queue)
{
this.in = in;
this.queue = queue;
}
public void run() {
try {
while (isRunning) {
Thread.sleep(100);
String inputStr = in.readLine();
queue.offer(inputStr, 1, TimeUnit.SECONDS);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void stopRun()
{
this.isRunning = false;
}
}
IoComsumer.java:
package com.example.wcsocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class IoComsumer implements Runnable{
private PrintWriter out;//输出流
private BlockingQueue<String> queue;// 内存缓冲区
private boolean isRunning = true;
IoComsumer(PrintWriter out, BlockingQueue<String> queue)
{
this.out = out;
this.queue = queue;
}
public void stopRun()
{
this.isRunning = false;
}
public void run() {
try {
while (isRunning) {
Thread.sleep(100);
String data = queue.take();
if(data != null)
{
out.println(data);
out.flush();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}