Java Socketの最初の通信プログラムの具体的な実現とよくある問題の分析

5566 ワード

サーバクラスの構築
        サーバの構築には、次の3つのステップがあります.
                a:サーバソケットを作成し、ポート番号を指定します.次のようになります.
                     ServerSocket server=new ServerSocket(8888)。
                                 ここでの構造方法のパラメータはint port,ポート番号である.ここでは、前のポートが特定のアプリケーションによって占有されているため、ここでport<1023を強制すると、予知できないエラーが発生する可能性があります(port>1023).
               b:クライアントのインスタンスsocketを作成してサーバに接続します.次のようになります.
                    Socket client=server.accept()。
この文は、サーバサーバサーバがクライアントに接続されないまでブロックされます.インスタンスが取得されると、プログラムは下に実行されます.
               c:接続後にインスタンス化されたclientオブジェクトに対して情報交流操作を行う.
                        ①入力フローを取得します.        
            BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
                       ②入力フローを操作し、クライアントの情報を取得する:
                //get input stream
		BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
		
		String infoFromClient=null;
		while((infoFromClient=in.readLine())!=null){
			System.out.println("Server get InfoFromClient:"+infoFromClient);//print the information from client
		}
		client.shutdownInput();//close input stream !Important
                      
特に注意:ここで入力ストリームの情報を使用した後、入力ストリームを閉じる必要があります.そうでないと、出力ストリームの情報交換に影響します.
                      ③出力ストリームを取得する.
                //get output stream
		PrintWriter writer=new PrintWriter(client.getOutputStream())

                      ④出力ストリームを操作し、クライアントにメッセージを伝達する:
		writer.println("hello,Client.I am server");
		writer.flush();
                      ⑤オープンリソース、入出力フロー、クライアントを閉じる
		writer.close();
		in.close();
		client.close();

クライアントクラスの構築
       クライアントクラスの構築の大部分はサーバ側と似ています.
                   ①サーバに接続するためのSocketを作成し、接続を要求します.(すなわちaccpet()メソッドによって検出される)
              Socket client=new Socket("localhost", 8888);//get connection to server;
                      
特に注意:ここlocalhostはあなたのサーバーがあるホスト名で、私のここのdemoは自分のパソコンにあるので、直接「localhost」(127.0.0.1)を使って、クライアントのポートとサーバー側が作成したポートが一致しなければ、接続できません.
                   ②接続が確立されると、入出力ストリームを取得できます.具体的な方法については、サーバ側の説明を参照してください.
demoソース
Client.java
package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/*
 *   Socket  ,                
 *      ,               
 *                
 *       
 * */
public class Client {

	public static void main(String[] args) throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
        Client client=new Client();
        client.onStart();
	}

	private void onStart() throws UnknownHostException, IOException {
		// TODO Auto-generated method stub
		Socket client=new Socket("localhost", 8888);//get connection to server;
		     System.out.println("****client connect to server****");
		//get output stream first !important
		PrintWriter out=new PrintWriter(client.getOutputStream());
		BufferedReader inconsole=new BufferedReader(new InputStreamReader(System.in));//input message from console
		     System.out.println("please input message to server:");
		String infoToServer=inconsole.readLine();
		while(infoToServer!=null){
		    out.write(infoToServer);
		    out.flush();
		    infoToServer=inconsole.readLine();
		   // break;
		}
		System.out.println("send successfully!");
		
		client.shutdownOutput();//close the outputStream
		
		//get input stream
		BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
		String infoFromServer=null;
		while((infoFromServer=in.readLine())!=null){
			System.out.println("Client get InfoFromServer:"+infoFromServer);
		}

		//close all
		inconsole.close();
		in.close();
		out.close();
	    client.close();
	}

}

Client.java
package socket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
/*
    
  a)、  ServerSocket        。
  b)、  accept()          。
  c)、     ,                   。
  d)、               。
  e)、      。
  author:zipple;2017-1-13
  bug:              
* */
public class Server {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
      Server server=new Server();
      server.onStart();
	}

	private void onStart() throws IOException {
		     System.out.println("*************loading****************");
		ServerSocket serverSocket=new ServerSocket(8888);//new a server
		     System.out.println("server started successfully,wait for client...");
		Socket client = serverSocket.accept();//get connection
		
		//get input stream
		BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream()));
		
		String infoFromClient=null;
		while((infoFromClient=in.readLine())!=null){
			System.out.println("Server get InfoFromClient:"+infoFromClient);//print the information from client
		}
		client.shutdownInput();//close input stream !Important
		
		
		//get output stream
		PrintWriter writer=new PrintWriter(client.getOutputStream());
		writer.println("hello,Client.I am server");
		writer.flush();
		
		writer.close();
		in.close();
		client.close();
	}

}