Created
December 4, 2016 15:06
-
-
Save velikodniy/7f84e33dce9a9caef7a489a211ee585b to your computer and use it in GitHub Desktop.
Java client-server
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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