Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java上的套接字连接,指定IP_Java_Sockets_Ip_Client Server_Client - Fatal编程技术网

Java上的套接字连接,指定IP

Java上的套接字连接,指定IP,java,sockets,ip,client-server,client,Java,Sockets,Ip,Client Server,Client,我正在开发一个程序,其中多个客户端需要与远程服务器交互。 我已经在本地对它进行了测试,一切正常(稍后会详细介绍),但我不知道如何设置远程IP。 我阅读了Socket的API和InetAddress的API。这样做对吗?Java如何处理IP?不像localhost案例中那样只有简单的字符串,对吗? 这是我的代码: 客户: public class Client { final String HOST = "localhost"; final int PORT = 5000;

我正在开发一个程序,其中多个客户端需要与远程服务器交互。
我已经在本地对它进行了测试,一切正常(稍后会详细介绍),但我不知道如何设置远程IP。
我阅读了Socket的API和InetAddress的API。这样做对吗?Java如何处理IP?不像localhost案例中那样只有简单的字符串,对吗?
这是我的代码:

客户:

public class Client {

    final String HOST = "localhost";
    final int PORT = 5000;
    Socket sc;
    DataOutputStream message;
    DataInputStream istream;

    public void initClient() {
        try {
            sc = new Socket(HOST, PORT);
            message = new DataOutputStream(sc.getOutputStream());
            message.writeUTF("test");
            sc.close();
        } catch (Exception e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}
服务器:

public class Server {

    final int PORT = 5000;
    ServerSocket sc;
    Socket so;
    DataOutputStream ostream;
    String incomingMessage;

    public void initServer() {
        try {
            sc = new ServerSocket(PORT);
        } catch (IOException ex) {
            System.out.println("Error: " + ex.getMessage());
        }

        BufferedReader input;

        while(true){
            try {
                so = new Socket();
                System.out.println("Waiting for clients...");
                so = sc.accept();
                System.out.println("A client has connected.");

                input = new BufferedReader(new InputStreamReader(so.getInputStream()));
                ostream = new DataOutputStream(so.getOutputStream());
                System.out.println("Confirming connection...");
                ostream.writeUTF("Successful connection.");

                incomingMessage = input.readLine();
                System.out.println(incomingMessage);
                sc.close();
            } catch (Exception e) {
                System.out.println("Error: " + e.getMessage());
            }
        }
    }
}
此外,我正在处理本地测试中的一些问题。
首先,有时我会得到以下结果:

正在等待客户端…
客户端已连接。
正在确认连接…
错误:软件导致连接中止:recv失败

虽然有时它工作得很好。嗯,至少是第一次联系

最后一个问题:
当我尝试从服务器向客户机发送消息时,程序进入一个infite循环,需要手动关闭。我在代码中添加了以下内容:

fromServerToClient = new BufferedReader(new InputStreamReader(sc.getInputStream()));  
text = fromServerToClient.readLine();  
System.out.println(text);  
我做得对吗


谢谢。

这是您通常实现服务器的方式:

class DateServer {
  public static void main(String[] args) throws java.io.IOException {
   ServerSocket s = new ServerSocket(5000);
   while (true) {
      Socket incoming = s.accept();
      PrintWriter toClient =
          new PrintWriter(incoming.getOutputStream());
      toClient.println(new Date());
      toClient.flush();
      incoming.close();
   } 
  }
}
以下将作为客户:

import java.util.Scanner;
import java.net.Socket;
class DateClient {
 public static void main(String[] args) throws java.io.IOException
 {
   String host = args[0];
   int port = Integer.parseInt(args[1]);
   Socket server = new Socket(host, port);
   Scanner scan = new Scanner( server.getInputStream() );
   System.out.println(scan.nextLine());
 } 
}
而不是使用

String host = "localhost";
你可以用像

String host = "www.ibm.com";


你应该考虑用线程来做这件事。目前,多个用户无法同时连接到服务器。这意味着他们必须排队等待与服务器的连接,从而导致性能非常差

通常,您会收到客户机并实例化一个新线程来处理客户机请求。我只有C语言的例子,所以我不会打扰你,但是你可以很容易地在谷歌上找到例子

例如。

我知道我应该在线程中执行此操作。但我还没到那里,我想先让它只为一个客户工作。我的问题是IP配置。你提供的链接没有提供这方面的信息。如果我有一个代表我的IP的名字,这就行了。是否可以使用XXX.XXX.XXX.XXX格式简单地将其设置为数字?@jalbano您的意思是像上一个示例一样吗?是的,我尝试过,但它不适用于大于127的数字(字节限制)。我的意思是,用“127.0.0.1”可以,但我不能用一些朋友的IP(比如“123.456.789.101”)来代替这个数字。我认为将IP作为字符串处理是错误的,对吗?@jalbano不,你可以使用“254.254.254.254”。问题不在于地址,而在于你朋友的IP是否在防火墙后面。防火墙是专门为阻止未被允许的流量而设计的,很可能是你的流量也不被允许。所以它不仅仅是打开路由器端口?好的,我查一下。谢谢。我看到您正在为主机使用字符串类型变量。但是,如果我的IP没有名字,我该怎么做呢?我想有些东西我不明白。我不能只写“123.456.789.101”,它不起作用。我只是试着用代码从服务器向客户端发送消息。它很管用,谢谢!从现在起我就要用它了。我明白你的困惑。请用我对这个问题的回答作为建议:。。如果你认为我的答案对你有帮助,请不要忘记接受它作为一个答案。我在你的答案中发现了这个。这与我测试程序时所做的相同:s=新套接字(“127.0.0.1”,端口);我不明白的是如何制作这个遥控器,我的意思是,下面的行是错误的:s=新插座(“123.456.789.101”,端口);如何将远程IP设置到客户端?我感谢你的帮助!
String host = "8.8.8.8";