繁体   English   中英

套接字服务器无连接

[英]Socket server no 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);
}

}

不要使用您的ip,但要使用localhost或127.0.0.1,并尝试使用新端口,请尝试使用大于1024的端口(此数字下的大多数是众所周知的端口,它们已注册到IANA)

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

}

如果您使用的是Linux 8080/80/8443,则没有很好的端口,而我们需要另一个端口,例如3456。并且始终始终关闭客户端的套接字。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM