package cn.com.xinli.sms.socket.tcp.server; 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.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.log4j.Logger; public class SocketServer { Logger log = Logger.getLogger(SocketServer.class); private int port=80;//默认值 private ServerSocket serverSocket; private ExecutorService executorService;//线程池 private int POOL_SIZE=10;//单个CPU线程池大小 public SocketServer(int _prot,int skt_pool_size){ if(skt_pool_size > 0){ POOL_SIZE=skt_pool_size; } if(_prot>0){ port= _prot; }else{ log.error("参数错误,端口号:"+_prot+"无法识别,系统默认监听端口:"+port); } try { serverSocket=new ServerSocket(port); executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE); log.info("INFO: CPU个数"+Runtime.getRuntime().availableProcessors()+",线程池大小("+Runtime.getRuntime().availableProcessors()+"*"+POOL_SIZE+")="+String.valueOf(Runtime.getRuntime().availableProcessors()*POOL_SIZE)); log.info("INFO: CRM socket server at "+port+" port run."); } catch (IOException e) { log.error("服务启动错误,启动监听错误,端口可能占用。",e); } } public void service(){ while(true){ Socket socket=null; try { if(serverSocket==null){ return ; } socket=serverSocket.accept(); socket.setSoTimeout(8000); executorService.execute(new Handler(socket)); } catch (Exception e) { log.error("",e); } } } } class Handler implements Runnable{ Logger log = Logger.getLogger(Handler.class); private Socket socket; public Handler(Socket socket){ this.socket=socket; } private PrintWriter getWriter(Socket socket) throws IOException{ OutputStream socketOut=socket.getOutputStream(); return new PrintWriter(socketOut,true); } private OutputStream getWriterSocketOut(Socket socket) throws IOException{ OutputStream socketOut=socket.getOutputStream(); return socketOut; } private BufferedReader getBufferedReader(Socket socket) throws IOException{ InputStream socketIn=socket.getInputStream(); return new BufferedReader(new InputStreamReader(socketIn)); } public void run(){ long begingtime = System.currentTimeMillis(); log.info("\nNew client request "+socket.getInetAddress()+":"+socket.getPort()+",begintime="+begingtime); String requestStr = null; try { BufferedReader br = getBufferedReader(socket); OutputStream pw=getWriterSocketOut(socket); String resstr =null; if((requestStr=br.readLine())!=null){ log.info(" request String :"+requestStr); // resstr =echo(requestStr); //业务处理 log.info(" response String :"+resstr); } pw.write(resstr.getBytes()); pw.flush(); //if(msg.equals("bye")) break; log.info("--client request success,endtime:"+(System.currentTimeMillis()-begingtime)+"\n"); } catch (IOException e) { log.error("error: SocektThread exception.",e); }finally{ try { if(socket!=null) socket.close(); } catch (IOException e) { log.error("error: socket close exception .",e); } } } }
package cn.xinli.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SocketClient { protected static Log log = LogFactory.getLog(SocketClient.class); static Socket socket; static BufferedReader in; static PrintWriter out; //xujun,cut,message public static void main(String[] args) throws Exception { String bString = ""; try { socket = new Socket("127.0.0.1",5555);//连接服务端 socket.setSoTimeout(7000); in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//获得服务端发来的消息 out = new PrintWriter(socket.getOutputStream(),true); //给服务端发送消息 String content = "客户端测试"; log.info(content); out.print(content); out.flush(); log.info("内容已经发送给服务器端"); String b = null; while((b=in.readLine())!=null) { log.info("服务端回应:"+b); bString = b; } }catch(Exception e) { log.info("错误提示:"+e.getMessage()); }finally { try { if(out!=null){ out.close(); log.info("输出流已关闭"); }else if(in!=null){ in.close(); log.info("输入流已关闭"); }else{ socket.close(); log.info("客户端Socket已关闭"); } } catch (IOException e) { log.info("错误提示:"+e.getMessage()); } } if("ok".equals(bString)) { System.out.println("LALALLAALALA"); } } }