Сокет-сервер без подключения

1

Привет, я новичок в 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);
}

}

  • 0
    Попробуйте использовать «localhost» вместо 143.210.72.82 и не используйте порт 8080, который уже используется для других целей.
  • 0
    Вероятно, ваша программа не закрывает сокет каждый раз, когда вы его запускаете, и сокет становится доступным только после истечения времени ожидания сокета.
Показать ещё 7 комментариев
Теги:
connection
sockets

3 ответа

0
Лучший ответ

если вы находитесь в Linux 8080/80/8443, нет хороших портов для нас другого порта, такого как 3456. И всегда всегда закройте свой сокет от вашего Клиента.

Обновление: прежде всего, вы не должны закрывать сокет сервера с помощью Server.close(), сервер должен работать. и вот почему в то время есть Loops. вы должны закрыть свой клиентский сокет с помощью socket.close() после того, как вы получите входной поток от сервера. Помните также, чтобы всегда закрывать выходной поток с помощью Close() после write() и flush(), чтобы избежать побочного эффекта. Сделайте два класса: один для Сервера и один для Клиента. Сначала запустите Java class Server, а затем запустите свой клиентский класс для подключения к серверу. завершите работу своего класса Client и запустите его снова. если вы используете eclipse, также завершайте клиент в консоли. иногда процессы Java накладываются друг на друга, поэтому просто завершайте весь запущенный процесс с помощью кнопки x. После того как вы улучшили свои примеры кода, вы можете снова запустить сервер и клиентский класс. Если он все еще не работает, вам необходимо повторно отправить свой вопрос и показать свои текущие коды в разделе "Сведения для клиента и сервера". почему-то я потерял трек, где ваше текущее состояние, потому что вы уже одобрили ответ на свой вопрос.

  • 0
    эй, я сделал, как вы сказали, до сих пор нет связи. По-прежнему выдается ошибка «Адрес уже используется»
  • 0
    Вы используете основную часть клиента или основную часть сервера в одной и той же оболочке? Сначала вы должны запустить основную часть сервера, а затем запустить основную часть клиента в вызове дополнительного класса. Может быть, попробуйте пример с двумя разными ПК, просто чтобы правильно назвать основной. И прекратить все активные старый сервер и клиент. Иногда вы не видите, что старый Сервер на том же порту все еще работает.
Показать ещё 5 комментариев
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);
    }
}

}

  • 0
    Спасибо за предложение, я попытался изменить это, но я все еще нахожу трудным создание связи. Вы понимаете значение «утечки ресурсов:« сервер »никогда не закрывается»?
  • 0
    @ user3576868 Единственное, что я могу себе представить, это то, что вы не закрыли клиентский сокет, как, например, я (client_socket.close ())
Показать ещё 11 комментариев
0

не используйте свой IP-адрес, а используйте localhost или 127.0.0.1, а также попробуйте новый порт, попробуйте использовать порт более 1024 (большинство из этого числа - это хорошо известный порт, и они зарегистрированы в IANA)

  • 0
    Если создано соединение, не должно быть System.out.println («Клиент из» + client.getInetAddress () + «подключен.»); ..?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню