一起来研究:Java和C之间通过Socket通讯的问题 参考:Java和C/C++程序实时通讯数据移植问题的研究http://www.cn.ibm.com/developerWorks/java/joy-jcc/index.shtml 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 大家都来关注一下这个很有挑战性的问题吧....(谢谢violetrose,那篇我看了) java和vc用Socket通信与java、java之间或者vc、vc之间用socket通信有什么不同吗?只要定义好数据格式不就可以了?数据流都是二进制流,很容易转换的。既然使用多线程,还有必要使用事件绑定这种方式吗?阻塞式+多线程的效率要比事件高多了! java和vc用Socket通信与java、java之间或者vc、vc之间用socket通信有什么不同吗?只要定义好数据格式不就可以了?数据流都是二进制流,很容易转换的。既然使用多线程,还有必要使用事件绑定这种方式吗?阻塞式+多线程的效率要比事件高多了! 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);} 上面的代码主要的是ReadThread类和ReadCallback接口 没有什么特别的,了解一下什么是socket,就知道没有什么区别.都是传输binary流.clane(clane)说的没有错. 任何程序之间的socket通讯只要满足数据格式的统一就可以了,一般如果都是char(-127~128)就没有问题,倒是跨平台的Socket(如windows--unix)某些文件的控制字符不尽相同,如果是传输并创建文件应该注意,另外还有字符集问题等等。 小李飞刀的飞,小李飞刀的刀.我刚好也编了个这种程序,呵呵,做法都一样,你是看《Java2 编程详解》做的吧,这样做使用不上事件吗!至于socket通讯,就只传送string就行了,加一些标记,到目的地后再转换回来就行了拉! 经过一周研究,俺基本已经搞定以上的几个问题1.建立数据类型对应关系,对于无符号C数据类型Java用二倍长类型对应,在字节流转换时根据长 度的对应关系将传来的值分解,组合2.利用反射动态生成Java的类,可以实现通用的结构和类的转换3.在ServerSocket端,每个Client对应一个线程来控制,java做多线程相对容易,这点还要再研究谢谢各位! 这个算法很让我头疼 问一个关于String.replaceAll(String a,String b)的问题!!!!!急 高手进,能不能用一个方法来代替这两个方法? 随机数 100分相送!关于Datagrampacket 两个.java文件互相调用方法的问题! 这个结果是什么?又是为什么? 我剩的只有10 分,我要删除相对目录下的文件,怎么办??? 在JTable中如何将一个小控件添加到指定的单元格 如何清空一个文件?? weblogic6. console窗口? 没有人关心javascript吗?
(谢谢violetrose,那篇我看了)
既然使用多线程,还有必要使用事件绑定这种方式吗?阻塞式+多线程的效率要比事件高多了!
* 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);
}
clane(clane)说的没有错.
1.建立数据类型对应关系,对于无符号C数据类型Java用二倍长类型对应,在字节流转换时根据长
度的对应关系将传来的值分解,组合
2.利用反射动态生成Java的类,可以实现通用的结构和类的转换
3.在ServerSocket端,每个Client对应一个线程来控制,java做多线程相对容易,这点还要再研究谢谢各位!