Java Socket Server编程

package za_socket_server;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import javax.swing.JTextArea;

import za_socket_util.ServerAwt;

/**
 *
 * @author sza
 * @用途:实现socket服务端程序
 *
 */
@SuppressWarnings("static-access")
public class ServerOfZA {
 private static List<Socket> list = new ArrayList<Socket>();//保存socket
 private ExecutorService exec;//声明線程池
 private ServerSocket server;//声明服务端
 private BufferedReader br = null;
 private FileReader fr = null;

 static JTextArea serverJta = new ServerAwt().jta;

 public static void main(String[] args) {
  ServerAwt sa = new ServerAwt();
  sa.show();//显示图形界面
  int portInt = 0;//判断端口号,当前赋值默认为0
  File portFile = null;
  String[] path = { "C:\\port.ini", "/home/port.ini" };//保存端口号信息
  for (String p : path) {//利用foreach循环端口号文件路径
   portFile = new File(p);
   if (portFile.exists() && portFile.getParent().equals("C:\\")) {//判断是否是windows系统
    portInt = new ServerOfZA().isExistWinPortFile(portFile);
    break;
   }
   if (portFile.exists() && portFile.getParent().equals("/home")) {//判断是否是linux系统
    portInt = new ServerOfZA().isExistLinPortFile(portFile);
    break;
   }
  }
  
  if (portInt == 0) {
   serverJta.append("\n端口号信息错误:\n\n");
   serverJta.append("Windows操作系统在C:\\port.ini文件中!\n\n");
   serverJta.append("Linux操作系统在/home/port.ini文件中!\n\n");
   serverJta.append("请关闭窗口确认后,再次连接!\n");
  } else {
   new ServerOfZA(portInt);//创建server端
  }
 }
 /**
  * 判断linux下的端口号文件
  * @param file
  * @return 返回四位端口号值
  */
 public int isExistLinPortFile(File file) {
  int isExist = 0;
  if (!file.exists()) {
   serverJta.append("/home/port.ini文件不存在!\n");
   return isExist;
  } else if (!file.canRead()) {
   serverJta.append("/home/port.ini文件不可读!\n");
   return isExist;
  }
  try {
   fr = new FileReader(file);
   br = new BufferedReader(fr);
   String port = null;
   port = br.readLine();
   while (port != null) {
    if ("".equals(port) || port == null) {
     serverJta.append("寻找端口号中...!\n");
     port = br.readLine();
     continue;
    } else {
     if (port.trim().matches("^[0-9]{4}$")) {
      int serverPort = Integer.parseInt(port.trim());
      isExist = serverPort;
      serverJta.append("端口号为 : " + serverPort + "\n\n");
      break;
     } else {
      serverJta.append("端口号不是四位数字,请重新确认!\n");
      isExist = 0;
      break;
     }
    }
   }
   fr.close();
   br.close();
  } catch (Exception e) {
   e.printStackTrace();
   isExist = 0;
  }
  return isExist;
 }
 /**
  * 判断windows系统下端口号文件
  * @param file
  * @return 返回值为端口号
  */
 public int isExistWinPortFile(File file) {
  int isExist = 0;
  if (!file.exists()) {
   serverJta.append("C:\\port.ini文件不存在!\n");
   return isExist;
  } else if (!file.canRead()) {
   serverJta.append("C:\\port.ini文件不可读!\n");
   return isExist;
  }
  try {
   fr = new FileReader(file);
   br = new BufferedReader(fr);
   String port = null;
   port = br.readLine();
   while (port != null) {
    if ("".equals(port) || port == null) {
     serverJta.append("寻找端口号中...!\n");
     port = br.readLine();
     continue;
    } else {
     if (port.trim().matches("^[0-9]{4}$")) {
      int serverPort = Integer.parseInt(port.trim());
      isExist = serverPort;
      serverJta.append("端口号为 : " + serverPort + "\n\n");
      break;
     } else {
      serverJta.append("端口号不是四位数字,请重新确认!\n");
      isExist = 0;
      break;
     }
    }
   }
   fr.close();
   br.close();
  } catch (Exception e) {
   e.printStackTrace();
   isExist = 0;
  }
  return isExist;
 }

 public ServerOfZA() {
  super();
 }
 /**
  * 启动server端,保存socket
  * @param port
  */
 public ServerOfZA(int port) {
  try {
   server = new ServerSocket(port);
   exec = Executors.newCachedThreadPool();//创建线程池
   serverJta.append("服务器已启动!\n\n");
   Socket client = null;
   while (true) {
    client = server.accept();
    list.add(client);//添加socket到list集合
    exec.execute(new ReceiveTask(client));//总执行线程
   }
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 static class ReceiveTask implements Runnable {
  private Socket socket;
  private File file;
  private BufferedReader br;
  private PrintWriter pw;

  private DataInputStream dis = null;
  private DataOutputStream dos = null;

  private String msg;

  private byte[] data = new byte[1024];

  public ReceiveTask(Socket socket) throws IOException {
   this.socket = socket;
   br = new BufferedReader(new InputStreamReader(socket
     .getInputStream()));
   pw = new PrintWriter(socket.getOutputStream());
   serverJta.append("接入新的ip地址【" + socket.getInetAddress() + "】\n");
  }

  public void run() {
   try {
    while ((msg = br.readLine()) != null) {
     if (msg.trim().equals("bye")) {
      msg = br.readLine();
      continue;
     } else {
      int n = 0;
      while (msg.split("#").length != 5) {
       String line = br.readLine();
       msg = line;
       try {
        Thread.sleep(2000);
       } catch (InterruptedException e) {
        e.printStackTrace();
       }
       n = n + 1;
       if (n == 200) {
        break;
       }
      }
      String[] line = msg.split("#");
      SimpleDateFormat sdf = new SimpleDateFormat(
        "yyyy年MM月dd日kk时mm分ss秒SSS毫秒");
      if (line.length == 5) {
       if ("cmd".equalsIgnoreCase(line[3])) {
        serverJta.append("【" + socket.getInetAddress()
          + "】执行:" + line[4] + "命令\n");
        long startTime = System.currentTimeMillis();
        serverJta.append("开始时间为:"
          + sdf.format(new Date()) + "\n");
        int value = this.systemCMD(msg);
        if (value == 0) {
         serverJta.append("执行系统命令成功!\n");
         pw.println("success");
         pw.flush();
        } else {
         serverJta.append("执行系统命令失败!\n");
         pw.println("fail");
         pw.flush();
        }
        long endTime = System.currentTimeMillis();
        serverJta.append("结束时间:"
          + sdf.format(new Date()) + "!\n");
        computeTime(startTime, endTime);
        removeSocket(pw, br, socket);

        break;
       }
       if ("send".equalsIgnoreCase(line[3])) {
        String[] allpath = line[4].split("\\|");
        String path = allpath[1];
        file = new File(path);

        serverJta.append("【" + socket.getInetAddress()
          + "】执行:" + line[3] + "文件命令\n");
        long startTime = System.currentTimeMillis();
        serverJta.append("开始时间为:"
          + sdf.format(new Date()) + "\n");

        if (file.getParent() == null
          || file.getName() == null
          || file.getName().equals("")) {
         serverJta.append("文件不存在!\n");
         pw.println("nofile");
         pw.flush();

         long endTime = System.currentTimeMillis();
         serverJta.append("结束时间:"
           + sdf.format(new Date()) + "!\n");
         computeTime(startTime, endTime);

         removeSocket(pw, br, socket);
         return;
        } else {
         pw.println("yes");
         pw.flush();

         serverReceiveFile(file);

         long endTime = System.currentTimeMillis();
         serverJta.append("结束时间:"
           + sdf.format(new Date()) + "!\n");
         computeTime(startTime, endTime);

         removeSocket(pw, br, socket);
         break;
        }
       }
       if ("copy".equalsIgnoreCase(line[3])) {
        String[] allpath = line[4].split("\\|");
        String path = allpath[0];
        file = new File(path);

        serverJta.append("【" + socket.getInetAddress()
          + "】执行:" + line[3] + "文件命令\n");
        long startTime = System.currentTimeMillis();
        serverJta.append("开始时间为:"
          + sdf.format(new Date()) + "\n");

        if (file.getParent() == null
          || file.getName() == null
          || file.getName().equals("")) {
         serverJta.append("文件不存在!\n");
         pw.println("nofile");
         pw.flush();

         long endTime = System.currentTimeMillis();
         serverJta.append("结束时间:"
           + sdf.format(new Date()) + "!\n");
         computeTime(startTime, endTime);

         removeSocket(pw, br, socket);
         return;
        } else {
         pw.println("yes");
         pw.flush();

         serverSendFile(file);

         long endTime = System.currentTimeMillis();
         serverJta.append("结束时间:"
           + sdf.format(new Date()) + "!\n");
         computeTime(startTime, endTime);

         removeSocket(pw, br, socket);
         break;
        }
       }
      }
     }
    }
   } catch (IOException e) {
    e.printStackTrace();
    serverJta.append("执行失败!\n\n");
   }
  }

  /**
   * 计算执行时间
   *
   * @param startTime
   * @param endTime
   */
  private void computeTime(long startTime, long endTime) {
   long time = endTime - startTime;
   time = time / 1000;
   int hour = (int) (time / 3600);
   time = endTime - startTime;
   time = time / 1000;
   time = time % 3600;
   int minut = (int) (time / 60);
   time = endTime - startTime;
   time = time / 1000;
   time = time % 60;
   int second = (int) time;
   int millisecond = (int) ((endTime - startTime) % 1000);
   serverJta.append("执行时间为:" + hour + "小时*" + minut + "分*" + second
     + "秒*" + millisecond + "毫秒!\n\n");
  }

  /**
   * 关闭所有流及socket
   *
   * @param pw
   * @param br
   * @param socket
   * @throws IOException
   */
  private void removeSocket(PrintWriter pw, BufferedReader br,
    Socket socket) throws IOException {
   list.remove(socket);
   br.close();
   pw.close();
   serverJta.append("当前有【" + list.size() + "】个进程正在执行中!\n");
   socket.close();
   serverJta.append("关闭【" + socket.getInetAddress() + "】的链接\n\n");
   msg = "bye";
  }

  /**
   * 执行系统命令
   *
   * @param cmd
   * @return 返回值为0说明系统命令执行成功,其他值都是失败。
   */
  private int systemCMD(String cmd) {
   Runtime rt = Runtime.getRuntime();
   int value = 1;
   String[] excuteCMD = cmd.split("#");
   String os_type = excuteCMD[0];
   String four = excuteCMD[4];
   String[] count = four.split("
\\s");
   String needCMD = null;
   try {
    Process proc = null;
    if("windows".equals(os_type)){
     if (four.substring(four.length() - 4, four.length())
       .toUpperCase().equalsIgnoreCase(".BAT")) {
      if (count.length >= 2) {
       needCMD = "cmd.exe /c " + four;
      } else {
       needCMD = four;
      }
     } else {
      needCMD = "cmd.exe /c " + four;
     }
     proc = rt.exec(needCMD);
    }
    if("linux".equals(os_type)){
     String[] linuxCMD = {"/bin/sh","-c",four};
     proc = rt.exec(linuxCMD);
    }
    
    proc.waitFor();
    value = proc.exitValue();
   } catch (Exception e) {
    e.printStackTrace();
    serverJta.append("执行的命令不是系统命令!\n\n");
   }
   return value;
  }

  /**
   * client 端发送文件到server端,所以应为接收方
   *
   * @param file
   */
  private void serverReceiveFile(File file) {
   try {
    dos = new DataOutputStream(new FileOutputStream(file));
    dis = new DataInputStream(socket.getInputStream());
    DataOutputStream os = new DataOutputStream(socket
      .getOutputStream());

    int len = dis.read(data);
    String[] str = new String(data, 0, len, "utf-8").split(";");
    os.write("start".getBytes());
    while (dis.available() <= 0)
     ;//不斷接收內容,直至接收完畢
    while ((len = dis.read(data)) != -1) {
     dos.write(data, 0, len);
     dos.flush();
    }
    serverJta.append("接收文件名为:" + str[0] + "\n");
    serverJta.append("大小为: " + str[1] + "  字节\n");
    serverJta.append("接收到的文件路径及文件名为:" + file.getPath() + "\n");
    serverJta.append("接收文件大小为: " + file.length() + "  字节!\n");
    dos.close();
    dis.close();
    os.close();
   } catch (IOException e) {
    e.printStackTrace();
    serverJta.append("发送文件失败!\n\n");
    try {
     if(dos != null)dos.close();
     if(dis != null)dis.close();
    } catch (IOException e1) {
     e1.printStackTrace();
    }
   }
  }

  /**
   * server端拷贝文件到 client 端,所以应为发送方
   *
   * @param file
   */
  private void serverSendFile(File file) {
   try {
    int len;
    dis = new DataInputStream(new FileInputStream(file));
    dos = new DataOutputStream(socket.getOutputStream());
    DataInputStream is = new DataInputStream(socket
      .getInputStream());

    // dos.write((file.getName().getBytes(Charset.forName("UTF-8"))
    // + ";" + file.length()).getBytes());
    dos.write((file.getName().getBytes() + ";" + file.length())
      .getBytes());
    len = is.read(data);
    String start = new String(data, 0, len);

    if (start.equals("start")) {
     while ((len = dis.read(data)) != -1) {
      dos.write(data, 0, len);
      dos.flush();
     }
    }
    serverJta.append("发送文件大小为:" + file.length() + "字节!\n");
    dos.close();
    dis.close();
    is.close();
   } catch (IOException e) {
    e.printStackTrace();
    serverJta.append("发送文件失败!\n\n");
    try {
     if(dos != null)dos.close();
     if(dis != null)dis.close();
    } catch (IOException e1) {
     e1.printStackTrace();
    }
   }
  }
  /**
   * 发送响应消息给每一个线程==群发消息
   */
  @SuppressWarnings("unused")
  private void sendMessage() throws IOException { 
//            System.out.println(msg);
            for (Socket client : list) {
                pw = new PrintWriter(client.getOutputStream(), true);//清空所有緩存
                pw.println(msg);//發送內容給客戶端
            }
        }
 }
}

 

 

 

 

 

 

 

 

 

 

package za_socket_util;

import java.awt.Component;
import java.awt.Font;

import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;
/**
 * @param args
 * 作者:sza
 * 作用:server端显示界面
 */
@SuppressWarnings("serial")
public class ServerAwt extends Component {

 JFrame jf = new JFrame("ZA-socket-server");
 public static JTextArea jta = new JTextArea(30,200);
 JScrollPane jsp = new JScrollPane(jta);
 JScrollBar jsb = new JScrollBar();
 Font f1=new Font("宋体",Font.PLAIN,18);
 
 
 public void show(){
  jta.setEditable(false);
  jta.setLineWrap(true);
  jta.setSize(425, 665);
  jta.setFont(f1);
  jta.setEnabled(true);
  jta.setWrapStyleWord(true);
  
  jsp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  
  jf.add(jsp);
  jf.setSize(450, 687);
  jf.setLocation(260, 0);
  jf.setResizable(false);
  jf.setEnabled(true);
  jf.setVisible(true);
  jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
  jta.append("");
 }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值