这是Client代码,仅仅用于测试Server:
import java.io.*;
import java.net.*;
public class EchoClient {
public static void main(String [] args){
Socket socket;
InputStream iStream=null;//输入流
OutputStream oStream=null;//输出流
DataOutputStream DOS;
String nodeID=null;
Double voltage=0.0;
if (args.length<1){ //判断命令加参数没有
System.out.println("you forget the name of the server!");
System.exit(1); //如果没加参数就退出
}
try{
socket=new Socket(args[0],7777);
oStream=socket.getOutputStream();
DOS=new DataOutputStream(oStream);
ObjectOutputStream oos=new ObjectOutputStream(DOS);//序列对象化
oos.writeObject("123456");
oos.writeDouble(12.1234);
oos.flush();
oos.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
=============================================
下面是Server的代码:
//SERVER实现的线城池的通信~~~~
import java.io.*;
import java.net.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.concurrent.*;//线程池类
public class EchoServer {
private int port=7777;//使用端口:8000
private ServerSocket serverSocket;
private ExecutorService executorService;//线程池
private final int POOL_SIZE=4;//单个CPU时,线程池中工作线程的数目
public EchoServer()throws IOException{//构造方法
serverSocket=new ServerSocket(port);//创建线程池
executorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()*POOL_SIZE);//Runtime的availableProcessors()方法返回当前系统CPU的数目
System.out.println("The server starts.......");
}
public void service(){
while(true){
Socket socket=null;
try{
socket=serverSocket.accept();//接收来自Client的连接
executorService.execute(new Handler(socket));//任务处理类Handler
}catch(IOException e){
e.printStackTrace();
}
}
}
public static void main(String args[])throws IOException{
new EchoServer().service();
}
}
class Handler implements Runnable{//负责与单个节点进行通信的类
private Socket socket;
private InputStream iStream=null;//输入流
private OutputStream oStream=null;//输出流
private DataInputStream DIS;
String nodeID=null;
Double voltage=0.0;
int ret=0;//用于判断数据库操作是否正确
public Handler(Socket socket){//Handler的构造方法
this.socket=socket;
}
private void getData()throws Exception{//该方法接受从节点穿传来的数据
iStream=socket.getInputStream();
DIS=new DataInputStream(iStream);
ObjectInputStream ois=new ObjectInputStream(DIS);//序列对象化
nodeID=(String)ois.readObject();
voltage=ois.readDouble();
}
private void processor(){//该方法processor负责处理数据--解析数据,将数据装入数据库
Connection con=null;
Statement stmt=null;
try{
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/study", "root", "433");
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ret = stmt.executeUpdate("insert into voltage values('"+nodeID+"','"+voltage+"')");
}catch(Exception ex){
ex.printStackTrace();
}
finally{
try{
stmt.close();
con.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
private void feedback()throws Exception{//该方法feedback负责反馈信息回节点
String echo_not="mistake";//操作不成功时的返回信息
String echo_ok=null;//操作成功时的返回信息,暂时未用
oStream=socket.getOutputStream();
if(ret>0){
;//数据库操作成功时,向node返回的信息
}else{
oStream.write(echo_not.getBytes());//数据库操作不成功时,向node返回的信息
oStream.flush();
}
;//
}
public void run(){//继承了Runnable类
try{
getData();
processor();
feedback();
}catch(Exception e){
e.printStackTrace();
}
finally{
try{
if(socket!=null){
socket.close();
}
}catch(IOException ex){
ex.printStackTrace();
}
}
}
}
===============
还有很多不足,我现在想把它改进一下,如:
(1)该Server的代码用了对象序列化,所以方便的实现与JAVA的Client的通信,如果要和其他的语言Client实现通信怎么办?--------如C语言
(2)相关的GUI问题~~
(3)请高手们一起解决一下,说说自己的观点
----------------解决方案--------------------------------------------------------
1.和客户的语言应该没有关系吧?socket只是一个接口
2.什么问题?
----------------解决方案--------------------------------------------------------
这些代码本身没有什么问题,我都用过了
现在的问题是,我想让Server端的代码更通用,更实用一些(如不用序列对象化什么的,
问:大家想想海还要做哪些修改比较好~~?
----------------解决方案--------------------------------------------------------