Java 试图使一个简单的echo客户端-服务器程序在两台计算机之间工作

Java 试图使一个简单的echo客户端-服务器程序在两台计算机之间工作,java,sockets,network-programming,client-server,Java,Sockets,Network Programming,Client Server,我一直在试图解决这个问题,但没有成功,所以最后我在这里得到一些专家的帮助 我只是想让一个简单的客户机-服务器程序在两台计算机之间工作 服务器将驻留在我的笔记本电脑中,笔记本电脑通过linksys路由器连接到互联网 客户端将驻留在大学计算机中。我将文件SCP到一台大学计算机上,然后通过ssh运行它 现在还有两件事值得注意的是,我还禁用了我计算机中的防火墙,并在linksys路由器中配置了WARING端口,即它将请求转发到我的IP地址的端口。我还将我的iPadDress设置为静态 这是驻留在我笔记本

我一直在试图解决这个问题,但没有成功,所以最后我在这里得到一些专家的帮助

我只是想让一个简单的客户机-服务器程序在两台计算机之间工作

服务器将驻留在我的笔记本电脑中,笔记本电脑通过linksys路由器连接到互联网

客户端将驻留在大学计算机中。我将文件SCP到一台大学计算机上,然后通过ssh运行它

现在还有两件事值得注意的是,我还禁用了我计算机中的防火墙,并在linksys路由器中配置了WARING端口,即它将请求转发到我的IP地址的端口。我还将我的iPadDress设置为静态

这是驻留在我笔记本电脑中的服务器代码

/* EchoServer.java
 *
 * Copyright (c) 2000 Sean Walton and Macmillan Publishers.  Use may be in
 * whole or in part in accordance to the General Public License (GPL).
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
*/

/*****************************************************************************/
/*** EchoServer.java                                                       ***/
/***                                                                       ***/
/*****************************************************************************/

import java.io.*;
import java.net.*;

public class EchoServer
{
    public EchoServer(int portnum)
    {
        try
        {
            server = new ServerSocket(portnum);
        }
        catch (Exception err)
        {
            System.out.println(err);
        }
    }

    public void serve()
    {
        try
        {
            while (true)
            {

                Socket client = server.accept();

                BufferedReader r = new BufferedReader(new InputStreamReader(client.getInputStream()));
                PrintWriter w = new PrintWriter(client.getOutputStream(), true);
                w.println("Welcome to the Java EchoServer.  Type 'bye' to close.");
                String line;
                do
                {
                    line = r.readLine();
                    if ( line != null )
                        w.println("Got: "+ line);
                }
                while ( !line.trim().equals("bye") );
                client.close();
            }
        }
        catch (Exception err)
        {
            System.err.println(err);
        }
    }

    public static void main(String[] args)
    {
        EchoServer s = new EchoServer(3000);
        s.serve();
    }

    private ServerSocket server;
}
这是将驻留在大学计算机中的客户端代码

/* EchoClient.java
 *
 * Copyright (c) 2000 Sean Walton and Macmillan Publishers.  Use may be in
 * whole or in part in accordance to the General Public License (GPL).
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
*/

/*****************************************************************************/
/*** EchoClient.java                                                       ***/
/***                                                                       ***/
/*****************************************************************************/

import java.io.*;
import java.net.*;

public class EchoClient
{
    public static void main(String[] args)
    {
        try
        {
            Socket s = new Socket("my static ip address here", 3000);
            BufferedReader r = new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintWriter w = new PrintWriter(s.getOutputStream(), true);
            BufferedReader con = new BufferedReader(new InputStreamReader(System.in));
            String line;
            do
            {
                line = r.readLine();
                if ( line != null )
                    System.out.println(line);
                line = con.readLine();
                w.println(line);
            }
            while ( !line.trim().equals("bye") );
        }
        catch (Exception err)
        {
            System.err.println(err);
        }
    }
}
当我运行它时(两者)。客户端程序运行并停止,没有任何错误。它只是挂着


我非常感谢你的帮助

实际上,当您的客户端代码尝试连接到服务器并向服务器发送“字符串消息”时 此时,服务器读取inputstream(通过bufferreader) i、 e.line=r.readLine();//服务器代码

在这里,它将在字符串末尾等待\n或\r或\n\r(换行,回车)

因此,在向服务器发送消息时,您需要将最后一个字符作为\n或\r或\n\r两侧追加,反之亦然

.
.
.
    do
                {
                    line = r.readLine();
                    line = line +"\n"; // Add this line
                    if ( line != null )
                        System.out.println(line);
                    line = con.readLine();
                    w.println(line);
                }
.
.
.

@客户端代码实际上是当您的客户端代码尝试连接到服务器并向服务器发送“字符串消息”时 此时,服务器读取inputstream(通过bufferreader) i、 e.line=r.readLine();//服务器代码

在这里,它将在字符串末尾等待\n或\r或\n\r(换行,回车)

因此,在向服务器发送消息时,您需要将最后一个字符作为\n或\r或\n\r两侧追加,反之亦然

.
.
.
    do
                {
                    line = r.readLine();
                    line = line +"\n"; // Add this line
                    if ( line != null )
                        System.out.println(line);
                    line = con.readLine();
                    w.println(line);
                }
.
.
.

@客户端代码

是挂起作为未响应还是挂起作为未发生?您请求它从stdin中检索新行,这意味着它应该阻塞,直到输入可用为止。尝试在控制台中键入内容,然后按enter键。顺便说一句,当
line==null
这通常意味着流是关闭的(你应该打破while循环),它在同一台机器上工作正常,但在不同的机器上工作正常,我的意思是,即使你键入一些内容并输入,也不会发生任何事情。我想这只是在阻止并等待答复,过了一会儿,我的连接超时了,java例外。因此,我想补充一点,当我从大学计算机ping到我的ipaddress时,它会不确定地挂起。这说明了什么?可能你尝试使用的端口没有打开。你在别的地方试过吗?给一个朋友代码,并与他一起尝试。确保你的路由器允许使用端口,以防它仍然无法工作。谢谢sebastian..嗯..那么,端口是否也需要在客户端打开才能工作?另外,如果我像你建议的那样从我朋友的计算机上运行客户端,我是否需要确保在两台路由器中都配置了端口转发,并且在两台计算机中都需要禁用防火墙?它是挂起作为“不响应”还是挂起作为“无响应”?您请求它从stdin中检索新行,这意味着它应该阻塞,直到输入可用为止。尝试在控制台中键入内容,然后按enter键。顺便说一句,当
line==null
这通常意味着流是关闭的(你应该打破while循环),它在同一台机器上工作正常,但在不同的机器上工作正常,我的意思是,即使你键入一些内容并输入,也不会发生任何事情。我想这只是在阻止并等待答复,过了一会儿,我的连接超时了,java例外。因此,我想补充一点,当我从大学计算机ping到我的ipaddress时,它会不确定地挂起。这说明了什么?可能你尝试使用的端口没有打开。你在别的地方试过吗?给一个朋友代码,并与他一起尝试。确保你的路由器允许使用端口,以防它仍然无法工作。谢谢sebastian..嗯..那么,端口是否也需要在客户端打开才能工作?另外,如果我像你建议的那样从我朋友的计算机上运行客户端,我是否需要确保在两台路由器上都配置了端口转发,并且在两台计算机上都需要禁用防火墙?