package com.sinojava.haiyun;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
//服务器端类
public class ServerSort {
private Frame frame;
private TextArea display;
//用于航次计数
private int count = 0;
private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket ser;
private Socket soc;
//用于客户端技术
private int counter = 0;
ArrayList list = new ArrayList();
//创建Exporter对象exe
Exporter exe = new Exporter();
//构建服务器端GUI
public ServerSort() {
frame = new Frame("服务器端处理");
display = new TextArea();
frame.add(display);
frame.setSize(500,500);
frame.setLocation(200, 200);
frame.setVisible(true);
//退出程序
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
//运行服务器,连接客户端
public void runServer() {
try {
// 第一步:创建一个ServerSocket
ser = new ServerSocket(5000);
while(true) {
//计数多少个客户端
counter++;
//设置JTextArea不能被更改
display.setEditable(false);
// 第二步:等待一个连接
waitForConnection();
// 第三步:获取接受数据
getStreams();
// 第四步:连接处理
processConnection();
// 第五步:关闭连接
closeConnection();
}
}catch (IOException e) {
e.printStackTrace();
}
}
//向客户端发送信息
private void sendData(String message) {
try {
output.writeObject(message);
output.flush();
}
catch (IOException e) {
display.append("\n错误写入对象");
}
}
//第二步:等待一个连接
private void waitForConnection() throws IOException {
display.setText("等待连接\n");
soc = ser.accept();
//InetAddress类采用工厂设计模式,有三个静态工厂方法,如getHostName or getLocalHost。
display.append("Socket "+counter+" 接收来至:"+soc.getInetAddress().getHostName());
}
// 获取接受数据
private void getStreams() throws IOException {
output = new ObjectOutputStream(soc.getOutputStream());
output.flush();
input = new ObjectInputStream(soc.getInputStream());
display.append("\n获得I/O流\n\n\n");
}
// 连接处理
private void processConnection() throws IOException {
String message ="服务器: 连接成功\n\n\n";
output.writeObject(message);
output.flush();
do {
try {
message = (String)input.readObject();
//解析字符串
exe.splitText(message);
sendData("成功从服务器端接收处理后的数据:"+"\n\n");
//遍历集合
Iterator i = exe.list.iterator();
while (i.hasNext()) {
//将遍历出来的对象Object转成Exporter类型
exe = (Exporter) i.next();
//变量来累计航行次数
count++;
// 在集合中放入箱型参数
list.add(exe.getCnttype());
//发送字符数据给客户端
sendData("船名:"+exe.getShipname()+"\n");
sendData("航次:"+exe.getVoyage()+"\n");
sendData("提单号:"+exe.getBlno()+"\n");
sendData("目的港:"+exe.getDestination()+"\n");
sendData("集装箱尺寸:"+exe.getCntsize()+"\n");
sendData("箱型:"+exe.getCnttype()+"\n");
sendData("箱量:"+exe.getCntqnt()+"\n");
sendData("经纪人:"+exe.getCntoperator()+"\n");
sendData("备注:"+exe.getRemark()+"\n");
sendData("本航次的船名: "+exe.getShipname()+"; 航次: "+exe.getVoyage()+"; 业务量: "+exe.getCntqnt()+"; 箱型: "+exe.getCnttype()+"\n");
sendData("--------------------------------------------------\n");
}
sendData("--------------------------------------------------\n");
sendData("一共有:" + count + "航次"+"\n");
sendData(list.size()+" 个箱型 :"+list+"\n");
display.append("文件处理完成,已发送至客户端!"+"\n");
display.setCaretPosition(display.getText().length());
}
catch(ClassNotFoundException e) {
display.append("\n未知对象类型接收");
}
} while(true);
}
//关闭连接
private void closeConnection() throws IOException {
display.append("\n用户终端连接");
output.close();
input.close();
soc.close();
}
//main方法
public static void main(String args[]) {
ServerSort ss = new ServerSort();
//运行服务器
ss.runServer();
}
}