我刚开始学习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客户端,直到我关闭服务器进程或套接字。 < / p>
C ++ serverside:
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();
}
我坚持这个问题好几周了,谢谢。
答案 0 :(得分:1)
你有input.readLine(),除非检测到换行符,否则不会返回。如果您的服务器发送通过换行符终止的消息,那么您的Java客户端应该选择它。
以下是代码打印从服务器接收的内容。使用BufferedInputStream而不是BufferedReader。 Haven未对以下代码进行测试,但每次最多可从服务器读取10个字节。因为它是缓冲的,我不确定&#34;实时&#34;它是。例如,服务器发送3个字符然后休眠5秒并发送7个字符。客户端是否会立即收到3个字符并在5秒后打印出7个字符,或者客户端将等待并在5秒钟后收到10个字符并立即打印所有10个字符,您需要对其进行测试。
BufferedInputStream input = new BufferedInputSream(socket.getInputStream());
byte[] buffer = new byte[10]; // 10 bytes buffer
int bytesRead = 0;
while( (bytesRead=input.read(buffer)) !=-1 ) { // read up to 10 bytes
String str = new String(buffer,0,bytesRead); // convert bytes to String using default encoding
System.out.println("Data received: " + str);
}
答案 1 :(得分:0)
我遇到了同样的问题一个月,甚至重做整个项目不同仍然没有帮助我,问题是如此简单。 in.readline()
函数期望行结束继续,因此您应该将它附加到缓冲区。
pd->SendPacket("BYE\0\n", 4);
希望它有所帮助,就像它帮助了我一样。