eddyfy Ответов: 1

Как написать код на java TCP Сетевое программирование


Привет. Я новичок в сетевом программировании. Я собираюсь написать код для клиента и задать пользователю какой-то вопрос в клиенте, а пользователь также введет выбор, основанный на целочисленном значении. Предположительно, сервер должен возвращать данные пользователя клиенту. Но это не работает. Я надеюсь, что вы, ребята, сможете мне помочь и привести пример. Заранее спасибо.

Что я уже пробовал:

Серверный код

import java.io.IOException;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TestServer
{
    private static ServerSocket servSock;
    private static final int PORT = 1234;

    public static void main(String[] args)
    {
        System.out.println("Opening port...\n");
        try
        {
            servSock = new ServerSocket(PORT);      //Step 1.
        }
        catch(IOException ioEx)
        {
            System.out.println("Unable to attach to port!");
            System.exit(1);
        }
        do
        {
            handleClient();
        }
        while (true);
    }

    private static void handleClient()
    {
        Socket link = null;                     			//Step 2.
        try
        {
            link = servSock.accept();        				//Step 2.

            Scanner input = new Scanner(link.getInputStream()); 	//Step 3.
            PrintWriter output = new PrintWriter(link.getOutputStream(),true); 	//Step 3.

            int numMessages = 50;
            String message = input.nextLine();      			//Step 4.
            while (!message.equals("***CLOSE***"))
            {
                System.out.println("Message received.");
                numMessages++;
                output.println("Message " + numMessages + ": " + message);   		//Step 4.
                message = input.nextLine();
            }
            output.println(numMessages + " messages received."); 	//Step 4.
        }
        catch(IOException ioEx)
        {
            ioEx.printStackTrace();
        }
        finally
        {
            try
            {
                System.out.println( "\n* Closing connection... *");
                link.close();                    //Step 5.
            }
            catch(IOException ioEx)
            {
                System.out.println("Unable to disconnect!");
                System.exit(1);
            }
        }
    }
}

Клиентский код

package testclient;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class TestClient
{

    private static InetAddress host;
    private static final int PORT = 1234;
    
    public static void main(String[] args)
    {
       try
       {
           host = InetAddress.getLocalHost();
       }
       catch(UnknownHostException uhEx)
       {
           System.out.println("Host ID not found");
           System.exit(1);
       }
       accessServer();
    }
    
    private static void accessServer()
    {
        Socket link = null;
        
        try
        {
            link = new Socket(host,PORT);
            Scanner input = new Scanner(link.getInputStream());
            
            PrintWriter output = new PrintWriter(link.getOutputStream(),true);
            
            Scanner userEntry = new Scanner(System.in);
            
            String message, response;
            do
            {
                System.out.println("Are you in healthy condition?");
                message = userEntry.nextLine();
                System.out.println("Are you in happy mode?");
                message = userEntry.nextLine();
                System.out.println("Are you in sad condition?");
                message = userEntry.nextLine();
                System.out.println("Are you in sick condition?");
                message = userEntry.nextLine();
                response = input.nextLine();
                System.out.println("\nServer " +response);
                output.println(message);
                response = input.nextLine();
                System.out.println("\nServer " +response);
            }while(!message.equals("***CLOSE***"));
        }
        catch(IOException ioEx)
        {
            ioEx.printStackTrace();
        }
        
        finally
        {
            try
            {
                System.out.println("\n*Closing connection...*");
                link.close();
            }
            catch(IOException ioEx)
            {
                System.out.println("Unable to disconnect...");
                System.exit(1);
            }
        }
    }     
}

ZurdoDev

Почему это не работает?

eddyfy

После того, как я добавил еще один вопрос, он не работает для меня. он не может подключиться к порту

eddyfy

После этого я добавил еще один вопрос, который не работает на сервере.

ZurdoDev

Вы ответили, что не работает. Вы должны ответить, почему. И поскольку мы не можем запустить ваш код, вам нужно сделать некоторую отладку и выяснить, что происходит и почему. Тогда ты сможешь все исправить.

Вы не можете просто позвонить механику и сказать ему, что вы не можете ездить на работу. Вы должны понять, почему.

eddyfy

Я прошу прощения. Но сервер не может подключиться к порту. Таким образом, он не может вернуть обратно пользовательский ввод клиенту

1 Ответов

Рейтинг:
2

Jochen Arndt

Последовательность действий клиента по каждому вопросу должна быть следующей:


  • Печать на экране
  • Чтение пользовательского ввода
  • Отправить на сервер
  • Получение ответа от сервера
  • Печать ответа на экране
Но ваш код этого не делает. Он сначала печатает вопросы и считывает пользовательский ввод для четырех вопросов, а затем ждет ответа сервера, но не отправляет его на сервер.

Это должно быть как
System.out.println("Are you in healthy condition?");
message = userEntry.nextLine();
output.println(message);
response = input.nextLine();
System.out.println("\nServer " +response);

// Next question goes here repeating the above


eddyfy

Но сервер по-прежнему не работает. Он сказал, что не может подключиться к порту

Jochen Arndt

Вероятно, это происходит потому, что вы не закрываете сокет, и поэтому порт блокируется от предыдущего выполнения.

Как вы остановили свое серверное приложение?
У вас есть бесконечный цикл while в main и System.Exit вызывается только в том случае, если при закрытии сокета link возникает исключение. Даже когда система.Выход называется, рекомендуется перед этим закрыть розетку.

Попробуйте добавить
servSock.рядом();
после закрытия сокета link или сделайте это в своей функции main() и удалите бесконечный цикл (у вас уже есть цикл в вашей функции обработки).