『並列と分布式計算』実験5——Java socketプログラミング

10906 ワード

一、実験目的と要求
実験目的:接続向けJavaSocketプログラムの作成を熟知する.
実験要求:グループ単位で完成し、1つのグループは2人で構成されている.グループ単位で提出し、完了した実験報告書にグループメンバーをリストしてください.
二、実験内容
1.Java Socketプログラムを作成し、Client/Serverベースの問答プログラムを作成し、サーバー側がメッセージを発行し、クライアントがメッセージを受信する.各クライアントは接続した後、サーバー側から歓迎メッセージを送信します.********(IPアドレスを表示)からの友人を歓迎します.サーバー側は同時に複数のクライアントに接続できます.(30分)
サーバでサーバSocketオブジェクトを宣言し、クライアントでSocketオブジェクトを宣言し、Java Socketを使用してサーバとクライアント間の会話を実現します.
サーバ:
import java.io.*; 
import java.net.*; 
public class Server {
    public static void main(String[] args) {        
        ServerSocket s = null;
        try{
            s= new ServerSocket(6789);
        }
        catch(IOException e)
        {
            System.out.println(e);
            System.exit(1);
        }
        while(true) {  //                    
            try{
                Socket cs = s.accept();
                new ServerWriter(cs).start(); //              
            }
            catch(IOException e)
            {
                System.out.println(e);
            }
        }
    }
    static class ServerWriter extends Thread {
        Socket sock;
        public ServerWriter(Socket s) {
            sock = s;
        }
        public  void run() {
            try {
            	DataOutputStream dos = new DataOutputStream(sock.getOutputStream());  
                //  accept        ip  
                dos.writeUTF("    " + sock.getInetAddress().getHostAddress() + "   " + '
'); dos.close(); } catch (IOException e) { System.out.println(e); } } } }
クライアント
import java.io.*; 
import java.net.*; 

public class Client {
    public static void main(String[] args) throws
    	UnknownHostException {
			 try { 
			     Socket s = new Socket(InetAddress.getLocalHost(), 6789);      
			     DataInputStream dis = new DataInputStream(s.getInputStream());
			     System.out.println(dis.readUTF()); //        
			     s.close(); 
			 }
			 catch (IOException e) {
			     System.out.println(e);
			 } 
    	}
}

2.プログラムを作成し、お客様がサーバーに接続した後、セルフ心理テストを行い、テストを完了した後、テスト結果を表示します.試験問題と結果は「心理素質試験と答え分析」文書に示す.(30分)
ここで私は「心理素質テストと答え分析」の書類を整理してquesに分けた.txtとans.txtの2つの部分、ques.txtには問題が格納され、各問題が必ず4行を占めるように調整され、ans.txtには処理された答えが格納されます.サーバ:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
	static int qNum = 70;  //    
	public static void  main(String[] args) { 
        ServerSocket server;
		try {
			server = new ServerSocket(2022);
			Socket sk = server.accept();
			System.out.println("       !");
			DataInputStream dis = new  DataInputStream(sk.getInputStream());
			DataOutputStream dos = new DataOutputStream( sk.getOutputStream());
			try {
		        BufferedReader reader = new BufferedReader(new FileReader("ques.txt"));
	            String tempString = null;
	            for(int j = 1;j<=qNum*4;j++)
	            {
	            	tempString = reader.readLine();
                	dos.writeUTF(tempString);
	            }
	            reader.close();
	        } 
	        catch (IOException e1) {
	            e1.printStackTrace();
	        } 
			String str;
			int ans = 0;
			try {
				BufferedReader re = new BufferedReader(new FileReader("ans.txt"));
	            String tempString = null;
	            for(int i = 1;i<= qNum;i++){  
					str = dis.readUTF();
					tempString = re.readLine();
					ans += judge(str,tempString);
					System.out.println("     " + i + "        :" + judge(str,tempString));
				}
	            String strans = Integer.toString(ans);
	            dos.writeUTF(strans);
	            re.close();
	        } 
	        catch (IOException e) {
	            e.printStackTrace();
	        } 
		}
		catch (IOException e) {
			System.out.println(e);
		}
    }
	public static int judge(String s, String t){//    
		int idx = t.indexOf(s);
		char[] T = t.toCharArray();
		return T[idx+1] - '0';
	}
}

クライアント:
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class Client {
	static int qNum = 70; //    
    public static void main(String[] args) {
        Socket client;
        try {
            client = new Socket("127.0.0.1", 2022);
            DataInputStream dis = new DataInputStream(client.getInputStream());
            DataOutputStream dos = new DataOutputStream(client.getOutputStream());
            System.out.println("       :" + qNum + ".   (        )" + '
'); for(int j = 1;j<=qNum;j++){ for(int i = 1;i<=4;i++) // 4 System.out.println(dis.readUTF()); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); dos.writeUTF(str); } String strans = dis.readUTF(); System.out.println(" : " + strans); int ans = Integer.parseInt(strans); if(ans > 180) System.out.println(" , , "); else if(ans > 150) System.out.println(" , , , "); else if(ans > 130) System.out.println(" , , , "); else if(ans > 100) System.out.println(" , , , , "); else System.out.println(" , , , "); } catch (IOException e) { System.out.println(e); } } }

ans.txt(部分):01 A 2 B 3 C 102 A 1 B 1 C 3 03 A 1 B 2 C 3 04 A 1 B 2 C 3 05 A 3 B 2 C 106 A 1 B 2 C 3 07 A 2 B 1 C 3 08 A 1 B 2 C 3 09 A 3 B 1 C 10 A 1 B 2 C 3
ques.txt(部分):
1.もしあなたの上司がせっかちで、部下を批判して容赦しないで、みんなの気持ちはいつも影响を受けて、部下として、あなたはどのように処理しますか?()A.直接上司に话し、リーダーシップを変えることを提案するB.プライベートでリーダーシップを探してコミュニケーションし、婉曲に自分の态度に注意するように頼むC.他の同僚と一绪に相谈し、连名でリーダーシップを変えることを提案する2.公務員面接で採用されなかったらどう思いますか?()A.とてもがっかりして、自分が全力を尽くしていないと思っていますB.大したことはありません.ここに私を残さないで、自分で私を残していますC.これは自分の貴重な経験で、今度また努力します.もしあなたの直接指導者が公金を私用する可能性があることに気づいたら、あなたはどうしますか?()A.直接上司に反映して、決して汚職官吏B.を見逃してはいけない.1部の機密文書が紛失して、ある日またあなたの引き出しの中に現れて、あなたは()A.を聞いて、どうせすでに帰ってきて、何もありませんB.私的に人に調査を手伝ってもらって、本当の原因C.を見つけて直接指導者に報告して、そして自分の過失を検討します.駅のような騒がしい環境の中で、退屈な論文をあげれば、あなたは()します.A.まじめに読んで、その意味を理解できるB.よく読んでいるが、いつも左右を見ているC.集中できないので、論文の内容が分からない
3.Java Socket方式でClient/Serverベースのファイル転送プログラムを実現する.クライアントとサーバ側のプログラムを別々に実装する必要があります.(40点)
クライアント:接続向けに通信を実現します.Socketクラスオブジェクトを使用して、サーバから送信されたファイルを受信し、特定の場所に保存します.
サーバ側:お客様の要求をリスニングし、ディスクファイルを読み取り、クライアントにファイルを送信します.注意:ファイルの読み書き操作を実現する必要があります.サーバ:
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class Server extends ServerSocket{
    private ServerSocket server;
    private Socket ser;
    private FileInputStream fis;
    private DataOutputStream dos;  
    public Server()throws Exception{
        try {
        	try{
	            server =new ServerSocket(2016);  
	            while(true){
	            	System.out.println("----          ----");
	            	ser = server.accept();
                    System.out.println("----       ----");  
		            System.out.println("----             ----");
		            BufferedReader strin = new BufferedReader(new InputStreamReader(System.in)); 
		            String fileName = strin.readLine();
		            File file =new File(fileName);
		            fis =new FileInputStream(file);
		            dos =new DataOutputStream(ser.getOutputStream());
		            dos.writeUTF(file.getName());
		            dos.flush();
		            dos.writeLong(file.length());
		            dos.flush();
		            //    
		            byte[] sendBytes =new byte[1024];
		            int length =0;
		            while((length = fis.read(sendBytes,0, sendBytes.length)) >0){
		                dos.write(sendBytes,0, length);
		                dos.flush();
		            }
		            System.out.println("----  ----        ");
	            }
	        }
        	catch (Exception e) {
	            e.printStackTrace();
	        }
        	finally{
	            if(fis !=null)
	                fis.close();
	            if(dos !=null)
	                dos.close();
	            ser.close();
	        }
        }
    	catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args)throws Exception {
        new Server();
    }
}
クライアント:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.Socket;
public class Client extends Socket{
    private Socket client;
    private DataInputStream dis;
    private FileOutputStream fos;
    private int s=0;  
    public Client(){
        try {
            try {
                client =new Socket("127.0.0.1", 2016);
                System.out.println("----    ----");  
                dis =new DataInputStream(client.getInputStream());
                String fileName = dis.readUTF();
                long fileLength = dis.readLong();
                fos =new FileOutputStream(new File("F:/" + fileName));  
                byte[] sendBytes =new byte[1024];
                int transLen =0;
                System.out.println("----      ,     ----");
                while(true){
                    int read =0;
                    read = dis.read(sendBytes);
                    if(read < 1024)
                        break;
                    transLen += read; 
                    if(s==0)
                    	System.out.println("      " +100 * transLen/fileLength +"%...");
                    s=(s+1)%100;
                    fos.write(sendBytes,0, read);
                    fos.flush();
                }
                System.out.println("----      -------");
                client.close();
	        }catch (Exception e) {
	            e.printStackTrace();
	        }finally {
	            if(dis !=null)
	                dis.close();
	            if(fos !=null)
	                fos.close();
	            client.close();
	        }
	    }catch (Exception e) {
	        e.printStackTrace();
	    }

    }
      
    public static void main(String[] args)throws Exception {
        new Client();
    }
}