【发布时间】:2014-03-22 12:35:34
【问题描述】:
我刚刚开始学习 C++ 和 Java。对于我的第一个项目,我制作了一个 C++ TCP 套接字服务器。不幸的是,它没有按我的预期工作。
它是如何工作的:
如果我启动 Java Android 客户端,我的 C++ 服务器会立即检测到新连接。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.intrologin_layout);
client = new TCPClient("10.0.2.2", 50120);
try {
new Thread() {
public void run() {
try {
client.startClient();
}
catch(Exception e) {
e.printStackTrace();
}
}
}.start();
}
catch(Exception e) {
e.printStackTrace();
}
}
发送字节也可以通过 Java Android 客户端工作:
output = new DataOutputStream(connectionSocket.getOutputStream());
output.write(Packet);
output.flush();
我的 C++ 服务器在控制台返回自动接收的数据包,效果很好, 但后来我尝试发回回复,recv 在我的 C++ 客户端上工作,但这是主要问题,它不在我的 Java 客户端上直到我关闭服务器进程或套接字。
C++ 服务器端:
pd->SendPacket("BYE\0", 4);
...
void Desc::SendPacket(const char* c_cpBuffer, int Length)
{
int BytesSended = send(m_Socket, c_cpBuffer, Length, 0);
if (BytesSended <= 0)
{
printf("Packet send failed with error: %d\n", WSAGetLastError());
}
}
Java Android 客户端:
public void startClient() throws Exception
{
connectionSocket = new Socket(ip, port);
input = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
output = new DataOutputStream(connectionSocket.getOutputStream());
messageReceiver = new Thread() {
public void run()
{
while(connectionSocket.isConnected()) {
try {
String receivedMessage = input.readLine();
input.toString();
if(receivedMessage != null) {
Log.e("ERROR", "ERROR");
Log.d("Received Message: ", receivedMessage);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
};
messageReceiver.start();
}
几周以来我一直在这个问题上,谢谢。
【问题讨论】:
-
也许我解释得不够清楚,Java Android 客户端,只有在我杀死 C++ 服务器进程或关闭套接字时才会收到消息。
-
input.toString();实际代码中不存在。
-
@mah 刚试了一下,没用。虽然如果我终止进程,它会收到它。 :(
-
@mah 非常感谢,这是真正的方向。最后,匿名用户的回答是正确的: pd->SendPacket("BYE\n", 4);像魅力一样工作。
-
很高兴你解决了这个问题。我会删除我以前的 cmets,因为他们真的没有提供任何帮助。
标签: c# java android c++ sockets