Skip to content

Instantly share code, notes, and snippets.

@velikodniy
Created December 4, 2016 15:06
Show Gist options
  • Save velikodniy/7f84e33dce9a9caef7a489a211ee585b to your computer and use it in GitHub Desktop.
Save velikodniy/7f84e33dce9a9caef7a489a211ee585b to your computer and use it in GitHub Desktop.
Java client-server
import java.net.*;
import java.io.*;
import java.util.*;
public class Client {
static int port = 5003; // Порт, такой же, как у сервера
static String address = "127.0.0.1"; // Адрес сервера
public static void main(String[] args) {
try {
// Преобразуем адрес из строки во внутреннее представление
InetAddress addr = InetAddress.getByName(address);
// Создаём сокет и подключаем его к серверу
System.out.println("Поключаемся к " + address + ":" + port + "...");
Socket socket = new Socket(addr, port);
// Потоки ввода/вывода
// BufferedReader позволяет читать вход по строкам
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// PrintWriter позволяет использовать println
PrintWriter out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF-8"));
// Создаем объект для чтения строк с клавиатуры
Scanner scan = new Scanner(System.in, "UTF-8");
// Читаем данные с клавиатуры и отправляем серверу
// Запрашиваем строку
System.out.print("[Запрос]:");
String line = scan.nextLine();
// Отправляем строку серверу
out.println(line);
out.flush(); // принудительная отправка
// Получаем ответ
line = in.readLine(); // ждем пока сервер отошлет строку текста.
System.out.println("[Ответ]:" + line);
// Закрываем соединение
socket.close();
} catch (IOException x) {
System.out.println("Ошибка ввода/вывода");
x.printStackTrace();
}
}
}
import java.net.*;
import java.io.*;
public class Server {
// Параметры сервера
static int port = 2345; // Порт, который слушает сервер. Имеет номер до 65536, но порты до 1024
// привилегированные и их занимают системные программы
public static void main(String[] args) {
try {
// Создаём сокет и связываем с портом
ServerSocket sock = new ServerSocket(port);
// Приостанавливаем программу, пока кто-то не подключится
// Для подключившегося клиента создаётся ещё один сокет.
// Это удобно, так как тогда можно работать с клиентом в другом потоке,
// а сервер будет ждать ещё кого-то.
System.out.println("Ожидание подключений...");
Socket client = sock.accept();
System.out.println("Подключился клиент");
// Входной и выходной потоки для приёма и передачи данных
InputStream sin = client.getInputStream();
OutputStream sout = client.getOutputStream();
// Для удобства приёма и отправки данных преобразуем в тип Data*Stream
DataInputStream in = new DataInputStream(sin);
DataOutputStream out = new DataOutputStream(sout);
// Получаем строки с числами и отправляем назад их квадраты
while(true) {
// Ждём получения строки текста.
// Через sin.read(...) можно получить только массив байтов (нам это сейчас не нужно),
// а экземпляры DataInputStream умеют сразу преобразовывать байты в
// простые типы.
String line = in.readUTF();
System.out.println("Получена строка: " + line);
// Выполняем вычисления
try {
int x = Integer.valueOf(line);
int y = x * x;
// Отсылаем ответ
out.writeUTF(Integer.toString(y));
} catch (NumberFormatException ex) {
System.out.println("Получена строка: ");
out.writeUTF("Ожидалось целое число");
}
out.flush(); // Принудительная отправка данных из буфера отправки (можно и без этой команды)
}
} catch(IOException ex) {
// Обработка исключений. Лучше в try-catch помещать
// отдельные команды и не весь код, как здесь, конечно.
System.out.println("Ошибка ввода/вывода");
ex.printStackTrace();
}
}
}
import socketserver
# Обработчик соедиений
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
# Обработка запроса
def handle(self):
print('Входящее соединение...', self.client_address)
# self.request — сокет входящего соединения
data = str(self.request.recv(1024), 'utf-8')
# Удаляем пробелы по краям строки
data = data.strip()
print ('Получена строка:', data)
# Формируем ответ
response = 'Сервер успешно получил "{}"'.format(data)
self.request.sendall(bytes(response, 'utf-8'))
# Делаем обработчик многопоточным
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
pass
if __name__ == "__main__":
HOST, PORT = '', 5003
# Создаём сервер и указываем, какой класс обрабатывает
server = ThreadedTCPServer((HOST, PORT), ThreadedTCPRequestHandler)
try:
# Обслуживать непрерывно
server.serve_forever()
# Если нажали Ctrl-C
except KeyboardInterrupt:
print ('Shutdown server')
server.shutdown()
server.server_close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment