Tomcatののソケットプログラミング手書き

Javaのソケットプログラミングの
コミュニケーションがそのように鍛えている---- Javaのソケットプログラミングを

ネットワークトラフィックのさまざまなレベルについては、Javaは、ネットワーキング機能は4つの主要なカテゴリです提供して異なる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クラス

リソース名:(ユニフォームリソースロケータ)ユニフォームリソースロケータは、プロトコル名、インターネット上のリソースのアドレスを表し、

//创建一个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();//查询字符串,即参数

読み取りWebコンテンツに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プロトコルは、接続指向の、信頼性があり、データ伝送チャネルが形成され、接続を確立するために、スリーウェイハンドシェイクにより、バイトストリームデータを送信するように、接続中のデータ送信を大量に注文し、効率が若干低くなります

3.1 Javaクラス・ベースのTCPプロトコルでのネットワーク通信

  1. ソケット通信ステップ
    ①のServerSocketとソケットの作成
    、入力/出力に接続された②ソケット開口ストリーム
    プロトコルリード/ライト動作に応じ③ソケット
    ④近い入出力ストリーム、閉じるソケット
    ここに画像を挿入説明

  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. Socketクラスのクライアント
    ①Socketオブジェクトを作成し、サーバのアドレスとポート番号が必要な接続を示す
    接続が確立されると、サーバーによって出力ストリームは以下のように要求メッセージを送信する②
    入力ストリームにより取得③サーバ応答情報
    ④応答リソースを閉じます
   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を作成し、サイクル呼び出し受け入れる()待ち①は
②クライアントは、ソケットと要求とサーバー側の接続を作成します
③サーバは期間を勉強要求を受け入れると、クライアントはソケットを作成し、専用の接続を確立
④2つの接続の確立を対話の別のスレッドでソケット
⑤サーバは新しい接続を待機し続けます

//服务器线程处理
//和本线程相关的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プロトコル(ユーザデータグラムプロトコル)はコネクションと信頼できない、乱れ、高速で
データを転送、送信すべき最初のデータがデータグラム(データグラム)として定義され、サイズが64Kに制限され、データグラムデータ要求は、ソケット(ホストアドレスとポート番号)に達したことを示し、次いで、データパケットが送信されます

  • 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