关于java写socket服务和c写的客户端的通信

lanandqiang 2007-04-15 10:52:37
您好:
最近由于一个项目的需要,客户端发送一个请求数据,服务端接受以后根据数据做出不同的回。我用java写了一个服务端,请求方为C语言写的,我的服务端程序启动以后,一直处在等待状态没有任何的反映:接受不到请求发来的数据,客户端也接受不到我的回应。而且不报任何异常,问题是,我用JAVA写了一个客户端测试代码却一切正常,麻烦大哥给指点一二。谢谢,我写的服务器端代码和做测试用的客户端代码如下:


SERVER:
import java.net.*;
import java.io.*;
class testserver1 implements Runnable
{
Socket s;
public testserver1(Socket s)
{
this.s=s;
}
public void run(){
try{
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos=new DataOutputStream(ops);
PrintWriter out;
while(true){
System.out.println("已进入循环!!");
String strword=br.readLine();
//br.flush();
System.out.println(strword);
//if(strword.equalsIgnoreCase("quit"))
// break;
//String strecho=(new StringBuffer(strword).reverse()).toString();
//////////////以下代码由于我怀疑是IO的原因,所以我用了各种输出形式结果失败
dos.writeBytes("Init_ok1"+"\n");//回应1
System.out.println("已成功回应了1");
//dos.flush();
ops.write("Init_ok2".getBytes());//回应2
ops.flush();
System.out.println("已回应了2");
out = new PrintWriter(ops,true);
out.println("Init_ok3"+"\n"); //回应3
System.out.println("已回应了3");
out.flush();
out.close();
break;
//destroy();
//stop();
}
br.close();
dos.close();
s.close();
}
catch(NoRouteToHostException ex3) //无法到达远程主机,原因是防火墙干扰或者中间路由器停机。
{
try{
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos=new DataOutputStream(ops);
dos.writeBytes("Init_Fail");
}
catch(Exception xe){}
ex3.fillInStackTrace();
System.out.println("failed");

}
catch(SocketTimeoutException e2){ //处理超时异常

try{
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos=new DataOutputStream(ops);
dos.writeBytes("Init_Fail--->out_times");
}
catch(Exception xe){}
e2.fillInStackTrace();
System.out.println("failed");

}
catch(SocketException e1){ //处理底层协议异常
try{
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos=new DataOutputStream(ops);
dos.writeBytes("Init_Fail-->xieyicuowu");
}
catch(Exception xe){}
e1.fillInStackTrace();
System.out.println("failed");

}
catch(Exception e3){
try{
InputStream ips=s.getInputStream();
OutputStream ops=s.getOutputStream();
BufferedReader br=new BufferedReader(new InputStreamReader(ips));
DataOutputStream dos=new DataOutputStream(ops);
dos.writeBytes("Init_Fail");
}
catch(Exception xe){
xe.fillInStackTrace();}

e3.printStackTrace();
System.out.println("failed");

}
}
}
class testserver2{
public static void main(String arsgs[]){
try{
ServerSocket ss=new ServerSocket(20000);
while(true){
System.out.println("Waiting for conncetion...");
Socket s=ss.accept();
System.out.println("已经接受到请求连接");
new Thread(new testserver1(s)).start();
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}


注请求的客户端的C代码我还没有见,是别人写的。写C的那个人说,他用C写了一个服务器端的代码来测试他的请求客户端,结果是正常的,我都晕了。。。。。。。。请教大哥
...全文
2766 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangyulc 2011-11-17
  • 打赏
  • 举报
回复
非常感谢!这个“\n”非常重要!!!!!!
名剑传奇 2009-11-23
  • 打赏
  • 举报
回复
你只要在C要发送的字符串或是数据后面加上 \n 即可
lanandqiang 2007-04-17
  • 打赏
  • 举报
回复
已经成功对应了 谢谢各位
lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
现在的关键是根本就接受不到数据啊
kouzhongling 2007-04-16
  • 打赏
  • 举报
回复
看到的所有资料都提到了字节顺序,我看这个应该是主要的区别之一
网络的数据是是要有字节顺序的比如一个双字节的汉字你如何解释它是大端还是小端?!
lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
是可以连上,也走了ACCPET,就是接收不到数据。不知道输入输出流的问题,不知道JAVA和C有什么区别?

kouzhongling 2007-04-16
  • 打赏
  • 举报
回复
对java不熟悉
帮你找些资料

=============================

http://www.mepal.cn/java-c-socket/tcpServer.java
http://www.mepal.cn/java-c-socket/tcpClient.java
http://www.mepal.cn/java-c-socket/tcpServer.c
http://www.mepal.cn/java-c-socket/tcpClient.c

都不长:
77 tcpClient.c
65 tcpClient.java
69 tcpServer.c
53 tcpServer.java

我的测试:
客户 => 服务器
linux => linux (c和java)
linux => windows (windows跑java,linux跑c)
windows => linux(windows跑java,linux跑c)

还没发现问题。
lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
附加注意;刚测试过了,在我机子上用抓包工具,可以接受到对方请求发来的数据,而我的服务却仍然接受不到请求的数据。请指点。。。。。。。。。。
kouzhongling 2007-04-16
  • 打赏
  • 举报
回复
http://forum.java.sun.com/thread.jspa?threadID=595470&messageID=3505200
lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
To:kouzhongling
你说的unix论坛 或 新闻组 java论坛或新闻组 ,是指什么啊?给个地址好吗。
lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
急啊。。。。。。。。。。。。。。。。。。
kouzhongling 2007-04-16
  • 打赏
  • 举报
回复
google搜索到的
这个问题还是挺普遍的

http://www.google.com/search?hl=en&newwindow=1&client=pub-2565527930429163&q=communication+between+c+and+java+
kouzhongling 2007-04-16
  • 打赏
  • 举报
回复
这个
问题是不是和楼主的很像呢
http://bbs.chinaunix.net/viewthread.php?tid=317247

kouzhongling 2007-04-16
  • 打赏
  • 举报
回复
这个问题没功底是解决不了的
虽说实际应用上没有用iso七个层的,但是一般的通讯都要经过4层以上
物理硬件的我们可以忽略,tcp\ip我们也可以忽略 但会话与表示层是不是能一遵守一致协议!?
字节顺序应该是表示层定义的
数据进入到表示层很显然就是应用相关了
我现在还没工作 搞通讯编程经验不足
搞通讯 建议到unix版问问,哪里搞通讯的高手多。这里还是学生多
也可以到unix论坛 或 新闻组 java论坛或新闻组问问!!!!
Wolf0403 2007-04-16
  • 打赏
  • 举报
回复
回复人:lanandqiang() () 信誉:100 2007-4-15 11:57:16 删除

再注:到目前为止,我还没有见请求方的C的代码,因为不是我写的啊。但写C的那个人说,他用C写了一个服务器代码去测试他的客户端代码,结果是正常的。我都晕了。。。。。。。。


回复人:frozenwindcn() () 信誉:100 2007-4-15 23:12:34 删除

是不是端口搞错了。或者是c和java的网络字节序不一样?

回复人:lanandqiang() () 信誉:100 2007-4-16 9:39:39 删除

To;frozenwindcn
首先可以肯定是断口是一致的,一核实过了.现在不太明白你说的:c和java的网络字节序不一样?是什么意思?

lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
麻烦大家给指点下。。。。。。。。。。。。。
bkwcl 2007-04-16
  • 打赏
  • 举报
回复
Client---Server
读写对应了没?
是否一个接受,一个发送?
lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
再次谢谢kouzhongling 很热心 谢谢
lanandqiang 2007-04-16
  • 打赏
  • 举报
回复
问题解决了:原因。readLine必须含有回车换行和C有区别的,也就是说人家传过来2进制流的话,
我就会一直等待出现回车换行,如果那样就死了。
谢谢大家
lanandqiang 2007-04-15
  • 打赏
  • 举报
回复
已经核实过了端口是一致的:20000。我的服务启动以后就停在那里不动了,服务和对方都没有任何的反应。
加载更多回复(4)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧