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("");
}
}