服务器端是C++开发的,Java开发客户端。客户端发送给服务器端的信息服务器那边可以收到,服务器也发出了响应,但是客户端一直阻塞,无法获取数据。不知道大伙能不能分享下这方面的经验。如果有样例程序更好。
在此先行谢过。
[code="java"]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.SocketChannel;
public class WhyNotWork {
/**
* @param args
* @throws IOException
* @throws UnknownHostException
* @throws IOException
*/
public static void main(String[] args) throws UnknownHostException {
String sendString = Header.get() + "hello ";
Socket socket = null;
try {
socket = new Socket("192.168.10.3", 5555);
} catch (IOException e) {
e.printStackTrace();
}
if (socket.isConnected()) {
System.out.println("is connected");
} else {
return;
}
PrintWriter writer = null;
BufferedReader reader = null;
try {
writer = new PrintWriter(socket.getOutputStream());
reader = new BufferedReader(new InputStreamReader(socket
.getInputStream()));
writer.println(sendString.getBytes());
writer.flush();
char[] buffer = new char[1024];
while (reader.read(buffer) != -1) {
System.out.println(new String(buffer));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (writer != null) {
writer.close();
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
[/code]
[quote]
while (reader.read(buffer) != -1) {
System.out.println(new String(buffer));
}
[/quote]
首先这个有问题,要全部收完了一起转,这样转不对的,会出现乱码.(打个比方,一个汉字2个byte,如果第一次只收到1个byte,就乱码了.)
还有Java和C通信,最好就用最原始的输入输出流,用封装的很容易出问题,因为C是没有封装的输入输出流的
C那边怎么做呢?
收Java发过去的如何判断已经收完了?
C发回数据了吗?
C发了数据是不是马上把Socket关了?
把writer先close,再执行reader的read试试。
[quote]用了一个socket模拟器测试了下,程序应该是正常的,可以正常收发。估计是服务器那边的原因了。 [/quote]
想知道到底是不是服务器端的响应发没发出,可以使用ethereal或者wireshark之类的工具监听一下就知道了。
你用telnet连接下服务器看看
telnet 192.168.10.3 5555
然后发送hello
看看能收到消息吗