記事のディレクトリ
- 序文
- ソケットベース
2.1ソケットの通信プロセス
2.2コントロールソケット接続
ソケット2.3提供されるオプション - ServerSocketのクラス
3.1構成のServerSocket
のServerSocket 3.2の一般的な方法
のServerSocketを提供3.3オプション - TCPベースの通信BIO
4.1の機能を実装する
4.2ソースコードを
4.3エフェクトプログラムのスクリーンショットを
1.はじめに
TCPトランスポート層に基づいてネットワーク通信は、エラー制御、注文した、信頼性があります。TCPは接続指向、信頼性の高いストリーミングサービス契約です。ブロードキャストおよびマルチキャストはTCPに基づいていないので、TCPプロトコルは、唯一のデュアル発信接続は、通信することができます。ここではいくつかの最初のソケットとServerSocketをしています。
サーバー、クライアントが通信プロセスを確立し、次のとおりです。
ここに画像を挿入説明
- 10.1.1.1へのサーバーのネットワーク・インタフェースのIPアドレス。80ポートサービスで実行しているサーバー側のアプリケーションは、ServerSocketのを確立し、接続要求かどうかを監視します。
- クライアントがサーバのIPアドレスまたはホスト名、開いているサービスポートを知っている必要があり、クライアントは、サーバのソケット(10.1.1.1:80)サーバーへの要求を開始します。
- サーバーが要求を受信すると、それがポート80でソケットを作成し、ローカルアドレスがソケット10.1.1.1:80、(クライアント側のIPアドレス、クライアント端末ポート)を確立するために、クライアントのためのソケットの外部アドレスです。クライアントポートは通常、オペレーティングシステムによって指定されています。
- 各サーバは、クライアントの要求を受け、それは、サービスポートにソケットを作成するソケットこれらの同じローカルアドレスが、外部アドレスは同じではありませんでしょう。各アドレスは、ローカルソケットの個々のクライアントの外にあります。サーバーは、いずれかのサービス要求するだけでなく、独立した通信と、各クライアントのために聞くことができるように。
- クライアントが通信し、ローカルサーバソケットで情報を読み書きします。同様に、発信者は、通信リンクが設定されて答えられると、別の番号に電話する番号を呼び出して、双方が話をすることができます。
2. Socketクラス
2.1ソケット通信処理
ここに画像を挿入説明
ソケット接続コントロール2.2
ソケットは、入力および出力ストリームを取得し
たら、接続されたサーバとクライアントとの間のソケット通信を、入力ストリームと出力ストリームの対を介して通信します。お電話の際と同様に、一度呼ばれるトラフィックチャネルの両方が確立された呼に応答入れ、それを交換することができます。
getInputStream()メソッドのソケットとのgetOutputStream()メソッドは、入出力ストリームを取得するために実装されています。
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
BufferedReader br = new BufferedReader(new IntputStreamReader(socket.getInputStream()));
ソケットは、ポート情報のアドレスを取得し
、あなたがローカルまたはリモートソケットのアドレスとポートの情報を取得する必要がある場合は、次のメソッドを使用することができます:
getInetAddress() //获得远程服务器的IP地址
getPort() //获得远程服务器的端口
getLocalAddress() //获得客户端本地的IP地址
getLocalPort() //获得客户端本地的端口
ソケットがクローズ
ソケットが含ま占有を解放するために、ときにエンドクライアントとサーバーの通信、およびソケットを閉じる必要があります
InputStream和OutputStream在内的各种资源。
if(!s.isClosed()) s.close();
//判断如果不是空的话则关闭
状態ソケット
Socketクラスは、ソケットの状態を決定するために、3つの方法(isBound、閉じられ及びをisConnected)を提供します。
結合状態のソケットを決定するために使用さisBound方法は、限り、ソケットがクローズされているにもかかわらず、拘束されていたとして、まだtrueを返します。一旦リモート・ホスト・ソケット接続のローカルによって確立されたかのように理解することができます。
この方法は、閉じられソケットが閉じているかどうかを決定するために使用されます。
接続されている方法は、ソケット接続状態を決定するために使用されます。そして、ソケットが閉じられた場合にも、同じ方法をisBound、まだをisConnectedステータスが不明である、trueを返します。これは、リモート・ホストがソケットに接続されているかどうかについて理解することができます。
3. BIO TCPベースの通信
3.1の機能を実装
クライアントが終了するにはquitコマンドを入力して、サーバがクライアントとの接続を確立するためのサービスとリスニングポートを作成し、クライアントがメッセージを転送します。
3.2ソースコード
サーバ・クラス:
package com.company.bio;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
public static void main(String[] args){
final String QUIT = "quit";
final int DEFAULT_PORT = 8888;
ServerSocket serverSocket = null;
//绑定监听端口
try{
serverSocket = new ServerSocket(DEFAULT_PORT);
System.out.println("启动服务器,监听端口"+DEFAULT_PORT);
while (true){
// 等待客户端连接
Socket socket = serverSocket.accept();
System.out.println("客户端[" + socket.getPort() + "]已连接");
//创建IO流
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
BufferedWriter bufferedWriter = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
String msg = null;
while ((msg = bufferedReader.readLine()) != null) {
// 读取客户端发送的消息,当对方关闭时返回null
System.out.println("客户端["+socket.getPort()+"]:"+ msg);
//回复客户发送的消息
bufferedWriter.write("服务器:" + msg + "\n");
bufferedWriter.flush(); //保证缓冲区的数据发送出去
//查看客户端是否退出
if(QUIT.equals(msg)){
System.out.println("客户端["+socket.getPort()+"]已退出");
break;
}
}
}
}catch (IOException e){
e.printStackTrace();
}finally {
if (serverSocket != null){
try {
serverSocket.close();
System.out.println("关闭ServerSocket");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
クライアントのカテゴリ:
package com.company.bio;
import java.io.*;
import java.net.Socket;
public class Client {
public static void main(String[] args) {
final String QUIT = "quit";
final String DEFAULT_SERVER_HOST = "127.0.0.1";
final int DEFAULT_SERVER_PORT = 8888;
Socket socket = null;
BufferedWriter bufferedWriter = null;
try{
// 创建socket
socket = new Socket(DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT);
//创建IO流
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(socket.getInputStream())
);
bufferedWriter = new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())
);
//等待用户输入信息
BufferedReader consolReader = new BufferedReader(
new InputStreamReader(System.in)
);
while (true) {
String input = consolReader.readLine();
//发送消息给服务器
bufferedWriter.write(input + "\n");
bufferedWriter.flush();
//读取服务器返回的消息
String msg = bufferedReader.readLine();
System.out.println(msg);
//查看用户是否退出
if(QUIT.equals(input))break;
}
}catch (IOException e){
e.printStackTrace();
}finally {
if(bufferedWriter != null){
try {
bufferedWriter.close();
System.out.println("关闭socket");
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3.3プログラムの効果スクリーンショット
クライアント:
ここに画像を挿入説明
サーバー:
絵の説明をここに挿入
非コバンコバン:その他の公共資源とチュートリアルの数に注意してください。
あなたは私にも私に賞賛を与えることができ、書き込みと思われる場合、あなたの励ましが私の仕事の原動力となって、ありがとうございました