套接字服务器没有连接

时间:2014-04-26 20:10:44

标签: java eclipse sockets connection

您好我是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);
}

}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

尝试新端口。我不会使用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);
    }
}

}

答案 2 :(得分:0)

如果你在Linux 8080/80/8443中没有好的端口我们像3456这样的其他端口。 并始终从您的客户端关闭您的套接字。

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

相关问题