使用套接字在服务器(ANSI C)和客户端(JAVA)之间进行通信

使用套接字在服务器(ANSI C)和客户端(JAVA)之间进行通信,java,c,sockets,client-server,communication,Java,C,Sockets,Client Server,Communication,好的,我有个问题。我有一个用Java(客户机-服务器)编写的小项目(游戏)。一切正常。但我想将服务器重写为ANSIC。我启动服务器,它等待来自客户端的连接。当我启动客户端时,就会建立连接。在这一点上,一切都很好。但是,当我试图从服务器发送东西到客户端时,服务器发送,但客户端没有接收到它。你知道为什么吗 服务器源: #include <windows.h> #include <stdlib.h> #include <stdio.h> #include <w

好的,我有个问题。我有一个用Java(客户机-服务器)编写的小项目(游戏)。一切正常。但我想将服务器重写为ANSIC。我启动服务器,它等待来自客户端的连接。当我启动客户端时,就会建立连接。在这一点上,一切都很好。但是,当我试图从服务器发送东西到客户端时,服务器发送,但客户端没有接收到它。你知道为什么吗

服务器源:

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <winsock2.h>

DWORD WINAPI receive_cmds(LPVOID *lpParam) {
SOCKET *players = (SOCKET *) lpParam;
SOCKET player1 = (SOCKET)players[0];
SOCKET player2 = (SOCKET)players[1];
char recvBuff[100];
char sndBuff[100];
int nReadBytes;
int turn = 1;
int res;

printf("Utworzono nowy pokoj.\r\n");

strcpy(sndBuff,"PLAYER1");
printf("%s\n",sndBuff);
if((res = send(player1,sndBuff,sizeof(sndBuff),0)) == 0) {
    printf("Gracz 1 rozlaczony.\n");
    closesocket(player1);
    closesocket(player2);
    printf("Zamykam pokoj.\n");
    ExitThread(0);
}
strcpy(sndBuff,"TURN1");
printf("%s\n",sndBuff);
if((res = send(player1,sndBuff,sizeof(sndBuff),0)) == 0) {
    printf("Gracz 1 rozlaczony.\n");
    closesocket(player1);
    closesocket(player2);
    printf("Zamykam pokoj.\n");
    ExitThread(0);
}
strcpy(sndBuff,"PLAYER2");
printf("%s\n",sndBuff);
if((res = send(player2,sndBuff,sizeof(sndBuff),0)) == 0) {
    printf("Gracz 2 rozlaczony.\n");
    closesocket(player1);
    closesocket(player2);
    printf("Zamykam pokoj.\n");
    ExitThread(0);
}
strcpy(sndBuff,"TURN0");
printf("%s\n",sndBuff);
if((res = send(player2,sndBuff,sizeof(sndBuff),0)) == 0) {
    printf("Gracz 2 rozlaczony.\n");
    closesocket(player1);
    closesocket(player2);
    printf("Zamykam pokoj.\n");
    ExitThread(0);
}

while(TRUE) {
    if(turn == 1) {
        nReadBytes = recv(player1, recvBuff, sizeof(recvBuff), 0);
        if(nReadBytes == 0) {
            printf("Gracz 1 rozlaczony.\n");
            closesocket(player1);
            closesocket(player2);
            printf("Zamykam pokoj.\n");
            ExitThread(0);
        } else {
            printf("Odczytalem dane od gracza 1.\n");
            printf("%s\n",recvBuff);
        }
    }
}
}

int main(void) {
DWORD thread;
WSADATA wsaData;
SOCKET sock;
SOCKET players[2];
struct sockaddr_in from;
struct sockaddr_in server;
int ret;
int fromlen;

printf("Serwer oczekuje na polaczenia.\r\n");

if((ret = WSAStartup(0x101,&wsaData)) != 0) {
    return 0;
}

server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=htons(5000);

if((sock=socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET) {
    return 0;
}

if(bind(sock,(struct sockaddr*)&server,sizeof(server)) != 0) {
    return 0;
}

if(listen(sock,5) != 0) {
    return 0;
}

fromlen = sizeof(from);

while(TRUE) {
    players[0] = accept(sock,(struct sockaddr*)&from,&fromlen);
    printf("Gracz 1 polaczony\r\n");
    players[1] = accept(sock,(struct sockaddr*)&from,&fromlen);
    printf("Gracz 2 polaczony\r\n");
    CreateThread(NULL, 0,receive_cmds,(LPVOID)players, 0, &thread);
}

closesocket(sock);
WSACleanup();

return 0;
}

提前感谢您的帮助

问题似乎在于您试图确定要发送的字节数的方式:
sizeof(sndBuff[100])
。由于sndBuff是char[100],
sizeof(sndBuff[…])
是单个char的大小。所以你总是只发送一个字节(更进一步,100甚至不是一个有效的索引)。只需使用strlen(sndBuff)来确定要发送的字节数

编辑
第二点似乎是,您的客户端在.readLine()中读取unsing
,但您不发送任何换行。尝试添加它们。

在java客户端,您正在使用readline函数从套接字读取数据,该函数将在输出之前等待,直到新行出现或套接字关闭。我建议您在从服务器发送的消息中附加“\n”。

它也不是这样工作的。在我在这里发布问题之前,我忘了更正这个问题。但是它仍然不能解决我的问题。也许你可以编辑你的问题,这样我们就可以看到你现在使用的代码了。唯一的变化是我使用了sizeof(sndBuff)而不是sizeof(sndBuff[100])。斯特伦(sndBuff)也不起作用……它起作用了!我只是简单地发送这样的“消息\n”。谢谢您不能假设
send()
发送的内容与所告知的内容一样多。您也不能假设
recv()
收到的信息与它所说的一样多。始终检查返回值,如果大于0,则将其与这些调用中传递的数据大小进行匹配。然后循环,直到发送/接收所有信息。有关详细信息,请参阅文档。请使用
strlen()
,而不是
sizeof()
package game;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Connection extends Thread{
private static final int PORT = 5000;
private static InetAddress IP;
private static Socket socket = null;
private BufferedReader in;
private PrintWriter out;
private Game game;

public Connection(Game game){
this.game = game;
try {
    IP = InetAddress.getByName(game.getAddr());
    socket = new Socket(IP,PORT);
    out = new PrintWriter(socket.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (Exception e) {
    e.printStackTrace();
}
}

public void initGame() {
String message;
System.out.println("Polaczono.");
message = rcv();
System.out.println(message);
if((message.contains("PLAYER1")) == true) {
    Game.player = 1;
} else if((message.contains("PLAYER2")) == true) {
    Game.player = 2;
}
message = rcv();
System.out.println(message);
if((message.contains("TURN1")) == true) {
    Game.turn = true;
} else if((message.contains("TURN0")) == true) {
    Game.turn = false;
}
}

public void listen() {
if(Game.turn == false) {
    String message = rcv();
    System.out.println("Msg rcv: " + message);
    if(message.contains("CREATE")) {
    System.out.println("CREATE");
    Game.unitList.add(new Unit(
        Integer.parseInt(message.substring(6,8)),
        Integer.parseInt(message.substring(8,10)),
        Integer.parseInt(message.substring(10,12)),
        Integer.parseInt(message.substring(12,14))));
    for(Unit u : Game.unitList) {
        u.writeUnit();
    }
    }
    if(message.contains("DELETE")) {
    System.out.println("DELETE");
    for(Unit u : Game.unitList) {
        u.writeUnit();
    }
    for(Unit u : Game.unitList) {
        if(u.getX() == Integer.parseInt(message.substring(6,8))
        && u.getY() == Integer.parseInt(message.substring(8,10))) {
        Game.unitList.remove(u);
        }
    }
    System.out.println("Po usunieciu:");
    for(Unit u : Game.unitList) {
        u.writeUnit();
    }
    }
    if(message.contains("MOVE")) {
    System.out.println("MOVE");
    for(Unit u : Game.unitList) {
        u.writeUnit();
    }
    for(Unit u : Game.unitList) {
        if(u.getX() == Integer.parseInt(message.substring(4,6))
        && u.getY() == Integer.parseInt(message.substring(6,8))) {
        System.out.println("Znalazlem jednostke do przesuniecia");
        u.setX(Integer.parseInt(message.substring(8,10)));
        u.setY(Integer.parseInt(message.substring(10,12)));
        }
    }
    }
    if(message.contains("OCCUPY")) {
    System.out.println("OCCUPY");
    for(Building u : Game.buildingList) {
        if(u.getX() == Integer.parseInt(message.substring(4,6))
        && u.getY() == Integer.parseInt(message.substring(6,8))) {
        u.setOwner(Integer.parseInt(message.substring(8,10)));
        u.setSS();
        }
    }
    }
    if(message.contains("LOSE")) {
    System.out.println("LOSE");
    LoseWindow loseWindow = new LoseWindow();
    }
    if(message.contains("TURN1")){
    Game.turn = true;
    }
}
}

public void snd(String s) {
out.println(s);
}

public String rcv() {
String message = null;
try {
    message = in.readLine();
} catch (Exception e) {
    e.printStackTrace();
}
return message;
}

public void closeConnection() {
try {
    socket.close();
    System.out.println("Zakonczono polaczenie.");
} catch (IOException e) {
    e.printStackTrace();
}
}

public Socket getSocket() {
return socket;
}
}