Progress-servis55.ru

Новости из мира ПК
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java socket connect

Программирование сокетов на Java

категория
Java
дата16.07.2009
авторbioflash
голосов85

[Disclaimer: Данная статья была переведена в рамках «Конкурса на лучший перевод статьи» на сервисе Quizful. Ссылка на оригинал находится внизу страницы.]

Вы хотите разработать сетевую программу на Джаве – игрушку, чат, или то и другое вместе… Вы нашли правильную статью – здесь вы сможете ознакомиться с захватывающим миром сокетов в Java. Прочитав эту статью, вам будет виден свет в конце туннеля – станет очевидным предназначение сокетов и то, как разработать простую программу с использованием сокетов на языке программирования Джава.

Что такое сокет?

На сегодняшний день использование клиентов служб мгновенного обмена сообщениями (instant messanger) стало незаменимым средством для всех пользователей Интернета. Существует множество различных протоколов и клиентов (MSN, ICQ, Skype и т. д.), о которых каждый слышал и которые мы все ежедневно используем. Но не все знают, что положено в основу их роботы – собственно для этого статья и написана. Предположим, вы установили один из клиентов служб мгновенного обмена сообщениями на ваш компьютер. После его запуска и введения имени и пароля вашего пользователя, программа пытается подключиться к серверу. Что именно означает слово «подключиться»?

Каждый компьютер в сети имеет IP-адрес. Этот адрес похож на ваш домашний адрес – он однозначно идентифицирует ваш компьютер и позволяет другим общаться с вашим компьютером. Не будем вдаваться в подробности IP-адреса, так как эта статья не о них, хочу только отметить что IP-адрес это набор номеров разделенных точками (например, 64.104.137.158). Хотя существует и другой способ идентификации компьютеров в сети – доменное имя, которое более удобное и нагляднее идентифицирует компьютер, чем простой набор чисел (например, www.quizful.net). В Интернете существуют специальные компьютеры, которые осуществляют преобразование доменного имени в IP-адрес и наоборот.

На одном компьютере может параллельно исполняется несколько программ. Предположим, что вы запустили 10 программ на своем компьютере, и все они ожидают, чтоб другие компьютеры связались с ними. Можете представить себе это так: вас 10 человек в большом офисе с 1 телефоном и все ждут звонков от их собственных клиентов. Как вы это решите? Можно конечно назначить ответственного работника, и он будет приносить телефон соответственному человеку, которому звонят, но тогда другие клиенты не смогут дозвониться к другим людям. Кроме того, это очень трудно и нелепо иметь ответственного работника за маршрутизацию звонков к нужным людям. Вы должно быть, уже догадались, к чему я веду – если все эти программы, исполняющиеся на одном компьютере, с гордостью просят своих клиентов связаться с ними по определенному IP-адресу, то их клиенты не будут довольны. Идея состоит в следующем … иметь отдельный IP-адрес для каждой программы, верно? НЕ ВЕРНО! Суть вопроса не правильная – это также как спрашивать об отдельном офисе для каждого из вас. Ну, тогда … может отдельных телефонных номеров будет достаточно? ДА! На сетевом жаргоне «отдельные телефонные номера» имеют название порты. Порт – это просто число и каждая из программ, которая исполняется на определенном компьютере, может выбрать уникальное число порта, чтоб определить себя для внешнего мира. ЗАПОМНИТЕ – эти порты вы не сможете найти среди аппаратных средств компьютера (даже не старайтесь их искать). Эти числа – логические. Теперь все прояснилось: существует IP-адрес, с помощью которого другие компьютеры могут распознавать определенный компьютер в сети, и порт-число, которое определяет некую программу, работающую на компьютере. Также становиться понятным и то, что две программы на разных компьютерах могут использовать один и тот же порт (два дома на разных улицах тоже могут иметь один и тот самый номер, или нет?). Ну что же, мы практически у цели, только чтоб немного вас попугать, давайте выведем формулу:

Если сложить вместе выше описанные уравнения, то получим:

Если вы догадались до этого сами – значит мои усилия не пропали зря. Если нет, тогда прочитайте еще раз все сначала или воспользуйтесь Google для поиска лучшей статьи.

Подведем итог, сокет – это комбинация IP-адреса и порта. Сокет адрес надает возможность другим компьютерам в сети находить определенную программу, которая исполняется на определенном компьютере. Вы можете отображать сокет адрес вот так 64.104.137.58:80, где 64.104.137.58 – IP-адрес и 80 – порт.

Как программировать с использованием сокетов?

Достаточно о теории, давайте перейдем к действиям. Разработаем очень простой и наглядный код на Java, который продемонстрирует возможности использования сокетов. Попробуем реализовать следующий список действий:

1) Одна Джава программа будет пытаться связаться с другой Java программой (которая отчаянно ждет кого-то, чтоб с ней связался). Назовем первую программу Клиентом, а вторую Сервером.

2) После успешного связывания с сервером, клиент ждет ввода данных от вас и отсылает текст серверу.

3) Серверная программа отсылает клиенту назад тот ;t текст (для того чтоб показать, что она умеет делать даже такое полезное действие).

4) Полученный от сервера текст, клиент показывает вам, чтоб показать вам мнение сервера о вас. Приготовились приступить к разработке? Начнем. Отмечу только, что я не буду учить вас программированию на Java с чистого листа, а только объясню код, который относится к сокетам. Создайте 2 новых Джава программы и назовите их Server.java и Client.java. Я привел код ниже, только не пугайтесь, я все объясню.

Теперь скомпилируем код:

Откроем два командных окна (DOS). В одном окне введем:

Обязательно в таком порядке.

Теперь введите строку текста в окне, где запущен клиент, и нажмите кнопку Enter. Наблюдайте за двумя окнами и увидите что случиься. В конце, нажмите Ctrl-C для того чтоб остановить программы.

Читать еще:  Сериализация java в json

Объяснение кода работы с сокетами

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

Рассмотрим следующую часть кода сервера:

Класс ServerSocket немного отличается от класса Socket. Класс Socket – это и есть сокет. Главное отличие ServerSocket заключается в том, что он умеет заставлять программу ждать подключений от клиентов. Когда вы его создаете, нужно указывать порт, с которым он будет работать, и вызвать его метод accept(). Этот метод заставляет программу ждать подключений по указанному порту. Исполнение программы зависает в этом месте, пока клиент не подключится. После успешного подключения клиентом, создается нормальный Socket объект, который вы можете использовать для выполнения все существующий операций с сокетом. Заметим также, что этот Socket объект отображает другой конец соединения. Если вы хотите отослать данные клиенту, то вы не можете использовать для этого ваш собственный сокет.

Следующим рассмотрим Socket класс. Вы можете создать Socket объект, указав IP-адрес и порт. Вы можете использовать InetAddress класс для отображения IP-адреса (этот способ более предпочтительный). Для создания InetAddress объекта используйте следующий метод:

Заметим, что в нашей программе мы использовали адрес 127.0.0.1. Это специальный адрес называется адрес замыкания – он просто отображает локальный компьютер. Если вы намерены запустить клиент и сервер на разных компьютерах, тогда нужно использовать соответственный IP-адрес сервера.

После того как мы создали InetAddress, то можно создать Socket:

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

Следующие строки просто конвертируют потоки в другие типы потоков. После этого нам легче будет работать с String объектами. Этот код ничего не делает с сетью.

Все остальное очень просто – простые манипуляции с объектами потоков (никаких сокетов). Вы можете использовать ваши любимые потоки, вызывать ваши любимые методы, и удостоверяться в передаче данных во второй конец. Если вы не очень осведомлены в использовании потоков, рекомендую вам найти статью о них и прочесть.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 85 Голосовать

Java Socket tutorial

Java Socket tutorial shows how to do network programming in Java with sockets. Socket programming is low-level. The purpose of the tutorial is to introduce network programming including these low-level details. There are higher-level APIs that might be better suited for a real task. For instance, Java 11 introduced HttpClient and Spring has Webclient.

Java Socket

In programming, a is an endpoint of a communication between two programs running on a network. Socket classes are used to create a connection between a client program and a server program. The Socket represents the client socket, and the ServerSocket the server socket.

A ServerSocket is bound to a port number, which is a unique Id through clients and servers aggree to communicate.

Socket and ServerSocket are used for the TCP protocol. The DatagramSocket and DatagramPacket are used for the UDP protocol.

TCP is more reliable, has extensive error checking, and requires more resources. It is used by services such as HTTP, SMTP, or FTP. UDP is much less reliable, has limited error checking, and requires less resources. It is used by services such as VoIP.

DatagramSocket is a socket for sending and receiving datagram packets. A datagram packet is represented by DatagramPacket class. Each packet sent or received on a datagram socket is individually addressed and routed. Multiple packets sent from one machine to another may be routed differently, and may arrive in any order.

Java Socket Time Client

The are servers that provide current time. A client simply connects to the server with no commands, and the server responds with a current time.

In our example, we have chosen a server in Sweden.

The example connects to a time server and receives the current time.

This is a time server from Sweden; the 13 port is a standard port for daytime services.

A stream client socket is created. It is connected to the specified port number on the named host. The socket is automatically closed with Java’s try-with-resources statement.

The getInputStream() returns an input stream for this socket. We read the server’s response from this input stream. The communication between sockets is in bytes; therefore, we use the InputStreamReader as a bridge between bytes and characters.

Since the response message is small, we can read it character by character with little performance penalty.

Java Socket Whois Client

Whois is a TCP-based transaction-oriented query/response protocol that is widely used to provide information services to Internet users. It is used to query information such as domain name or IP address block owners.

Whois protocol uses port 43.

In the example, we probe for information about the owners of a domain name.

We get an output stream for the socket and wrap it into a PrintWriter . PrintWriter will convert our character into bytes. With println() , we write the domain name to the stream. Communication through sockets is buffered. The second parameter of the PrintWriter is autoFlush ; if set to true , the buffer will be flushed after each println() .

The response from the server is read and written to the console.

Java Socket GET Request

In the following example, we create a GET request. The HTTP GET request is used to retrieve a specific resource.

The example retrieves an HTML page from a website.

We open a socket on the specified webpage on port 80. Port 80 is used by HTTP protocol.

Читать еще:  Java util vector

We are going to issue text commands on the protocol; therefore, we create a PrintWriter for the socket output stream. Since we do not set the autoFlush option to true , we need to manually flush the buffer.

We create an HTTP GET request, which retrieves the home page of the specified webpage. Notice that the text commands are finished with rn (CRLF) characters. These are necessary communication details which are described in RFC 2616 document.

The shutdownOutput disables the output stream for this socket. This is necessary to close the connection in the end.

For the server response, we open a socket input stream and use InputStreamReader to translate bytes to characters. We also buffer the reading operation.

We read the data line by line.

Finally, we shut down the input stream as well.

Java Socket HEAD Request

In the next example, we create a HEAD request with a Java socket. The HEAD method is identical to the GET method except that the server does not return a message body in the response; it returns only the header.

The example retrieves the header of the specified web page.

We issue a HEAD command.

In HTTP protocol version 1.1, all connections are considered persistent (keep-alive) unless declared otherwise. By setting the option to false , we inform that we want to finish the connection after the request/response cycle.

Java ServerSocket DateServer

The following example creates a very simple server with ServerSocket . ServerSocket creates a server socket, bound to the specified port.

The example creates a server that returns the current date. The program must be manually killed in the end.

A server socket on port 8081 is created.

The accept() method listens for a connection to be made to this socket and accepts it. The method blocks until a connection is made.

We write the current date to the socket output stream.

We have a Python script that issues a GET request to the server.

This is the output.

Java Socket Client/Server Example

In the following example, we have a server and a client. The server reverses the text sent from a client. The example is simple and blocking. To improve it, we need to include threads.

The ReverseServer sends a reversed string back to the client. It communicates only with one client at a time. It must disconnect from a client first to communicate with another client. It receives a bye command from a client to close the connection.

We have a socket input stream for reading client data and socket output stream for sending the response back to the client; the output streams and the connection are closed.

A do-while loop is created for a single client. We read the data from the client and send the modified content back. The loop is finished upon receiving a bye command from the client. Before this is done, no other client can connect to the server.

The client sends text data to the server.

We read input from the console and send it to the server. The while loop is finished when we send the bye command, which informs the server that the connection can be closed.

Java DatagramSocket example

UDP is a communication protocol that transmits independent packets over the network with no guarantee of arrival and no guarantee of the order of delivery. One service that used UDP is the Quote of the Day (QOTD).

The following example creates a client program that connects to a QOTD service.

The example retrieves a quote from a quote service and prints it to the terminal.

We get an IP address from a hostname.

A DatagramSocket is created.

A DatagramPacket is created. Since the QOTD service does not require data from a client, we send an empty small array. Each time we send a packet, we need to specify data, address, and the port.

The packet is send to its destination with send() .

We receive a packet from the service.

We transform the received bytes into a string and print it.

In this tutorial, we have created network Java programs with sockets. You might also be interested in the related tutorials: Java HTTP GET/POST request tutorial, Java InputStreamReader tutorial, Java Servlet tutorial, and Java tutorial.

Java socket framework

Всем доброго времени суток. Разрабатываю онлайн 3д-игру, была выбрана платформа java. Для 3d был выбран движок jmonkeyengine. А в качестве серверной части я решил написать простеньки p2p фреймворк, MVC с реализацией представлений на клиенте.

Где может пригодится:

1. Сервер для мобильных сервисов.
2. Любые многопользовательские приложения где нужно p2p.
3. Онлайн игры.
4. Торрент при желании.

Диаграмма:

1. Клиент посылает на сервер сообещение в котором перечисляются переменные и какую задачу вызвать.
2. Сообщение попадает очередь входящих сообщений.
3. Роутер запускает нужную задачу с этими переменными.
4. В задаче мы отправляем ответ пользователю.

1. Настраивать порты клиента и сервера.
2. Модели базы данных.
3. Валидация входящих сообщений.
4. Права пользователей.
5. Модули.
6. Механизм сессий.
7. Команды.
8. Смена протокола tcp/udp.

Инструкции, примеры и документациия

Пример отправки и приема сообщений

1. Клиента посылает на сервер json строку c названием вызываемой задачи.
2. Задача извлекает переменные из сообщения и посылает ответ.

Задача должна быть создана в папке tasks и унаследованна от JClientTask. В конструкторе должна передаваться класс JInMessages с входящим сообщением. Должны быть реализованы методы rules,rights,action. В rules описаны правила валидации переменных, можно написать свои правила валидации. В rights перечисление прав пользователей которые имеют право вызывать действие.
в action основной код.

Читать еще:  Маткад ошибка значение должно быть скалярным

Строка ответа и поставнока в очередь

Вместо ip можно ставить любой ip который слушает сокет и ждет json строку.

После установки фремворка по инструкции в базе будут 2 таблицы: Users, Session. Примеры использования есть в папках с задачами.

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

1. Права должны быть описаны в задачах в методе rights:guest,user,admin. Неавторизованный пользовател имеет права guest. Зарегистрированнному пользователю присваивается user, эти значения хранятся в базе данных в таблице rights.

Пример: авторизация по токену, модели, права

1. В права указываем ожидаемые переменные:email,password.
2. Создаем модель Users, вызываем метод авторизации.
3. Создаем модель сессии — получаем токен.
4. Отправляем ответ.
5. Токен сохраняем на клиенте.

Пример проверки прав и отправки сообщений на определенный ip

1. В правах указываем user.
2. В ожидаемых переменных token

После вызова задачи с токеном и правами «не гость». Пользователь ищется в базе данных в таблице Session, по user_id создается модель Users — которая доступнав задаче в переменной webUser.

Можно отправлять сообщения всем клиентам по user_id в Session или по соединениею в классе JConnections.

Java Socket Client Examples (TCP/IP)

1. Client Socket API

1. The client initiates connection to a server specified by hostname/IP address and port number.

2. Send data to the server using an OutputStream .

3. Read data from the server using an InputStream .

4. Close the connection.

The steps 2 and 3 can be repeated many times depending on the nature of the communication.

Now, let’s study how to use the Socket class to implement these steps.

Initiate Connection to a Server:

— Socket(InetAddress address, int port)

— Socket(String host, int port)

— Socket(InetAddress address, int port, InetAddress localAddr, int localPort)

You see, it requires the IP address/hostname of the server and the port number.

With the first two constructors, the system automatically assigns a free port number and a local address for the client computer. With the third constructor, you can explicitly specify the address and port number of the client if needed. The first constructor is often used because of its simplicity.

— IOException : if an I/O error occurs when creating the socket.

— UnknownHostException : if the IP address of the host could not be determined.

That means you have to catch (or re-throw) these checked exceptions when creating a Socket instance. The following line of code demonstrates how to create a client socket that attempts to connect to google.com at port number 80:

Send Data to the Server:

Then you can use the write() method on the OutputStream to write an array of byte to be sent:

And you can wrap the OutputStream in a PrintWriter to send data in text format, like this:

The argument true indicates that the writer flushes the data after each method call (auto flush).

Read Data from the Server:

Then use the read() method on the InputStream to read data as an array of byte, like this:

You can wrap the InputStream object in an InputStreamReader or BufferedReader to read data at higher level (character and String). For example, using InputStreamReader :

And using BufferedReader :

Close the Connection:

This method also closes the socket’s InputStream and OutputStream , and it can throw IOException if an I/O error occurs when closing the socket.

We recommend you to use the try-with-resource structure so you don’t have to write code to close the socket explicitly.

Now, let’s see some sample programs to learn to code a complete client application. The following examples illustrate how to connect to some well-known Internet services.

2. Java Socket Client Example #1: a Daytime Client

The following program connects to NIST time server to read the current date and time:

As you can see, this program simply makes a connection and read data from the server. It doesn’t send any data to the server, due to the simple nature of Daytime protocol.

Run this program and you would see the output like this (two blank lines — one after and one before):

This is the current date and time returned by the server, in UTC time zone.

3. Java Socket Client Example #2: a Whois Client

The InterNIC (The Network Information Center) provides a Whois service on port number 43 (port 43 is for Whois protocol).

Hence we can develop the following program to “whois” any domain name we want:

As you can see, the domain name is passed to the program as an argument. After connected to the server, it sends the domain name, and reads the response from the server.

Run this program from command line using the following command:

And you would see some information about the domain google.com like this:

You can see the domain google.com was registered in 1997 and it will expire in 2020.

4. Java Socket Client Example #3: a HTTP Client

As you can see, the URL is passed to the program as an argument. The program basically sends a HEAD request (follows HTTP protocol) in the following format:

Ссылка на основную публикацию
Adblock
detector