参考:
Java和C/C++程序实时通讯数据移植问题的研究
http://www.cn.ibm.com/developerWorks/java/joy-jcc/index.shtml

解决方案 »

  1.   

    大家都来关注一下这个很有挑战性的问题吧....
    (谢谢violetrose,那篇我看了)
      

  2.   

    java和vc用Socket通信与java、java之间或者vc、vc之间用socket通信有什么不同吗?只要定义好数据格式不就可以了?数据流都是二进制流,很容易转换的。既然使用多线程,还有必要使用事件绑定这种方式吗?阻塞式+多线程的效率要比事件高多了!
      

  3.   

    java和vc用Socket通信与java、java之间或者vc、vc之间用socket通信有什么不同吗?只要定义好数据格式不就可以了?数据流都是二进制流,很容易转换的。
    既然使用多线程,还有必要使用事件绑定这种方式吗?阻塞式+多线程的效率要比事件高多了!
      

  4.   

    package SocketServer;/**
     * Title:        Server Manager
     * Description:
     * Copyright:    Copyright (c) 2001
     * Company:      海陵兰软件开发有限公司
     * @author Kare
     * @version 1.0
     */
    import java.io.*;
    import java.net.*;
    import java.util.*;
    import AccessDB.*;
    import CommonClass.*;
    import MainFrame.*;public class kServerSocket extends Object implements Runnable
    {
      protected ServerSocket listenSock;
      protected Thread serverThread;  public kServerSocket(int listenPort) throws IOException
      {
        listenSock = new ServerSocket(listenPort);
      }  public void start()
      {
        serverThread = new Thread(this);
        serverThread.start();
      }  public void run()
      {
        while(true)
        {
          try
          {
            Socket newClient = listenSock.accept();        System.out.println(Thread.activeCount());
            ServerConn newConn = new ServerConn(newClient);
            newConn.start();
            System.out.println(Thread.activeCount());
          }
          catch(Exception e)
          {
            e.printStackTrace();
          }
        }
      }  public static void main(String[] args)
      {
        try
        {
          kServerSocket server = new kServerSocket(8086);
          server.start();
        }
        catch(Exception e)
        {
          System.out.println("Got Error");
          e.printStackTrace();
        }
      }
    }class ServerConn extends Thread implements ReadCallback
    {
      protected Socket clientSock;
      protected ReadThread reader;
      protected DataOutputStream outStream;
      private boolean bStop = false;
      private TStringList ReceiveString;
      private String Account = new String();
      private String WriteRead = new String();
      private String strAffirmIdentity = new String();  public ServerConn(Socket clientSock) throws IOException
      {
        this.clientSock = clientSock;
        outStream = new DataOutputStream(clientSock.getOutputStream());
        ReceiveString = new TStringList();
        reader = new ReadThread(this,clientSock);
        reader.start();
      }  public void run()
      {
        while(!bStop)
        {
          try
          {
            Thread.sleep(100);
          }
          catch(Exception e)
          {
            e.printStackTrace();
          }
        }
        if(WriteRead.equals("Write") && strAffirmIdentity.equals("Ok!"))
        {
          try
          {
            String fileName = new String();
            AccessDatabase accessDB = new AccessDatabase();
            fileName = accessDB.getFileName(Account);
            File file = new File("./ReceiveFile/" + Account + "/");
            if(!file.exists())
            {
              file.mkdir();
            }
            ReceiveString.SaveToFile("./ReceiveFile/" + Account + "/" + fileName);
          }
          catch(Exception e)
          {
            e.printStackTrace();
          }
        }
      }  public synchronized void dataReady(String str)
      {
        if(str != null)
        {
          processString(str);
        }
        else
        {
          disConnect();
          bStop = true;
          return;
        }
      }  public synchronized void processString(String inStr)
      {
        try
        {
          System.out.println("Got incoming string:" + inStr);
          ReceiveString.Add(inStr);
          if(inStr.startsWith("cBegin"))
          {
            String Password = new String();
            String IPAddress = new String();
            StringTokenizer st = new StringTokenizer(inStr,"$");
            st.nextToken();
            if(st.hasMoreTokens())
            {
              Account = st.nextToken();
            }
            if(st.hasMoreTokens())
            {
              Password = st.nextToken();
            }
            if(st.hasMoreTokens())
            {
              IPAddress = st.nextToken();
            }
            if(st.hasMoreTokens())
            {
              WriteRead = st.nextToken();
            }
            StringBuffer logStr = new StringBuffer(256);
            logStr.append("帐号:").append(Account).append(",   ");
            logStr.append("口令:").append(Password).append(",   ");
            logStr.append("IP地址:").append(IPAddress).append(",   ");
            logStr.append("登录类型:");
            if(WriteRead.equals("Write"))
              logStr.append("提交问题,   ");
            else
              logStr.append("索取答案,   ");
            java.util.Date currentTime = new java.util.Date();
            logStr.append("登录时间:").append(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(currentTime)).append(",   ");        AccessDatabase accessDB = new AccessDatabase();
            strAffirmIdentity = accessDB.AffirmIdentity(Account,Password,IPAddress,WriteRead);
            outStream.writeUTF(strAffirmIdentity);
            logStr.append(strAffirmIdentity).append("\n");
            MainFrame.addLogString(logStr.toString());
            if(strAffirmIdentity.equals("Ok!")) //身份验证正确,并且若是索取答案时数据库中有未发送的题目
            {
              if(WriteRead.equals("Write")) //提交问题
              {          }
              else //索取答案
              {
                String fileName = new String();
                fileName = accessDB.getAnswerFileName(Account);
                System.out.println(fileName);
                TStringList RevertString = new TStringList();
                RevertString.LoadFromFile("./RevertFile/" + Account + "/" + fileName);
                RevertString.Add("sEnd");
                for(int i=0;i<RevertString.getCount();i++)
                {
                  outStream.writeUTF(RevertString.getStrings(i));
                }
              }
            }
            else //身份验证失败,或索取答案时数据库中无未发送的题目
            {
              bStop = true;
              disConnect();
            }
          }
          if(inStr.equals("cEnd"))
          {
            bStop = true;
            disConnect();
          }
        }
        catch(Exception e)
        {
          e.printStackTrace();
          disConnect();
          return;
        }
      }  public synchronized void disConnect()
      {
        reader.closeConnection();
      }
    }/**
     *A thread dedicated to reading data from a socket connection.
     */
    class ReadThread extends Thread
    {
      protected Socket connectionSocket;  //the socket you are reading from
      protected DataInputStream inStream; //the input stream from the socket
      protected ReadCallback readCallback;
      private boolean stopRequested;  public ReadThread(ReadCallback callback,Socket connSock) throws IOException
      {
        connectionSocket = connSock;
        readCallback = callback;
        inStream = new DataInputStream(connSock.getInputStream());
        stopRequested = false;
      }  protected void closeConnection()
      {
        try
        {
          connectionSocket.close();
        }
        catch(Exception e)
        {
          e.printStackTrace();
        }
        finally
        {
          requestStop();
        }
      }  public void run()
      {
        while(!stopRequested)
        {
          try
          {
            String str = inStream.readUTF();
            readCallback.dataReady(str);
            Thread.sleep(10);
          }
          catch(Exception e)
          {
            readCallback.dataReady(null);
            e.printStackTrace();
          }
        }
      }  public void requestStop()
      {
        stopRequested = true;
        interrupt();
      }
    }interface ReadCallback
    {
      public void dataReady(String str);
    }
      

  5.   

    上面的代码主要的是ReadThread类和ReadCallback接口
      

  6.   

    没有什么特别的,了解一下什么是socket,就知道没有什么区别.都是传输binary流.
    clane(clane)说的没有错.
      

  7.   

    任何程序之间的socket通讯只要满足数据格式的统一就可以了,一般如果都是char(-127~128)就没有问题,倒是跨平台的Socket(如windows--unix)某些文件的控制字符不尽相同,如果是传输并创建文件应该注意,另外还有字符集问题等等。
      

  8.   

    小李飞刀的飞,小李飞刀的刀.我刚好也编了个这种程序,呵呵,做法都一样,你是看《Java2 编程详解》做的吧,这样做使用不上事件吗!至于socket通讯,就只传送string就行了,加一些标记,到目的地后再转换回来就行了拉!
      

  9.   

    经过一周研究,俺基本已经搞定以上的几个问题
    1.建立数据类型对应关系,对于无符号C数据类型Java用二倍长类型对应,在字节流转换时根据长
      度的对应关系将传来的值分解,组合
    2.利用反射动态生成Java的类,可以实现通用的结构和类的转换
    3.在ServerSocket端,每个Client对应一个线程来控制,java做多线程相对容易,这点还要再研究谢谢各位!