線程組式模
每客戶一線程的模式增加了服務端的負荷,那么我們可以簡單的重用服務端處理線程。
服務端重用一定的線程來處理客戶端請求,客戶端請求被放置到一個池中供并發(fā)線程取出處理
每客戶一線程的模式增加了服務端的負荷,那么我們可以簡單的重用服務端處理線程。
服務端重用一定的線程來處理客戶端請求,客戶端請求被放置到一個池中供并發(fā)線程取出處理
package com.lei.socket.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class PooledClientServer {
//啟動服務端監(jiān)聽
public void start(){
try{
setUpHandlers();
ServerSocket server = new ServerSocket(port);
Socket client = null;
while(runFlag){
client = server.accept();
System.out.println("accept client " + client.getInetAddress().getHostAddress());
ClientHandle.handleClient(client);
}
server.close();
}catch(IOException e){
System.out.println("start error");
}
}
//創(chuàng)建處理線程組
public void setUpHandlers() {
for (int i = 0; i < threadNum; i++) {
ClientHandle ch = new ClientHandle();
new Thread(ch, "Handler " + i).start();
}
}
public static void main(String[] args){
PooledClientServer s = new PooledClientServer();
s.start();
}
private int port = 3000;
//并發(fā)處理線程數
private int threadNum = 3;
private boolean runFlag = true;
}
//處理類
class ClientHandle implements Runnable{
public static void handleClient(Socket client) {
synchronized (pool) {
pool.add(client);
pool.notifyAll();
}
}
//處理客戶端
private void handleClient(){
try{
BufferedReader inReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
while(true){
outWriter.write("please input String->");
outWriter.flush();
String str = inReader.readLine();
if(str.equalsIgnoreCase("quit")){
outWriter.write("quit ok");
client.close();
break;
}
else{
outWriter.write("reulst is :" + new StringBuffer(str).reverse().toString());
outWriter.write("\r\n");
}
}
}catch(IOException e){
System.out.println("Handle client error");
}
}
public void run(){
while (true) {
synchronized (pool) {
while (pool.isEmpty()) {
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
client = (Socket) pool.remove(0);
}
handleClient();
}
}
private Socket client;
private static ArrayList pool = new ArrayList();
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
public class PooledClientServer {
//啟動服務端監(jiān)聽
public void start(){
try{
setUpHandlers();
ServerSocket server = new ServerSocket(port);
Socket client = null;
while(runFlag){
client = server.accept();
System.out.println("accept client " + client.getInetAddress().getHostAddress());
ClientHandle.handleClient(client);
}
server.close();
}catch(IOException e){
System.out.println("start error");
}
}
//創(chuàng)建處理線程組
public void setUpHandlers() {
for (int i = 0; i < threadNum; i++) {
ClientHandle ch = new ClientHandle();
new Thread(ch, "Handler " + i).start();
}
}
public static void main(String[] args){
PooledClientServer s = new PooledClientServer();
s.start();
}
private int port = 3000;
//并發(fā)處理線程數
private int threadNum = 3;
private boolean runFlag = true;
}
//處理類
class ClientHandle implements Runnable{
public static void handleClient(Socket client) {
synchronized (pool) {
pool.add(client);
pool.notifyAll();
}
}
//處理客戶端
private void handleClient(){
try{
BufferedReader inReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
BufferedWriter outWriter = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
while(true){
outWriter.write("please input String->");
outWriter.flush();
String str = inReader.readLine();
if(str.equalsIgnoreCase("quit")){
outWriter.write("quit ok");
client.close();
break;
}
else{
outWriter.write("reulst is :" + new StringBuffer(str).reverse().toString());
outWriter.write("\r\n");
}
}
}catch(IOException e){
System.out.println("Handle client error");
}
}
public void run(){
while (true) {
synchronized (pool) {
while (pool.isEmpty()) {
try {
pool.wait();
} catch (InterruptedException e) {
e.printStackTrace();
return;
}
}
client = (Socket) pool.remove(0);
}
handleClient();
}
}
private Socket client;
private static ArrayList pool = new ArrayList();
}