c中客户端怎么接收服务器的消息,java - C 服务器一个 Java 客户端套接字连接。 在客户端阅读消息时,我在实际消息之前看到空格 - 堆栈内存溢出...

我有一个 C 语言的服务器和一个 Java 客户端(TCP 连接)。 连接它们后,我从客户端发送第一条消息,然后从服务器发送响应,此时一切正常(客户端在控制台中写入收到的字符串),当我向服务器发送另一条消息并且服务器给出响应时,这response 放在一个长字符串的末尾,其中的第一个字符是未知的。 例如在客户端我看到:

Send a message: type and press Enter key

HELLO

Server: HI

HELLO AGAIN

Server:

HELLO HELLO

Server:

服务器端的输出没问题(客户端和服务器的消息都可以看到)

这是我的服务器:

#include

#include

#include

#include

#include

#include

#include

#include

#define PORT 10011

int main(){

int socketfd, ret;

struct sockaddr_in serverAddr;

int newSocket;

struct sockaddr_in newAddr;

socklen_t addr_size;

char buffer[1024];

pid_t childpid;

socketfd = socket(AF_INET,SOCK_STREAM,0);

if(socketfd < 0){

printf("\n error in socket creation");

return -1;

}

printf("\n Server socket is created\n");

memset(&serverAddr, '\0', sizeof(serverAddr));

serverAddr.sin_family = AF_INET;

serverAddr.sin_port = htons(PORT);

serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

ret = bind(socketfd, (struct sockaddr*)&serverAddr, sizeof(serverAddr));

if(ret < 0){

printf("Error in binding\n");

return -1;

}

printf("[*]Bind to port %d\n", PORT);

if(listen(socketfd, 10) == 0){

printf("Listening...\n");

}else{

printf("Error in binding\n");

}

newSocket = accept(socketfd, (struct sockaddr*)&newAddr, &addr_size);

if( newSocket < 0){

printf("No socket\n");

exit(1);

}

int size = 1024;

char buff[size];

char sbuff[size];

int n;

int reader;

memset(buff, 0, size);

memset(sbuff, 0, size);

// infinite loop for receiving and sending

for (;;) {

// read the message from client and copy it in buffer

reader = recv(newSocket, buff, 1024 * sizeof(char), 0);

if (reader == -1) {

perror("recv()");

break;

} else if (reader == 0) {

break;

} else {

// print buffer which contains the client contents

printf("From client: %s\t To client : ", buff);

// if msg contains "Exit" then server exit and chat ended.

if (strncmp("exit", buff, 4) == 0) {

printf("Server Exit...\n");

break;

}

bzero(buff, size);

n = 0;

// copy server message in the buffer

while ((sbuff[n++] = getchar()) != '\n');

// and send that buffer to client

write(newSocket, sbuff, sizeof(sbuff));

bzero(sbuff,size);

}

}

close(newSocket);

return 0;

}

这是我的客户:

import java.io.*;

import java.net.*;

public class ClientJava

{

public static void main(String[] args) throws Exception

{

Socket sock = new Socket("127.0.0.1", 10011);

// reading from keyboard (keyRead object)

BufferedReader keyRead = new BufferedReader(new InputStreamReader(System.in));

// sending to client (pwrite object)

OutputStream ostream = sock.getOutputStream();

PrintWriter pwrite = new PrintWriter(ostream, true);

// receiving from server ( receiveRead object)

InputStream istream = sock.getInputStream();

BufferedReader receiveRead = new BufferedReader(new InputStreamReader(istream), 1024);

System.out.println("Send a message: type and press Enter key");

String receiveMessage, sendMessage;

while(true)

{

sendMessage = keyRead.readLine(); // keyboard reading

pwrite.println(sendMessage); // sending to server

pwrite.flush(); // flush the data

// for(int i=0; i<1024;i++){

// String s=receiveRead.read();

// receiveMessage[i]=s;

// if(s == ">") {

// return i;

// }

// }

// System.out.println(receiveMessage);

receiveMessage = receiveRead;

if((receiveMessage) != "0") //receive from server

{

System.out.println(receiveMessage); // displaying at DOS prompt

}

//removeNonAscii(receiveMessage);

//replaceUnreadable(receiveMessage);

receiveMessage = receiveMessage.substring(0,0);

}

}

private static String removeNonAscii(String s){

StringBuffer sb = new StringBuffer();

for(int i=0; i

if(s.charAt(i) < 128){

sb.append(s.charAt(i));

}

}

return sb.toString();

}

private static String replaceUnreadable(String s){

String clean = s.replaceAll("\\P{Print}", "");

return clean;

}

}

调试后我发现第二次接收消息时, recieveMessage充满了空字符,实际消息到达字符串的末尾(因此在控制台中不可见)。 如何清理字符串或将消息放在它的开头? 谢谢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值