Java Language
Сокеты Java
Поиск…
Вступление
Сокеты - это низкоуровневый сетевой интерфейс, который помогает в создании соединения между двумя программами, главным образом клиентами, которые могут работать или не работать на одном компьютере.
Программирование сокетов - одна из наиболее широко используемых сетевых концепций.
замечания
Существует два типа трафика интернет-протокола:
1. Протокол TCP-Transmission Control 2. UDP - протокол дейтаграмм пользователей
TCP - это протокол, ориентированный на соединение.
UDP - протокол без установления соединения.
TCP подходит для приложений, требующих высокой надежности, а время передачи относительно менее критично.
UDP подходит для приложений, которым требуется быстрая и эффективная передача, например игр. Безгражданность UDP также полезна для серверов, которые отвечают на небольшие запросы от огромного числа клиентов.
В более простых словах -
Используйте TCP, когда вы не можете позволить себе потерять данные, и когда время для отправки и получения данных не имеет значения. Используйте UDP, когда вы не можете позволить себе потерять время и когда потеря данных не имеет значения.
Существует абсолютная гарантия того, что переданные данные остаются нетронутыми и поступают в том же порядке, в каком они были отправлены в случае TCP.
в то время как нет никакой гарантии, что отправленные сообщения или пакеты достигнут вообще в UDP.
Простой сервер эхо-ответа TCP
Наш сервер эхо-ответа TCP будет отдельным потоком. Это просто, как начало. Он будет просто отсылать все, что вы отправляете, но в заглавной форме.
public class CAPECHOServer extends Thread{
// This class implements server sockets. A server socket waits for requests to come
// in over the network only when it is allowed through the local firewall
ServerSocket serverSocket;
public CAPECHOServer(int port, int timeout){
try {
// Create a new Server on specified port.
serverSocket = new ServerSocket(port);
// SoTimeout is basiacally the socket timeout.
// timeout is the time until socket timeout in milliseconds
serverSocket.setSoTimeout(timeout);
} catch (IOException ex) {
Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void run(){
try {
// We want the server to continuously accept connections
while(!Thread.interrupted()){
}
// Close the server once done.
serverSocket.close();
} catch (IOException ex) {
Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Теперь принимать соединения. Давайте обновим метод run.
@Override
public void run(){
while(!Thread.interrupted()){
try {
// Log with the port number and machine ip
Logger.getLogger((this.getClass().getName())).log(Level.INFO, "Listening for Clients at {0} on {1}", new Object[]{serverSocket.getLocalPort(), InetAddress.getLocalHost().getHostAddress()});
Socket client = serverSocket.accept(); // Accept client conncetion
// Now get DataInputStream and DataOutputStreams
DataInputStream istream = new DataInputStream(client.getInputStream()); // From client's input stream
DataOutputStream ostream = new DataOutputStream(client.getOutputStream());
// Important Note
/*
The server's input is the client's output
The client's input is the server's output
*/
// Send a welcome message
ostream.writeUTF("Welcome!");
// Close the connection
istream.close();
ostream.close();
client.close();
} catch (IOException ex) {
Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
// Close the server once done
try {
serverSocket.close();
} catch (IOException ex) {
Logger.getLogger(CAPECHOServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
Теперь, если вы можете открыть telnet и попробовать подключиться, вы увидите приветственное сообщение.
Вы должны подключиться к указанному порту и IP-адресу.
Вы должны увидеть результат, подобный этому:
Welcome!
Connection to host lost.
Ну, связь была потеряна, потому что мы ее прекратили. Иногда нам приходилось программировать наш собственный клиент TCP. В этом случае нам нужен клиент для запроса ввода от пользователя и отправки его по сети, получения заглавного ввода.
Если сервер сначала отправляет данные, клиент сначала должен прочитать данные.
public class CAPECHOClient extends Thread{
Socket server;
Scanner key; // Scanner for input
public CAPECHOClient(String ip, int port){
try {
server = new Socket(ip, port);
key = new Scanner(System.in);
} catch (IOException ex) {
Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void run(){
DataInputStream istream = null;
DataOutputStream ostream = null;
try {
istream = new DataInputStream(server.getInputStream()); // Familiar lines
ostream = new DataOutputStream(server.getOutputStream());
System.out.println(istream.readUTF()); // Print what the server sends
System.out.print(">");
String tosend = key.nextLine();
ostream.writeUTF(tosend); // Send whatever the user typed to the server
System.out.println(istream.readUTF()); // Finally read what the server sends before exiting.
} catch (IOException ex) {
Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
istream.close();
ostream.close();
server.close();
} catch (IOException ex) {
Logger.getLogger(CAPECHOClient.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
Теперь обновите сервер
ostream.writeUTF("Welcome!");
String inString = istream.readUTF(); // Read what the user sent
String outString = inString.toUpperCase(); // Change it to caps
ostream.writeUTF(outString);
// Close the connection
istream.close();
И теперь запустите сервер и клиент, у вас должен быть выход, похожий на этот
Welcome!
>