下面说一下我的需求:
1.要实现JAVA与VC++的SOCKET通信。
2.要使实现监听多个端口。
3.要在Servlet启动时将监听启动。
4.要实时将数据推送到页面。
———————————————————————————————————————————————————————
根据需求写的线程监听代码如下:
java 代码
- package com.test.youCompany.comet;
- import java.io.BufferedReader;
- 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.Date;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import java.util.Vector;
- import net.sf.json.JSONArray;
- import net.sf.json.JSONException;
- import com.test.youCompany.core.common.Constants;
- import com.test.youCompany.core.json.JsonObjectFactory;
- import com.test.youCompany.core.util.StringUtils;
- import com.test.youCompany.domain.Yc;
- import com.test.youCompany.domain.Yx;
- import dojox.cometd.Bayeux;
- import dojox.cometd.Client;
- public class ServerThread extends Thread
- {
- public static Bayeux bayeux;
- public static Client client;
- public static final String YC = "yc";
- public static final String YX = "yx";
- public static final String TRIP = "trip";
- public static final String PRONUM = "command";
- Socket clientRequest;//用户连接的通信套接字
- ServerSocket serverSocket;
- BufferedReader input; //输入流
- PrintWriter output; //输出流
- private String popedom = "";//线程权限
- // serverThread的构造器
- public ServerThread(int s)
- {
- ServerSocket rServer = null;
- try
- {
- rServer = new ServerSocket(s);
- System.out.println("Welcome to the server!");
- System.out.println(new Date());
- System.out.println("The server is ready!");
- System.out.println("Port: " + rServer.getLocalPort());
- }
- catch (IOException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- this.serverSocket=rServer;// 接收receiveServer传来的套接字
- }
- public ServerThread(int s,String yt)
- {
- ServerSocket rServer = null;
- try
- {
- rServer = new ServerSocket(s);
- System.out.println("Welcome to the server!");
- System.out.println(new Date());
- System.out.println("The server is ready!");
- System.out.println("Port: " + rServer.getLocalPort());
- this.setPopedom(yt);
- }
- catch (IOException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- this.serverSocket=rServer;// 接收receiveServer传来的套接字
- }
- public static void setBayeux(Bayeux bayeux)
- {
- ServerThread.bayeux = bayeux;
- ServerThread.client =bayeux.newClient(Constants.DFDATACLENT, null);
- // System.out.println("设置协议成功.");
- }
- public void run()
- { //线程的执行方法
- InputStreamReader reader;
- boolean done=false;
- while(!done)
- {
- try
- {
- this.clientRequest = this.serverSocket.accept();
- // System.out.println("New connection accepted "+ clientRequest.getInetAddress() + ":" + clientRequest.getPort());
- if(clientRequest != null)
- {
- reader=new InputStreamReader(clientRequest.getInputStream());
- input=new BufferedReader(reader);
- while (true)
- {
- String message = input.readLine();
- if (message == null)
- break;
- // System.out.println("以下是从端口" + serverSocket.getLocalPort() + "中得到数据");
- if(this.popedom.equalsIgnoreCase(ServerThread.YC))
- {
- if(message.endsWith("]]"))
- sendDataToView(message,ServerThread.YC);
- }
- else if(this.popedom.equalsIgnoreCase(ServerThread.YX))
- {
- if(message.endsWith("]]"))
- sendDataToView(message,ServerThread.YX);
- }
- else if(this.popedom.equalsIgnoreCase(ServerThread.TRIP))
- {
- }
- else if(this.popedom.equalsIgnoreCase(ServerThread.PRONUM))
- {
- }
- // showMessage(message);
- // sender(message.);
- }
- try
- {
- Thread.sleep(300);
- }
- catch (InterruptedException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- else
- {
- try
- {
- Thread.sleep(300);
- }
- catch (InterruptedException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
- catch(IOException e)
- {
- System.out.println(e.getMessage());
- }
- }//end of while
- try
- {
- clientRequest.close(); //关闭套接字
- }
- catch(IOException e)
- {
- System.out.println(e.getMessage());
- }
- }
- public void sender(String command)
- {
- OutputStreamWriter writer;
- try
- { //初始化输入、输出流
- writer=new OutputStreamWriter(clientRequest.getOutputStream());
- output=new PrintWriter(writer,true);
- }
- catch(IOException e)
- {
- System.out.println(e.getMessage());
- }
- output.println(command);//客户机连接欢迎词
- }
- /**
- * 将数据传送到页面。
- * @param message
- */
- private void sendDataToView(String message, String str)
- {
- if(bayeux != null && client != null)
- {
- String result;
- Map msg = new HashMap();
- if(this.popedom.equalsIgnoreCase(ServerThread.YC))
- {
- result = getYcDataView(message);
- if(result != null)
- msg.put("chat", result);
- }
- else if(this.popedom.equalsIgnoreCase(ServerThread.YX))
- {
- result = getYxDataView(message);
- if(result != null)
- {
- msg.put("chat", result);
- }
- }
- bayeux.publish(client,"/dfChat/" + str,msg,""+msg.hashCode());
- // System.out.println("数据已发出,请确认。");
- }
- }
- private void pushDataToBus(List<yc></yc> list)
- {
- }
- @SuppressWarnings("unchecked")
- private String getYcDataView(String message)
- {
- int i = 0;
- int j = 0;
- try
- {
- List <list></list> ycData = JsonObjectFactory.getNomalList(message);
- List<yc></yc> jsonData = new Vector<yc></yc>();
- for(Iterator <list></list> equipment = ycData.iterator(); equipment.hasNext();i++)
- {
- List ycList = equipment.next();
- for(Iterator ycValue = ycList.iterator();ycValue.hasNext();j++)
- {
- Yc singleData = new Yc();
- singleData.setModtime(new Date());
- try
- {
- singleData.setValue((Double)ycValue.next());
- }
- catch(ClassCastException e)
- {
- singleData.setValue(Double.valueOf(ycValue.next().toString() + ".0"));
- }
- singleData.setStationid(i);
- singleData.setYcid(j);
- jsonData.add(singleData);
- }
- j = 0;
- }
- pushDataToBus(jsonData);
- return JSONArray.fromCollection(jsonData, StringUtils.getStrings(Constants.YCNONEED)).toString();
- }
- catch(JSONException e)
- {
- System.out.println(e.getMessage());
- return null;
- }
- catch(Exception e)
- {
- System.out.println(e.getMessage());
- return null;
- }
- }
- @SuppressWarnings("unchecked")
- private String getYxDataView(String message)
- {
- int i = 0;
- int j = 0;
- try
- {
- List> ycData = JsonObjectFactory.getNomalList(message);
- List<yx></yx> jsonData = new Vector<yx></yx>();
- for(Iterator> equipment = ycData.iterator(); equipment.hasNext();i++)
- {
- List<integer></integer> yxList = equipment.next();
- for(Iterator<integer></integer> yxValue = yxList.iterator();yxValue.hasNext();j++)
- {
- Yx singleData = new Yx();
- singleData.setStationid(i);
- singleData.setYxid(j);
- singleData.setValue(yxValue.next());
- jsonData.add(singleData);
- }
- j = 0;
- }
- return JSONArray.fromCollection(jsonData, StringUtils.getStrings(Constants.YXNONEED)).toString();
- }
- catch(JSONException e)
- {
- System.out.println(e.getMessage());
- return null;
- }
- }
- private void setPopedom(String popedom)
- {
- this.popedom = popedom;
- }
- }
Servlet代码如下:
java 代码
- package com.test.youCompany.comet;
- import javax.servlet.ServletConfig;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import com.test.youCompany.core.common.Constants;
- import com.test.youCompany.core.common.DFPropertyOwner;
- import com.test.youCompany.core.util.StringUtils;
- public class JMessagePushServlet extends HttpServlet
- {
- /**
- *
- */
- private static final long serialVersionUID = -832833032007994994L;
- final int RECEIVE_PORT = 9090;
- public void init(ServletConfig servletConfig) throws ServletException
- {
- super.init(servletConfig);
- Thread serverThread = null;
- try
- {
- String [] ports = StringUtils.getStrings(DFPropertyOwner.getKeyValue("ArrPort", Constants.GLOBAL_PROPERTIES));
- String [] portsRight = StringUtils.getStrings(DFPropertyOwner.getKeyValue("PortRights", Constants.GLOBAL_PROPERTIES));
- for(int i = 0;i
- {
- if(i < portsRight.length)
- serverThread = new ServerThread(Integer.valueOf(ports[i]),portsRight[i]);//监控项目
- else
- serverThread = new ServerThread(Integer.valueOf(ports[i]));//没有指定监控项目
- serverThread.setName(Constants.THREANNAMES + i);
- serverThread.start();
- }
- System.out.println("线程开始启动");
- }
- catch (Exception e)
- {
- System.out.println(e.getMessage());
- }
- }
- }
以下是WEB.xml配置
java 代码
- <servlet></servlet>
- <servlet-name></servlet-name>MessageServer
- class>com.test.youCompany.comet.JMessagePushServletclass>
- <load-on-startup></load-on-startup>1
———————————————————————————————————————————————————————
在使用过程这种方法还是有一些弊端,它的效率不高,在处理大的数据时可能产生错误,比如接受到的是坏数据,等。在网上略看了一下NIO的实现,以后我尝试。