Socket программирования почерк Tomcat

Java сокет программирования
Java Socket программирования ---- Связь настолько закаленное

Для разных уровней сетевого трафика, Java предоставляет различный API, который предоставляет сетевые возможности четыре основных категорий

1. InetAddress

Для аппаратных ресурсов на идентифицирует идентификатор сети по адресу Интернет-протокола (IP).

//获取本机的InetAddress实例
InetAddress address =InetAddress.getLocalHost();
address.getHostName();//获取计算机名
address.getHostAddress();//获取IP地址
byte[] bytes = address.getAddress();//获取字节数组形式的IP地址,以点分隔的四部分

//获取其他主机的InetAddress实例
InetAddress address2 =InetAddress.getByName("其他主机名");
InetAddress address3 =InetAddress.getByName("IP地址");

Класс 2. URL

(Uniform Resource Locator) Uniform Resource Locator представляет адрес ресурса в Интернете, имя протокола: Имя ресурса

//创建一个URL的实例
URL baidu =new URL("http://www.baidu.com");
URL url =new URL(baidu,"/index.html?username=tom#test");//?表示参数,#表示锚点
url.getProtocol();//获取协议
url.getHost();//获取主机
url.getPort();//如果没有指定端口号,根据协议不同使用默认端口。此时getPort()方法的返回值为 -1
url.getPath();//获取文件路径
url.getFile();//文件名,包括文件路径+参数
url.getRef();//相对路径,就是锚点,即#号后面的内容
url.getQuery();//查询字符串,即参数

2.1 Использование URL для чтения веб-контента

() Метод объекта OpenStream URL-адрес может быть определен входной поток ресурсов, поток может быть считана путем доступа к веб-страницу или ресурс

//使用URL读取网页内容
//创建一个URL实例
URL url =new URL("http://www.baidu.com");
InputStream is = url.openStream();//通过openStream方法获取资源的字节输入流
InputStreamReader isr =newInputStreamReader(is,"UTF-8");//将字节输入流转换为字符输入流,如果不指定编码,中文可能会出现乱码
BufferedReader br =newBufferedReader(isr);//为字符输入流添加缓冲,提高读取效率
String data = br.readLine();//读取数据
while(data!=null){
System.out.println(data);//输出数据
data = br.readerLine();
}
br.close();
isr.colose();
is.close();

3. программирование TCP

Протокол TCP является ориентированным на соединение, надежный, заказал, таким образом, чтобы передавать данные байтового потока от трехэтапного, чтобы установить соединение, канал передачи данных формируется, большое количество передачи данных в связи, эффективность будет несколько ниже,

Сетевое взаимодействие в классе на основе протокола TCP 3,1 Java

  1. Разъем связи шаг
    ① создать ServerSocket и гнездо
    ② Гнездо отверстие , подключенного к входу / вывода потоков
    ③ Гнездо в соответствии с протоколом чтения / операции записи
    ④ закрыть входные и выходные потоки, Закрыть Торцевые
    Here Вставка рисунка Описание

  2. ServerSocket серверного класс
    ① объект ServerSocket создавать, связывает порт прослушивания
    ② с помощью метода принимает () прослушивать запросы клиента
    ③ После установления соединения, клиент посылает информацию запроса на чтение через входной поток
    ④ передает информацию через клиент акцент выходного потока
    ⑤ Закрыть Близкие по теме ресурсы

   import java.io.*;
  import java.net.*;
  import java.applet.Applet;
  public class TalkServer{
    public static void main(String args[]) {
      try{
        ServerSocket server=null;
        try{
          server=new ServerSocket(4700);
        //创建一个ServerSocket在端口4700监听客户请求
        }catch(Exception e) {
          System.out.println("can not listen to:"+e);
        //出错,打印出错信息
        }
        Socket socket=null;
        try{
          socket=server.accept();
          //使用accept()阻塞等待客户请求,有客户
          //请求到来则产生一个Socket对象,并继续执行
        }catch(Exception e) {
          System.out.println("Error."+e);
          //出错,打印出错信息
        }
        String line;
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
         //由Socket对象得到输入流,并构造相应的BufferedReader对象
        PrintWriter os=newPrintWriter(socket.getOutputStream());
         //由Socket对象得到输出流,并构造PrintWriter对象
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
         //由系统标准输入设备构造BufferedReader对象
        System.out.println("Client:"+is.readLine());
        //在标准输出上打印从客户端读入的字符串
        line=sin.readLine();
        //从标准输入读入一字符串
        while(!line.equals("bye")){
        //如果该字符串为 "bye",则停止循环
          os.println(line);
          //向客户端输出该字符串
          os.flush();
          //刷新输出流,使Client马上收到该字符串
          System.out.println("Server:"+line);
          //在系统标准输出上打印读入的字符串
          System.out.println("Client:"+is.readLine());
          //从Client读入一字符串,并打印到标准输出上
          line=sin.readLine();
          //从系统标准输入读入一字符串
        }  //继续循环
        os.close(); //关闭Socket输出流
        is.close(); //关闭Socket输入流
        socket.close(); //关闭Socket
        server.close(); //关闭ServerSocket
      }catch(Exception e){
        System.out.println("Error:"+e);
        //出错,打印出错信息
      }
    }
  }
  1. Оправа класса клиент
    ① Оправа созданный объект, адрес и номер порта сервера указать требуемое соединение
    ② После соединения установлено, выходной поток сервера посылает сообщение с запросом , как
    ③ информации ответа сервера приобретаемой входного потоком
    ④ закрытием ресурсов реагирования
   import java.io.*;
  import java.net.*;
  public class TalkClient {
    public static void main(String args[]) {
      try{
        Socket socket=new Socket("127.0.0.1",4700);
        //向本机的4700端口发出客户请求
        BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
        //由系统标准输入设备构造BufferedReader对象
        PrintWriter os=new PrintWriter(socket.getOutputStream());
        //由Socket对象得到输出流,并构造PrintWriter对象
        BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        //由Socket对象得到输入流,并构造相应的BufferedReader对象
        String readline;
        readline=sin.readLine(); //从系统标准输入读入一字符串
        while(!readline.equals("bye")){
        //若从标准输入读入的字符串为 "bye"则停止循环
           os.println(readline);
          //将从系统标准输入读入的字符串输出到Server
          os.flush();
          //刷新输出流,使Server马上收到该字符串
          System.out.println("Client:"+readline);
          //在系统标准输出上打印读入的字符串
          System.out.println("Server:"+is.readLine());
          //从Server读入一字符串,并打印到标准输出上
          readline=sin.readLine(); //从系统标准输入读入一字符串
        } //继续循环
        os.close(); //关闭Socket输出流
        is.close(); //关闭Socket输入流
        socket.close(); //关闭Socket
      }catch(Exception e) {
        System.out.println("Error"+e); //出错,则打印出错信息
      }
  }
}

3.2 Применения многопоточных связи между сервером и мульти-клиентом

① создать на стороне сервера ServerSocket, цикл вызова принимает () ожидает подключения клиента
② клиент создает сокет и запросы и на стороне сервера соединение
③ сервер принимает запросы на период обучения, клиент создает сокет и установить выделенное соединение
④ установление двух соединений гнездо в отдельном потоке на диалоге
⑤ сервер продолжает ждать нового соединения

//服务器线程处理
//和本线程相关的socket
Socket socket =null;
//
public serverThread(Socket socket){
this.socket = socket;
}

publicvoid run(){
//服务器处理代码
}

//============================================
//服务器代码
ServerSocket serverSocket =newServerSocket(10086);
Socket socket =null;
int count =0;//记录客户端的数量
while(true){
socket = serverScoket.accept();
ServerThread serverThread =newServerThread(socket);
 serverThread.start();
 count++;
System.out.println("客户端连接的数量:"+count);
}

4. Программирование UDP

Протокол UDP (User Datagram Protocol) является ненадежным и без установления соединения, неупорядоченных, быстрая
передача данных, первые данные, подлежащие передаче, определяется как дейтаграмм (Datagram), размер ограничен 64К, дейтаграммы указывающее , что запрос данных достигает сокет (адрес хоста и номер порта), то пакеты данных отправлено

  • DatagramPacket Класс: представляет собой пакет датаграммы
  • DatagramSocket класс: класс к концу связи

4.1 шагов по реализации на стороне сервера

① создать DatagramSocket, указать номер порта
② создать DatagramPacket
③ принять клиент посылает информацию данных
④ чтения данных

//服务器端,实现基于UDP的用户登录
//1、创建服务器端DatagramSocket,指定端口
DatagramSocket socket =new datagramSocket(10010);
//2、创建数据报,用于接受客户端发送的数据
byte[] data =newbyte[1024];//
DatagramPacket packet =newDatagramPacket(data,data.length);
//3、接受客户端发送的数据
socket.receive(packet);//此方法在接受数据报之前会一致阻塞
//4、读取数据
String info =newString(data,o,data.length);
System.out.println("我是服务器,客户端告诉我"+info);


//=========================================================
//向客户端响应数据
//1、定义客户端的地址、端口号、数据
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 = "欢迎您!".geyBytes();
//2、创建数据报,包含响应的数据信息
DatagramPacket packet2 = new DatagramPacket(data2,data2.length,address,port);
//3、响应客户端
socket.send(packet2);
//4、关闭资源
socket.close();

4.2 Порядок осуществления клиентских

① Определить отправки информации
для создания DatagramPacket ②, содержащей информацию, подлежащую передаче
③ создать DatagramSocket
④ данные посыла

//客户端
//1、定义服务器的地址、端口号、数据
InetAddress address =InetAddress.getByName("localhost");
int port =10010;
byte[] data ="用户名:admin;密码:123".getBytes();
//2、创建数据报,包含发送的数据信息
DatagramPacket packet = newDatagramPacket(data,data,length,address,port);
//3、创建DatagramSocket对象
DatagramSocket socket =newDatagramSocket();
//4、向服务器发送数据
socket.send(packet);


//接受服务器端响应数据
//======================================
//1、创建数据报,用于接受服务器端响应数据
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2,data2.length);
//2、接受服务器响应的数据
socket.receive(packet2);
String raply = new String(data2,0,packet2.getLenth());
System.out.println("我是客户端,服务器说:"+reply);
//4、关闭资源
socket.close();
Опубликовано 76 оригинальных статей · вона похвала 0 · Просмотров 1931

рекомендация

отblog.csdn.net/weixin_43907800/article/details/104228787