ホームページ  >  記事  >  Java  >  JAVA 高度な学習ソケット プログラミング

JAVA 高度な学習ソケット プログラミング

WBOY
WBOY転載
2022-11-16 16:17:112199ブラウズ

この記事では、java に関する関連知識を提供します。主にソケット プログラミングに関する関連コンテンツを紹介します。ソケットとは、ネットワーク ドライバー層によってアプリケーションに提供されるインターフェイスです。見てみましょう。以下の仕組みが皆様のお役に立てば幸いです。

JAVA 高度な学習ソケット プログラミング

#推奨学習: 「

java ビデオ チュートリアル

1. ソケットの知識

1.ソケットの概要

(1) Java は、もともとネットワークプログラミング言語として登場し、ネットワークへの高いサポートにより、クライアントとサーバー間のスムーズな通信を実現します。

(2) ネットワークプログラミングでは Socket が最もよく使われており、あらゆる実践的なネットワークプログラムには Socket の参加が不可欠です。

(3) コンピュータ ネットワーク プログラミング技術では、2 つのプロセスまたは 2 つのコンピュータがネットワーク通信接続を介してデータを交換できます。この通信リンクのエンドポイントは「ソケット」と呼ばれます (英語名は Socket)。

(4) ソケットは、ネットワーク ドライバー層によってアプリケーションに提供されるインターフェイスまたはメカニズムです。

(5) 物流の例を使用して速達配送を説明します。ソケット:

-->送り主は、荷受人の住所情報を含む商品を速達ステーションに配送します。送り主は物流の仕組みを意識する必要がなく、商品は荷受人のエリアにある速達ステーションに届けられ、荷受人は商品の受け取りを待つだけです。

--> このプロセスは、ネットワークにおける情報送信のプロセスを鮮明に示しています。このうち、商品はデータ情報であり、2 つの速達サイトは 2 つのエンドポイント Socket です。

# (6) アプリケーションは、ネットワーク内で情報がどのようにアドレス指定され、送信されるかを気にする必要はなく、データの送信と受信の準備のみを行います。

2. ソケットの通信原理

(1) プログラマーにとって、ソケットの基本的なメカニズムがどのようにデータを送信するかを理解する必要はなく、代わりに、データはソケットに直接送信され、ソケットはソケットに送信されます。プログラムによって提供される関連情報は、一連の計算を通じて IP および情報データにバインドされ、データはドライバーに渡されてネットワークに送信されます。

(2) Socket の基礎となるメカニズムは非常に複雑です Java プラットフォームには、基礎となるメカニズムを知らなくても Socket を簡単かつ効果的に使用して通信プログラムを開発できる、シンプルかつ強力なクラスがいくつか用意されています。

3. java.net パッケージ

(1) java.net パッケージは、ソケットベースのクライアント/サーバー通信をサポートするいくつかのクラスを提供します。

(2) java.net パッケージで一般的に使用されるクラスには、Socket、ServerSocket、DatagramPacket、DatagramSocket、InetAddress、URL、URLConnection、URLEncoder などが含まれます。

(3) クライアントの接続要求を監視するには、ServerSocket クラスを使用します。

(4) Socket クラスは、ネットワーク上のプロセス間通信のためのソケットを実装します。

(5) DatagramSocket クラスは、UDP プロトコルを使用してクライアントとサーバーのソケットを実装します。

(6) DatagramPacket クラスは、DatagramSocket クラスのオブジェクトを使用して、設定と受信したデータグラムをカプセル化します。

(7) InetAddress クラスはインターネット アドレスを表します。

(8) データグラム メッセージと Socket オブジェクトを作成する場合、InetAddress クラスを使用できます

2. TCP プロトコルに基づくソケット プログラミング

1.Socket クラスおよび ServerSocket クラス

(1) java.net パッケージの 2 つのクラス Socket と ServerSocket は、双方向の安全な接続のクライアント側とサーバー側をそれぞれ実装するために使用されます。 TCP プロトコルについて 作業中の作業プロセスは電話をかけるのと同じで、双方が接続されて初めて通話を開始できます。

(2) ネットワーク通信中、Socket はデータ フローを使用してデータ転送を完了する必要があります。

(3) アプリケーションがネットワーク経由で別のアプリケーションにデータを送信したい場合は、単純にソケットを作成し、そのソケットに関連付けられた出力ストリームにデータを書き込みます。これに応じて、受信アプリケーションはソケットを作成し、関連する入力ストリームからデータを読み取ります。

(4) 注: TCP プロトコルに基づくソケット プログラミングでは、多くの場合、2 つのエンドポイントがクライアントとして機能し、もう 1 つがサーバーとして機能します。つまり、クライアント/サーバー モデルに従います。


● ソケット クラス

Socket オブジェクトは、クライアントとサーバー間の接続を確立します。 Socket クラスのコンストラクター メソッドを使用してソケットを作成し、このソケットを指定したホストとポートに接続できます。

(1) 構築方法

—>最初の構築方法は、ホスト名とポート番号をパラメータとして受け取り、Socket オブジェクトを作成します。オブジェクトの作成時に UnknownHostException または IOException がスローされる場合があるため、これらをキャッチする必要があります。

ソケット s = 新しいソケット(ホスト名,ポート);

--> 2 番目の構築メソッドは、InetAddress オブジェクトとポート番号をパラメータとして受け取り、Socket オブジェクトを作成します。コンストラクターは IOException または UnknownHostException をスローする可能性があるため、これらを捕捉して処理する必要があります。

Socket s = new Socket(address,port);

(2) 共通メソッド

● ServerSocket クラス

ServerSocket オブジェクトは、クライアントが接続を確立するのを待機し、接続が確立された後に通信します。

(1)構築メソッド

-->最初の構築メソッドは、ServerSocket オブジェクトを作成するためのパラメータとしてポート番号を受け入れます。このオブジェクトの作成時に、IOException がスローされる場合があります。キャプチャして処理する必要があります。

Serversocket SS = New Serversocket (Port);

##-& GT; 2 番目のコンストラクターは、長さとキューの最大長をパラメーターとして受け取ります。接続が拒否される前に取得できます。

using ss using using ss through ss through to ss = new ss = new ServerSocket(port, maxqu);

メソッドは ServerSocket クラスにも適用されます。

—>ServerSocket クラスには accept() メソッドがあり、これはクライアントが通信を開始するのを待機して、Socket オブジェクトをさらなるデータ送信に使用できるようにするために使用されます。

# 2. ソケット プログラミングを使用してログイン機能を実装します


## ● シングル ユーザー ログインを実現するには

— ->ソケット ネットワークのプログラミングは、一般に次の 4 つのステップに分かれています。

(1) 接続を確立します。

(2) ソケットに関連付けられた入出力ストリームを開きます。

(3) データ ストリームに情報を書き込み、データ ストリームから情報を読み取ります。

(4) すべてのデータ ストリームとソケットを閉じます。

-& GT; 2 つのクラスを使用してユーザー ログインの機能をシミュレートし、クライアントがサーバー側にユーザ​​ー ログイン情報を送信したことを実現し、その情報をサーバー側で表示します。

クライアント実装手順:

1) 接続を確立します。接続はサーバーとポートを指します。

2) ソケットに関連付けられた入出力ストリームを開きます。

3) 情報を出力ストリームに書き込みます。

4) 入力ストリームから応答情報を読み取ります。

5) すべてのデータ ストリームとソケットを閉じます。

サーバー側の実装手順:

1) 接続を確立し、ポートをリッスンします。

2) accept() メソッドを使用して、クライアントが通信を開始するのを待ちます。

3) に関連付けられた入出力ストリームを開きます。ソケット。

4) 入力ストリームからリクエスト情報を読み取ります。

5) 情報を出力ストリームに書き込みます。

6) すべてのデータ ストリームとソケットを閉じます。

#-& gt; クライアントとサーバーの対話では、応答モードを採用し、まずサーバーを起動して監視状態に入り、クライアントの接続要求を待ちます。接続が成功すると、クライアントが最初に話します。」、サーバーは「応答」を返します。

例 01: オブジェクト情報の転送を実装します。

♥ ユーザー クラス

package cn.bdqn.demo02;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	/** 用户名 */
	private String loginName;
	/** 用户密码 */
	private String pwd;

	public User() {
		super();
	}

	public User(String loginName, String pwd) {
		super();
		this.loginName = loginName;
		this.pwd = pwd;
	}

	public String getLoginName() {
		return loginName;
	}

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

}

♥ LoginServer クラス

package cn.bdqn.demo02;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class LoginServer {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		InputStream is = null;
		ObjectInputStream ois = null;
		OutputStream os = null;
		try {
			// 建立一个服务器Socket(ServerSocket),指定端口8800并开始监听
			serverSocket = new ServerSocket(8800);
			// 使用accept()方法等待客户端发起通信
			socket = serverSocket.accept();
			// 打开输入流
			is = socket.getInputStream();
			// 反序列化
			ois = new ObjectInputStream(is);
			// 获取客户端信息,即从输入流读取信息
			User user = (User) ois.readObject();
			if (user != null) {
				System.out.println("我是服务器,客户登录信息为:" + user.getLoginName() + ","
						+ user.getPwd());
			}

			// 给客户端一个响应,即向输出流中写入信息
			String reply = "欢迎你,登录成功";
			os = socket.getOutputStream();
			os.write(reply.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			try {
				os.close();
				ois.close();
				is.close();
				socket.close();
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

LoginClient クラス

package cn.bdqn.demo02;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class LoginClient {

	/*
	 * 示例02:升级演示示例01,实现传递对象信息。
	 */
	
	public static void main(String[] args) {
		Socket socket = null;
		OutputStream os = null;
		ObjectOutputStream oos = null;
		InputStream is = null;
		BufferedReader br = null;
		try {
			// 建立客户端Socket连接,指定服务器的位置为本机以及端口为8800
			socket = new Socket("localhost", 8800);
			// 打开输出流
			os = socket.getOutputStream();
			// 对象序列化
			oos = new ObjectOutputStream(os);
			// 发送客户端信息,即向输出流中写入信息
			User user = new User("Tom", "123456");
			oos.writeObject(user);
			socket.shutdownOutput();

			// 接收服务器端的响应,即从输入流中读取信息
			is = socket.getInputStream();
			br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while ((reply = br.readLine()) != null) {
				System.out.println("我是客户端,服务器的响应为:" + reply);
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
				is.close();
				oos.close();
				os.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

例 02:デモ例01をバージョンアップし、複数のオブジェクト情報の送信を実現しました。

ユーザー クラス

package cn.bdqn.demo03;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	/** 用户名 */
	private String loginName;
	/** 用户密码 */
	private String pwd;

	public User() {
		super();
	}

	public User(String loginName, String pwd) {
		super();
		this.loginName = loginName;
		this.pwd = pwd;
	}

	public String getLoginName() {
		return loginName;
	}

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

}

LoginServer クラス

package cn.bdqn.demo03;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class LoginServer {

	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		InputStream is = null;
		ObjectInputStream ois = null;
		OutputStream os = null;
		try {
			// 建立一个服务器Socket(ServerSocket),指定端口8800并开始监听
			serverSocket = new ServerSocket(8800);
			// 使用accept()方法等待客户端发起通信
			socket = serverSocket.accept();
			// 打开输入流
			is = socket.getInputStream();
			// 反序列化
			ois = new ObjectInputStream(is);
			// 获取客户端信息,即从输入流读取信息
			User[] users = (User[]) ois.readObject();
			for (int i = 0; i < users.length; i++) {
				System.out.println("我是服务器,客户登录信息为:" + users[i].getLoginName()
						+ "," + users[i].getPwd());
			}

			// 给客户端一个响应,即向输出流中写入信息
			String reply = "欢迎你,登录成功";
			os = socket.getOutputStream();
			os.write(reply.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} finally {
			// 关闭资源
			try {
				os.close();
				ois.close();
				is.close();
				socket.close();
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

LoginClient クラス

package cn.bdqn.demo03;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class LoginClient {

	/*
	 * 示例02:升级演示示例01,实现传递对象信息。
	 */
	
	public static void main(String[] args) {
		Socket socket = null;
		OutputStream os = null;
		ObjectOutputStream oos = null;
		InputStream is = null;
		BufferedReader br = null;
		try {
			// 建立客户端Socket连接,指定服务器的位置为本机以及端口为8800
			socket = new Socket("localhost", 8800);
			// 打开输出流
			os = socket.getOutputStream();
			// 对象序列化
			oos = new ObjectOutputStream(os);
			// 发送客户端信息,即向输出流中写入信息
			User user1 = new User("Tom", "123456");
			User user2 = new User("bob", "123456");
			User user3 = new User("lisa", "123456");
			User[] users = {user1,user2,user3};
			oos.writeObject(users);
			socket.shutdownOutput();

			// 接收服务器端的响应,即从输入流中读取信息
			is = socket.getInputStream();
			br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while ((reply = br.readLine()) != null) {
				System.out.println("我是客户端,服务器的响应为:" + reply);
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
				is.close();
				oos.close();
				os.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

● 複数のクライアント ユーザーを実装するlogin

## -->一問一答モデルは、明らかに人々が現実に望んでいることではありません。サーバーは 1 つのクライアントにのみサービスを提供することはできませんが、通常は同時に多くのクライアントにサービスを提供しますが、結果的にはシングルスレッド実装でなければなりません。

—>この問題の解決策は、マルチスレッドを使用することです。監視を特に担当するアプリケーション メイン サービス プログラムをサーバー側に作成し、応答を特に担当するスレッド プログラムを作成できます。これにより、マルチスレッドで複数のリクエストを処理できるようになります。

クライアント側の実装手順:

1) 接続を確立し、その接続はサーバーとポートを指します。

2) ソケットに関連付けられた入出力ストリームを開きます。

3) 情報を出力ストリームに書き込みます。

4) 入力ストリームから応答情報を読み取ります。

5) すべてのデータ ストリームとソケットを閉じます。

#-& GT; サーバー側の実装手順:

1) サーバースレッドクラスを作成し、RUN()メソッドでリクエストの応答処理を行います。

2) サーバー側のソケットが常に待機状態になるようにサーバー側のコードを変更します。

3) サーバーはリクエストを監視するたびに、スレッド オブジェクトを作成して開始します。

例 03: デモ例 02 をアップグレードして、複数のクライアントの応答処理を実装します。

ユーザー クラス

package cn.bdqn.demo04;

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = 1L;
	/** 用户名 */
	private String loginName;
	/** 用户密码 */
	private String pwd;

	public User() {
		super();
	}

	public User(String loginName, String pwd) {
		super();
		this.loginName = loginName;
		this.pwd = pwd;
	}

	public String getLoginName() {
		return loginName;
	}

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	public String getPwd() {
		return pwd;
	}

	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

}
LoginThread

package cn.bdqn.demo04;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.Socket;

public class LoginThread extends Thread {
	/*
	 * 示例03:升级示例02,实现多客户端的响应处理。
	 * 
	 * 分析如下:
	 * 	(1)创建服务器端线程类,run()方法中实现对一个请求的响应处理。
	 * 	(2)修改服务器端代码,让服务器端Socket一直处于监听状态。
	 * 	(3)服务器端每监听到一个请求,创建一个线程对象并启动
	 */
	
	Socket socket = null;
	//每启动一个线程,连接对应的Socket

	public LoginThread(Socket socket) {
		this.socket = socket;
	}
	
	//启动线程,即响应客户请求
	public void run() {
		InputStream is = null;
		ObjectInputStream ois = null;
		OutputStream os = null;
		try {
			//打开输入流
			is = socket.getInputStream();
			//反序列化
			ois = new ObjectInputStream(is);
			//获取客户端信息,即从输入流读取信息
			User user = (User)ois.readObject();
			if(user!=null){
				System.out.println("我是服务器,客户登录信息为:"+user.getLoginName()+","+user.getPwd());
			}
			
			//给客户端一个响应,即向输出流中写入信息
			os = socket.getOutputStream();
			String reply = "欢迎你,登录成功";
			os.write(reply.getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}finally{
			try {
				os.close();
				ois.close();
				is.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}			
		}	
	}	
}
LoginServer クラス

package cn.bdqn.demo04;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class LoginServer {
	
	public static void main(String[] args) {
		
		ServerSocket serverSocket = null;
		try {
			// 建立一个服务器Socket(ServerSocket)指定端口并开始监听
			serverSocket = new ServerSocket(8800);

			// 监听一直进行中
			while (true) {
				// 使用accept()方法等待客户发起通信
				Socket socket = serverSocket.accept();
				LoginThread loginThread = new LoginThread(socket);
				loginThread.start();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
♥ LoginClient1 クラス

package cn.bdqn.demo04;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class LoginClient01 {
	/*
	 * 客户端通过输出流向服务器端发送请求信息
	 * 服务器侦听客户端的请求得到一个Socket对象,将这个Socket对象传递给线程类
	 * 线程类通过输入流获取客户端的请求并通过输出流向客户端发送响应信息
	 * 客户端通过输入流读取服务器发送的响应信息
	 * 
	 */

	/*
	 * 示例03:升级演示示例02,实现多客户端的响应处理
	 */
	public static void main(String[] args) {
		
		Socket socket = null;
		OutputStream os = null;
		ObjectOutputStream oos = null;
		InputStream is = null;
		BufferedReader br = null;
		try {
			// 建立客户端Socket连接,指定服务器的位置为本机以及端口为8800
			socket = new Socket("localhost", 8800);
			// 打开输出流
			os = socket.getOutputStream();
			// 对象序列化
			oos = new ObjectOutputStream(os);
			// 发送客户端信息,即向输出流中写入信息
			User user = new User("Tom", "123456");
			oos.writeObject(user);
			socket.shutdownOutput();

			// 接收服务器端的响应,即从输入流中读取信息
			is = socket.getInputStream();
			br = new BufferedReader(new InputStreamReader(is));
			String reply;
			while ((reply = br.readLine()) != null) {
				System.out.println("我是客户端,服务器的响应为:" + reply);
			}
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				br.close();
				is.close();
				oos.close();
				os.close();
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
♥ LoginClient2クラスと LoginClient3 クラス

LoginClient1 クラスと同様に、別の User オブジェクトを作成するだけです

-->java.net パッケージの InetAddress クラスは、IP アドレスと DNS をカプセル化するために使用されます。 。このクラスにはコンストラクターがないため、InetAddress クラスのインスタンスを作成するには、ファクトリ メソッドを使用できます。

-& GT; INetaddress クラスのファクトリ メソッド

-& GT; ホストが見つからない場合、どちらのメソッドも不明なホスト名例外の異常によりスローされます。

3. UDP プロトコルに基づくソケット プログラミング

接続するかどうか接続指向非接続指向伝送の信頼性信頼できる信頼できない速度

1.DatagramPacket クラスと DatagramSocket クラス

(1) TCP ベースのネットワーク通信は安全で双方向です 電話をかけるのと同じように、最初にサーバーが必要です 双方向接続を確立した後, データ通信を始めるだけです。

(2) UDP ベースのネットワーク通信は、事前接続なしで相手のアドレスを指定してデータを送信するだけです。このようなネットワーク通信は安全ではないため、チャットシステムや相談システムなどでのみ使用されます。

(3) データグラムは通信を表すメッセージの一種であり、データグラムを通信に使用する場合、事前にコネクションを確立する必要はなく、UDP プロトコルに基づいています。

(4) Java には、通信を実現するためにデータグラムを使用できる 2 つのクラス、つまり DatagramPacketDatagramSocket## があります。 #。

(5) DatagramPacket クラスはコンテナの役割を果たし、DatagramSocket クラスは DatagramPacket の送受信に使用されます。

(6)

DatagramPacket クラスはデータを送受信するメソッドを提供しませんが、DatagramSocket クラスは send() メソッドと receive() メソッドを提供します。ソケットを介したデータグラムの送受信に使用します。

● DatagramPacket クラス

(1)構築メソッド

-->クライアントはデータを送信したいと考えています。まず DatagramPacket オブジェクトを作成してから、DatagramSocket オブジェクトを使用してそれを送信する必要があります。

# (2) 共通メソッド

##● DatagramSocket クラス

( 1) 構築方法

-->DatagramSocket クラスは接続状態の保持や入出力データストリームの生成を行わず、DatagramPacket オブジェクトでカプセル化されたデータグラムの送受信のみを行います。

(2) 一般的な方法

2. ソケットプログラミングを使用した顧客相談の実装

->UDP を使用して通信する 2 つのエンドポイントは等しい、つまり 2 つの通信プログラム間の関係は同等であり、優先順位はなく、コードさえもまったく同じである可能性があります。これは、ソケット プログラミングに基づくものとは異なります。 TCPプロトコルが区別されます。

UDP プロトコルに基づくソケット ネットワーク プログラミングは、通常、次の 4 つの手順に従います。

(2) DatagramSocket オブジェクトを使用してデータ パケットを送信します。

(3) DatagramSocket オブジェクトを使用してデータ パケットを受信します。

(4) DatagramPacket オブジェクトを使用してデータ パケットを処理します。

## —>顧客相談機能をシミュレートし、送信者が相談質問を送信し、受信者が送信された相談質問を受信して​​表示できるようにします。

送信者の実装手順:

1) ローカル ホストの InetAddress オブジェクトを取得します。

2) DatagramPacket オブジェクトを作成して、送信する情報をカプセル化します。

3) DatagramSocket オブジェクトを使用して、DatagramPacket オブジェクトのデータを送信します。

レシーバーの実装手順:

1) DatagramPacket オブジェクトを作成し、カプセル化されたデータを受信する準備をします。

                2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。

                3)利用DatagramPacket对象处理数据。

示例04:发送方发送咨询问题,接收方回应咨询。

♥ Receive类

package cn.bdqn.demo05;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketAddress;
import java.net.SocketException;

public class Receive {

	public static void main(String[] args) {
		/*
		 * 示例06:发送方发送咨询问题,接收方回应咨询。
		 * 
		 * 接收方实现步骤如下: 
		 * (1)创建DatagramPacket对象,准备接收封装的数据。
		 * (2)创建DatagramSocket对象,接收数据保存于DatagramPacket对象中。
		 * (3)利用DatagramPacket对象处理数据。
		 */

		DatagramSocket ds = null;
		DatagramPacket dp = null;
		DatagramPacket dpto = null;
		// 创建DatagramPacket对象,用来准备接收数据
		byte[] buf = new byte[1024];
		dp = new DatagramPacket(buf, 1024);
		try {
			// 创建DatagramSocket对象,接收数据
			ds = new DatagramSocket(8800);
			ds.receive(dp);
			// 显示接收到的信息
			String mess = new String(dp.getData(), 0, dp.getLength());
			System.out.println(dp.getAddress().getHostAddress() + "说:" + mess);

			String reply = "你好,我在,请咨询!";
			// 显示与本地对话框
			System.out.println("我  说:" + reply);
			// 创建DatagramPacket对象,封装数据
			SocketAddress sa = dp.getSocketAddress();
			dpto = new DatagramPacket(reply.getBytes(),
					reply.getBytes().length, sa);
			ds.send(dpto);
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			ds.close();
		}
	}
}

♥ Send类

package cn.bdqn.demo05;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class Send {
	/*
	 * 示例06:升级示例05,发送方发送咨询问题,接收方回应咨询。
	 * 
	 * 发送方实现步骤如下: 
	 * (1)获取本地主机的InetAddress对象。 
	 * (2)创建DatagramPacket对象,封装要发送的信息。
	 * (3)利用DatagramSocket对象将DatagramPacket对象数据发送出去。
	 */

	public static void main(String[] args) {
		DatagramSocket ds = null;
		InetAddress ia = null;
		String mess = "你好,我想咨询一个问题。";
		System.out.println("我说:" + mess);
		try {
			// 获取本地主机地址
			ia = InetAddress.getByName("localhost");
			// 创建DatagramPacket对象,封装数据
			DatagramPacket dp = new DatagramPacket(mess.getBytes(),
					mess.getBytes().length, ia, 8800);
			// 创建DatagramSocket对象,向服务器发送数据
			ds = new DatagramSocket();
			ds.send(dp);

			byte[] buf = new byte[1024];
			DatagramPacket dpre = new DatagramPacket(buf, buf.length);
			ds.receive(dpre);
			// 显示接收到的信息
			String reply = new String(dpre.getData(), 0, dpre.getLength());
			System.out.println(dpre.getAddress().getHostAddress() + "说:"
					+ reply);
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (SocketException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			ds.close();
		}
	}
}

推荐学习:《java视频教程


##TCP
UDP
##遅い 速い

以上がJAVA 高度な学習ソケット プログラミングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。