【问题标题】:Socket server no connection套接字服务器没有连接
【发布时间】:2014-04-26 20:10:44
【问题描述】:

您好,我是 Java 套接字的新手,我一直在尝试创建服务器套接字。有人可以告诉我哪里出错了,因为我收到一条错误消息“地址已在使用中”。有时我没有收到错误,但它只是没有形成连接。请帮忙?这是服务器类和客户端类。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.ServerSocket;
import java.net.Socket;


public class MessageServer {
public static void main(String[] args) throws IOException{

    int port = 8080;

    //int port = Integer.parseInt(args[0]); 

    ServerSocket server = new ServerSocket(port);


    while(true){
        System.out.println("Waiting for client...");
        Socket client = server.accept();

        System.out.println("Client from " + client.getInetAddress() + " connected.");
        BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        String inputLine = in.readLine();
        System.out.println("Client said: '"+inputLine+"'");
        Writer count = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()));
        byte c [] = count.toString().getBytes();
        count.flush();


        }
}

}

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

public class MessageSendClient {

public static void man(String args[]) throws IOException{
    Socket server1 = new Socket("143.210.72.82", 8080);
    System.out.println("Connected to " + server1.getInetAddress());
    InputStream in = server1.getInputStream();

    byte c[] = new byte[100];
    int num = in.read(c);
    String count = new String(c);

    System.out.println("Server said: " + count);
}

}

【问题讨论】:

  • 尝试使用“localhost”而不是143.210.72.82,并且不要使用已经用于其他目的的8080端口号。
  • 可能您的程序在每次运行时都没有关闭套接字,并且套接字仅在套接字超时后才可用。
  • 你已经同时运行了两次服务器。
  • localhost 对我来说工作正常。
  • 你能告诉我如何只运行一次吗?

标签: java eclipse sockets connection


【解决方案1】:

如果您在 Linux 8080 / 80 / 8443 中,则没有好的端口,我们使用其他端口,例如 3456。 并且始终始终从您的客户端关闭您的套接字。

更新: 首先,您不应该使用 Server.close() 关闭服务器套接字,服务器应该正在运行。这就是为什么会有while循环。从服务器获取输入流后,您应该使用 socket.close() 关闭客户端套接字。还要记住在 write() 和 flush() 之后始终使用 Close() 关闭输出流以避免副作用。制作两个类,一个用于服务器,一个用于客户端。首先启动 Java 类 Server,然后运行您的 Client 类以连接到 Server。终止您的 Client 类并再次运行它。如果您使用的是 eclipse,请在控制台中终止客户端。有时 Java 进程会重叠,因此只需使用 x 按钮终止所有正在运行的进程。改进示例代码后,您可以再次启动 Server 和 Client 类。 如果它仍然不起作用,您需要再次重新发布您的问题并在客户端和服务器的详细信息中显示您当前的代码。不知何故,我迷失了方向,您当前的状态在哪里,因为您已经批准了您的问题的答案。

【讨论】:

  • 嘿,我照你说的做了,仍然没有连接。它仍然给出“地址已在使用”错误
  • 您是在同一个 Shell 中运行客户端主程序还是服务器主程序?您应该首先启动服务器主程序,然后在附加的类调用中启动客户端主程序。也许用两台不同的电脑试试这个例子,只是为了确保你正确地调用了主程序。并终止所有活动的旧服务器和客户端。有时您看不到同一端口上的旧服务器仍在运行。
  • 是的,以前是在大学电脑上,现在在我家里的笔记本电脑上,还是一样的问题:(
  • @voskart:也许你应该改进你的答案。
  • @user3576868:我已经更新了我的答案,看看更新部分。
【解决方案2】:

不要使用你的 ip,而是使用 localhost 或 127.0.0.1 并尝试一个新端口,尝试使用大于 1024 的端口(这个数字以下的大多数是众所周知的端口,并且它们已注册到 IANA)

【讨论】:

  • 如果创建了连接,不应该有 System.out.println("Client from " + client.getInetAddress() + " connected."); ..?
【解决方案3】:

尝试一个新的端口。我不会使用 8080,因为它可能是(并且可能已经使用了)。也尝试在使用后始终关闭套接字。

由于我自己将套接字用于大学目的,因此这是代码(如果您需要 UDP 或 RMI,我也可以发布它们)

public class TCPClient {
  public static void main(String[] args){
    try{
      Socket socket = new Socket("127.0.0.1", 6666);

      PrintWriter data_to_server = new PrintWriter(socket.getOutputStream(), true);
      BufferedReader data_from_server =
              new BufferedReader(
                        new InputStreamReader(socket.getInputStream()));

      //Schicke Nachricht an Server
      BufferedReader system_reader = new BufferedReader(new InputStreamReader(System.in));
      long start_send = System.nanoTime();
      String msg = system_reader.readLine();
      data_to_server.println(msg);

      //Erhalte jeweilige Antwort
      msg = data_from_server.readLine();
      System.out.println("Data from Server : " + msg);
      System.out.println("Timespan: " + (System.nanoTime()-start_send));

      socket.close();
    }catch(IOException ioe){
      ioe.printStackTrace();
    }
  }
}

public static void main(String[] args) {
    try {
        TCPServer tcp = new TCPServer();
        tcp.initialize(6666);
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

public void initialize(int port) throws IOException {
    // Erstellen eines Server Sockets
    ServerSocket server = new ServerSocket(port);

    while (true) {
        // Warten bis die Verbindung besteht
        System.out.println("Waiting for client to connect...");
        Socket socket = server.accept();

        // Writer für die ausgehende Antwort
        PrintWriter data_to_client = new PrintWriter(
                socket.getOutputStream(), true);
        // Reader für die ankommende Nachricht
        BufferedReader data_from_client = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));

        // IP-Adresse des Clients
        InetAddress remoteIp = socket.getInetAddress();

        // Erhalten der Nachricht
        String msg = data_from_client.readLine();
        System.out.println("Client " + remoteIp + " : " + msg);

        // Versenden der Antwort
        send(data_to_client, msg);
    }
}

}

【讨论】:

  • 感谢您的建议,我已尝试更改此设置,但我仍然觉得创建连接很麻烦。你明白“资源泄漏:‘服务器’永远不会关闭”的意思吗?
  • @user3576868 我唯一能想象的是你没有像我那样关闭客户端套接字(client_socket.close())
  • 您好,感谢您的建议。我尝试在客户端类上使用 server.close() ,但它仍然不起作用。我仍然得到使用中的地址。这是否意味着我必须再次更改端口号。我现在涨了 10000 @voskart
  • 您正在使用以下? ServerSocket 服务器 = 新的 ServerSocket(1234);和 Socket 客户端 = new Socket ("127.0.0.1", 1234);那么它应该真的可以工作
  • 服务器类很好,可以工作,但是当我运行客户端类时,在我使用了你使用的 ip 和端口之后,我得到了这个错误“地址已在使用中”。 ....:/
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-10
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多