------------------Stage1------------------------------------------------
...见Socket_TCP_UDP > tcp包
------------------Stage2------------------------------------------------
...见Socket_TCP_UDP >tcp.demo包
------------------Stage3------------------------------------------------
...见Socket_TCP_UDP >tcp.demp.scanner包
------------------Stage4------------------------------------------------
...见Socket_TCP_UDP >tcp.demo.scanner.thread包
------------------Stage5--------------------------Socket_TCP_UDP >tcp.demo.scanner.thread.LinkedBlockingQueue包----------------------
客户端
package tcp.demo.scanner.thread.LinkedBlockingQueue;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ClientDemo {
public static void main(String[] args){
ClientDemo client = new ClientDemo();
client.startClient();
//AddShutdownHook方法增加JVM停止时要做处理事件:
//当JVM退出时,打印JVM Exit语句.
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run() {
System.out.println("Client JVM Exit!");
}
});
}
public void startClient(){
try {
Socket socket = new Socket("localhost",8888);
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
System.out.println("等待client输入");
Scanner scanner = new Scanner(System.in);
String scanstr = scanner.nextLine();
System.out.println("client输入完成");
pw.println(scanstr);
//模拟发送第二行
pw.println(scanstr+","+scanstr);
pw.println(scanstr+",lkjadflkasjdf"+scanstr);
pw.println("我是呂显超");
//结束符.lvlv
pw.println(".lvlv");
pw.flush();
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = br.readLine();
System.out.println(str);
socket.close();
os.close();
pw.close();
is.close();
br.close();
System.out.println("clent关闭");
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务端
package tcp.demo.scanner.thread.LinkedBlockingQueue;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;
public class ServerDemo {
private ExecutorService threadPool;
private BlockingQueue<String> msgQueue;
public static void main(String[] args){
ServerDemo serverDemo = new ServerDemo();
serverDemo.startServer();
//AddShutdownHook方法增加JVM停止时要做处理事件:
//当JVM退出时,打印JVM Exit语句.
Runtime.getRuntime().addShutdownHook(new Thread(){
public void run() {
System.out.println("Server JVM Exit!");
}
});
}
public ServerDemo(){
Timer timer = new Timer();
msgQueue = new LinkedBlockingQueue<String>();
timer.schedule(new TimerTask(){
public void run() {
try {
PrintWriter pw = new PrintWriter(new FileWriter("log.txt",true));
String msg = "";
System.out.println("msgQueue.size():"+msgQueue.size());
for (int i = 0; i < msgQueue.size(); i++) {
msg = msgQueue.poll(0,TimeUnit.MILLISECONDS);
if(msg == null){
System.out.println("msg is null");
}else{
pw.println(msg);
}
}
pw.close();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}}, 0, 5000);
}
public void startServer(){
Boolean bo = true;
try {
//ServerSocket不能放在while
ServerSocket serverSocket = new ServerSocket(8888);
threadPool = Executors.newFixedThreadPool(50);
while(bo){
System.out.println("等待连接...");
Socket socket = serverSocket.accept();
System.out.println("建立连接...");
// Thread thread = new Thread(new Handler(socket));
// thread.start();
//接受client的连接,从输入流读取数据
threadPool.execute(new Handler(socket));
bo = true;
}
} catch (IOException e) {
e.printStackTrace();
}
}
//内部类
class Handler implements Runnable{
private Socket socket;
public Handler(Socket socket){
this.socket = socket;
}
public void run() {
try {
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
/** //使用while之前的代码
String str = br.readLine();
System.out.println(str);
//测试两行
String str2 = br.readLine();
System.out.println(str2);
//如果没法第三行,在这里阻塞,可在客户端设置一个结束字符
String str3 = br.readLine();
System.out.println(str3);
**/
String flagStr = br.readLine();
if(flagStr!=null&&(flagStr.indexOf(".lvlv")==-1)){
System.out.println(flagStr);
Boolean bol = true;
System.out.println(flagStr);
while(bol){
msgQueue.offer(flagStr, 5, TimeUnit.SECONDS);
flagStr = br.readLine();
bol = flagStr!=null&&(flagStr.indexOf(".lvlv")==-1);
}
System.out.println("取得所有行");
}
/**上边的简化版
String flagStr = "";
while((".lvlv").indexOf(flagStr=br.readLine())==-1){
System.out.println(flagStr);
//插入对列成功返回true,失败返回false
Boolean bo = msgQueue.offer(flagStr, 5, TimeUnit.SECONDS);
}
*/
socket.close();
is.close();
br.close();
// os.close();
// pw.checkError();
System.out.println("server关闭");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}