将C++ Unix服务器/套接字连接到Java Windows客户端/套接字

4

首先感谢您的时间...

我在我的MacBook上使用C ++创建了一个服务器套接字,在另一台运行Windows XP的计算机上使用Java创建了客户端/套接字。我已经指定了端口为5000,但我无法正确指定主机,因此无法建立连接。当我在Windows XP中使用WinSock2创建C++服务器/套接字时,使用localhost可以完美地建立连接...有任何想法吗?

提前感谢

C ++ 代码


/* SOCKET VARIABLES */
int sock;
struct sockaddr_in server;
int mysock;
char buff[1024];
int rval;


/*CREATE SOCKET*/
sock =socket(AF_INET, SOCK_STREAM, 0);
if (sock<0) 
{
    perror("*FAILED TO CREATE SOCKET*");
    exit(1);
}

server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port=5000;

/*CALL BIND*/
if (bind(sock, (struct sockaddr *)&server, sizeof(server)))
{
    perror("BIND FAILED");
    exit(1);
}


/*LISTEN*/
listen(sock, 5);


/*ACCEPT*/
do{

    mysock= accept(sock, (struct sockaddr *) 0, 0);

    if (mysock==-1) 
    {

        perror ("ACCEPT FAILED");
    }
    else
    {
        memset(buff, 0, sizeof(buff));

        if ((rval=recv(mysock, buff, sizeof(buff), 0)) <0) {
            perror("READING STREAM MESSAGE ERROR");
        }
        else if(rval==0)
            printf("Ending connection");
        else
            printf("MSG: %s\n", buff);

        printf("GOT THE MESSAGE (rval = %d)\n", rval);

    }

    return 0;
}while (1) ;

Java代码


导入 java.io. 和 java.net. 包:

public class SOK_1_CLIENT {

public void run() throws Exception
{
    Socket SOCK =new Socket ("localhost",5000);
    PrintStream PS =new PrintStream(SOCK.getOutputStream());
    PS.println("HELLO TO SERVER FROM CLIENT");

    InputStreamReader IR =new InputStreamReader(SOCK.getInputStream());
    BufferedReader BR = new BufferedReader(IR);

    String MESSAGE =BR.readLine();
    System.out.println(MESSAGE + "java");
}

}



4
如果您没有DNS服务器,应该使用服务器的IP地址来代替"localhost"。 - Typo
1
如果您没有DNS、WINS或设置您的“hosts”文件,则需要使用IP地址。 - Peter Lawrey
我将Java代码从 Socket SOCK =new Socket ("localhost",5000); 改成了 Socket SOCK =new Socket ("172.16.149.14",5000); 这是我的服务器IP,但我仍然收到相同的错误...服务器正常工作,但客户端无法连接。 - m_papas
1
你们是在同一个本地网络上测试吗?IP地址172.16.149.14似乎不是标准的本地IP地址,这种情况下它可能被防火墙屏蔽了。 - diddles
添加到diddles:每个主机都可以ping另一个吗? - Gary
1个回答

1
在Java客户端中,使用运行服务器的系统的IP地址而不是“localhost”。Localhost将引用运行客户端代码的计算机的本地环回地址127.0.0.1,但是您的服务器在不同的计算机上运行,因此无法建立连接。
public void run() throws Exception
{
    String address = "address_of_machine_running_server";
    Socket SOCK =new Socket (address,5000);
    PrintStream PS =new PrintStream(SOCK.getOutputStream());
    PS.println("HELLO TO SERVER FROM CLIENT");

    InputStreamReader IR =new InputStreamReader(SOCK.getInputStream());
    BufferedReader BR = new BufferedReader(IR);

    String MESSAGE =BR.readLine();
    System.out.println(MESSAGE + "java");
}

还要注意,您需要相应地设置防火墙以允许连接。

  • 允许两台机器的进出连接
  • 检查服务器的IP地址是否正确
  • 尝试使用其IP地址ping主机(服务器),以确保其正常工作
  • 如果以上所有内容都返回正面结果,则会有成功的连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接