自己写的socket 多线程 通讯

来源:互联网 发布:竹解心虚,然后知不足 编辑:程序博客网 时间:2024/06/14 06:51

1 SocketClient.java  代码


package com.cpcnet.socket;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;import java.net.UnknownHostException;import java.util.ArrayList;import java.util.List;import java.util.Scanner;import com.cpcnet.util.MyLogger;import com.cpcnet.util.PropertiesUtil;import com.cpcnet.util.StringUtil;public class SocketClient {private MyLogger logger = new MyLogger(SocketClient.class);public static String CMD=PropertiesUtil.getProp("socket.properties", "CMD");    private Socket socket = null;      private BufferedReader br = null;      private PrintWriter pw = null;          public String getTheFiles(String cmd,List<String> gidList){    this.logger.info("SocketClient.java getTheFiles(String cmd,List<String> gidList) cmd = " + cmd  + " gidList = " + gidList);    boolean flag = true;    String result = null;            String ip = PropertiesUtil.getProp("socket.properties", "ip");    int port = Integer.parseInt(PropertiesUtil.getProp("socket.properties", "port"));        if(!this.connect(ip, port)){    this.logger.error("SocketClient.java connect falied");    flag = false;    }else{    this.logger.info("SocketClient.java connect success");    this.logger.info("SocketClient.java connect Socket = " + socket);    System.out.println("Socket=" + socket);         try {br = new BufferedReader(new InputStreamReader(socket.getInputStream()));pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(  socket.getOutputStream())));  } catch (IOException e) {flag = false;this.logger.error("SocketClient.java br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(  socket.getOutputStream())));   ");e.printStackTrace();}                    if(!this.sendCmd(cmd, gidList)){     flag = false;     this.logger.error("SocketClient.java sendCmd(cmd, gidList) failed ");          }         if(flag){     result = this.getMessage();     System.out.println("SocketClient.java result = " + result);     }    }             this.close();        return result;        }       public String getMessage(){    String result = null;     String str = null;try {str = br.readLine();System.out.println("server message = "+str);  result = str;Thread.sleep(1);} catch (Exception e) {this.logger.error("SocketClient.java getMessage() error");e.printStackTrace();}           pw.flush();              return result;    }        public boolean sendCmd(String cmd,List<String> gidList){    boolean flag = true;    if(CMD.equals(cmd)&&gidList.size() > 0){    String gidListString = StringUtil.ListToString(gidList);//    String gidListString = StringUtil.gidStringConvertList(gidStr)    String sendCmd = cmd + "and" + gidListString ;     pw.println(sendCmd);               pw.flush();        }else{    this.logger.error("SocketClient.java sendCmd(String cmd,List<String> gidList) cmd = " + cmd + "  gidList = " + gidList);    flag = false;    }            return flag;    }        public boolean connect(String ip ,int port){    boolean flag = true;    try {socket = new Socket(ip, port);} catch (IOException e) {flag = false;e.printStackTrace();}        return flag;    }    public void close(){              try {br.close();pw.close();          socket.close();  } catch (IOException e) {// TODO Auto-generated catch blockthis.logger.error("SocketClient.java close() error");e.printStackTrace();}               }        public static void main(String[] args) {     String cmd = PropertiesUtil.getProp("socket.properties", "CMD");//    List<String> gidList = new ArrayList<String>();//    gidList.add("20186");//    gidList.add("40435");//    gidList.add("40699");//    new SocketClient().getTheFiles(cmd, gidList);    //    //    try {//Thread.sleep(5000);//} catch (InterruptedException e) {//// TODO Auto-generated catch block//e.printStackTrace();//}//        List<String> gidList2 = new ArrayList<String>();    gidList2.add("19934");    gidList2.add("40435");    gidList2.add("40699");    new SocketClient().getTheFiles(cmd, gidList2);//    {20186=[all_sites_traffic_summary_201502.html, all_sites_traffic_summary_201503.html], 40435=[], 40699=[]}        }   }


2  SocketServer.java 代码

package com.cpcnet.socket;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.cpcnet.util.ListUtil;import com.cpcnet.util.MyLogger;import com.cpcnet.util.PropertiesUtil;public class SocketServer {private ServerSocket serverSocket = null;private Socket socket = null;private BufferedReader br = null;private PrintWriter pw = null;private MyLogger logger = new MyLogger(SocketServer.class);private  String CMD=PropertiesUtil.getProp("socket.properties", "CMD");private  String cmd = null;private  String gidListString = null;private String error = PropertiesUtil.getProp("socket.properties", "error");public boolean init(){boolean flag = true;int port = Integer.parseInt(PropertiesUtil.getProp("socket.properties", "port"));//设定服务端的端口号      try {serverSocket = new ServerSocket(port);} catch (IOException e) {this.logger.error("SocketServer.java  serverSocket = new ServerSocket(PORT); port = " + port);flag = false;e.printStackTrace();}          System.out.println("ServerSocket Start:"+serverSocket);  return flag;}public boolean start(){boolean flag = true;if(!this.init()){   this.logger.error("SocketServer.java init() failed ");}else{while(true){     try {socket = serverSocket.accept();System.out.println("Connection accept socket:" + socket);Thread thread = this.initThread(socket, logger);thread.start();//thread.stop();} catch (IOException e) {this.logger.error("SocketServer.java start() init the br and pw error");try {socket.close();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}e.printStackTrace();return false;}                       }}return flag;}public Thread initThread( final Socket socket, final MyLogger logger){Thread thread = new Thread(new Runnable(){public void run(){try {  //用于接收客户端发来的请求  br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法  pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true);  } catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}//  while(true){            if(!this.getMessage()){                logger.error("SocketServer.java getMessage() failed " );                                }            if(!this.sendMessage()){    logger.error("SocketServer.java sendMessage() failed");    }    try {    Thread.sleep(1);    } catch (InterruptedException e) {    // TODO Auto-generated catch block    e.printStackTrace();    }    System.out.println("close socket and  socket = " + socket);//    this.close();    //            }} public void close(){  try {br.close();pw.close();socket.close();//serverSocket.close();} catch (IOException e) {logger.error("SocketServer.java close() error");e.printStackTrace();}   }public boolean getMessage(){boolean flag  = true;String cmdAndGidListAndMonth = null;try {cmdAndGidListAndMonth = br.readLine();} catch (IOException e) {logger.error("SocketServer.java getMessage() error");e.printStackTrace();return false;}  if(cmdAndGidListAndMonth != null){System.out.println("SocketServer.java cmdAndGidListAndMonth = " + cmdAndGidListAndMonth);cmd = cmdAndGidListAndMonth.split("and")[0];gidListString = cmdAndGidListAndMonth.split("and")[1];}return flag;}public boolean sendMessage(){boolean flag = true;if (CMD.equals(cmd)) {String fileBasicPath = PropertiesUtil.getProp("socket.properties", "fileBasicPath");Map<String,List<String>> map_gid_list = new HashMap<String,List<String>>();List gidList = ListUtil.StringToList(gidListString);if(gidList!= null && gidList.size() > 0){for(int i = 0 ; i < gidList.size() ; i ++ ){String filePath = fileBasicPath  + gidList.get(i);List<String> gid_list = this.getFilesByGid(filePath);map_gid_list.put((String) gidList.get(i), gid_list);}System.out.println("map_gid_list.toString() = " + map_gid_list.toString());pw.println(map_gid_list.toString());pw.flush();  }else{flag =false;logger.error("SocketServer.java sendMessage error :  this.cmd = " + cmd + " this.gidList = " + gidList );} }return flag;}public List<String> getFilesByGid(String filePath){List<String> list = new ArrayList<String>();File sumamryGidFile = new File(filePath);if(!sumamryGidFile.exists()) sumamryGidFile.mkdir();File[] childFiles =  sumamryGidFile.listFiles();if(childFiles != null &&childFiles.length > 0){    for(int j = 0 ; j < childFiles.length ; j ++){  if(!childFiles[j].isDirectory()){String childFileName = childFiles[j].getName();childFileName = childFileName.split("\\.")[0];childFileName = childFileName.split("_")[4];list.add(childFileName);  }  }  }return list;}  });return  thread;}    public static void main(String[] agrs) {      boolean flag = new SocketServer().start();    }  }



0 0
原创粉丝点击