Пишу клиент-серверное приложение, от сервера клиенту сообщение приходит, а от клиента серверу не приходит. Причём не выводится никакой ошибки, просто программа выводит только одну строку (сообщение для клаиента)
import javax.imageio.IIOException;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
public class CleentServer {
public static class Cleent {
public static void main(String[] args) {
new Cleent().reception();
new Cleent().sending();
}
public void sending(){
try {
Socket socket = new Socket("localhost", 5000);
PrintWriter writer = new PrintWriter(socket.getOutputStream());
writer.println("Сообщение для сервера");
writer.close();
} catch (IIOException ex){
ex.printStackTrace();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void reception(){
try {
Socket socket = new Socket("localhost", 5000);
InputStreamReader inputStreamReader = new InputStreamReader(socket.getInputStream());
BufferedReader reader = new BufferedReader(inputStreamReader);
String messeg = reader.readLine();
System.out.println(messeg);//вывод на экран сообщения от сервера
reader.close();
} catch (IOException e){
e.printStackTrace();
}
}
}
public static class Server {
public static void main(String[] args) {
new Server().sending();
new Server().reception();
} public void sending(){
try {
ServerSocket serverSocket = new ServerSocket(5000);
while (true) {
Socket socket = serverSocket.accept(); //блокирует сокет до тех пор
//пока нет связи с клеентом
PrintWriter writer = new PrintWriter(socket.getOutputStream());//отправляет
//сообщение клеенту
writer.println("Сообщение для клеента");
writer.close();//закрывает сокет
}
}catch (IIOException ex) {
ex.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void reception(){
try {
ServerSocket serverSocket2 = new ServerSocket(5000);
while (true) {
Socket socket = serverSocket2.accept(); //блокирует сокет до тех пор
//пока нет связи с клеентом
InputStreamReader reader = new InputStreamReader(socket.getInputStream());
BufferedReader bufferedReader = new BufferedReader(reader);
String messege = bufferedReader.readLine();
System.out.println(messege);
bufferedReader.close();
}
}catch (Exception ex){
ex.printStackTrace();
}
}
}
}
Вы создаёте два разных сервера на одном и том же порте. Естественно, что один из них не работает.
Вдобавок, вы создаёте по одному сокету у клиента и сервера для передачи и принятия сообщения. С обеими этими задачами справляется один сокет.
Чтобы принимать и отправлять сообщения, у сервера и у клиента нужно создать Reader
и Writer
. Тут существуют вариации c PrintWriter
, BufferedWriter
, а также с BufferedReader
, Scanner
и т.д.
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
Правильный код для клиента и сервера будет выглядеть так. В данном примере используется try с ресурсами
для автозакрытия сокетов и потоков вывода и ввода.
Client
public class Client {
public static void main(String[] args) {
try(Socket socket = new Socket("localhost", 5000);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
out.write("Сообщение для сервера\n");
out.flush(); // \n и flush() нужны, чтобы BufferedReader на стороне сервера смог принять сообщение
String serverMessage = in.readLine();
System.out.println(serverMessage);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Server
public class Server {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(5000);
Socket socket = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))) {
String clientMessage = in.readLine();
System.out.println(clientMessage);
out.write("Сообщение для клиента\n");
} catch (IOException e) {
e.printStackTrace();
}
}
}
Результат в консоли клиента:
Сообщение для клиента
Результат в консоли сервера:
Сообщение для сервера
Статья про сокеты
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Внезапно возникла проблема при считывании меток, стандартный метод
Как динамически в коде изменить внутренние отступы в toolbar? Изначальные отступы задаю в xml:
У меня есть класс,который я хочу сохранить в bundleЯ знаю что для этого нужно implements Parcelable