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プロトコルでのネットワーク通信
-
ソケット通信ステップ
①のServerSocketとソケットの作成
、入力/出力に接続された②ソケット開口ストリーム
プロトコルリード/ライト動作に応じ③ソケット
④近い入出力ストリーム、閉じるソケット
-
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);
//出错,打印出错信息
}
}
}
- 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();