第四次过程性考核

码云地址:https://gitee.com/changchundehui/16012008_li_xue_examination_iv

使用套接写连接编写一个简单的聊天室程序,客户端主函数放在Client_Main.java文件中,服务器端主函数放在Server_Main.java文件中 

要求: 

1.客户端从控制台进行输入,并将客户端的输出内容和时间保存到“学号.txt”文件中

2.服务器端读取到客户端的程序后,给客户端以回应,并将客户端的输入内容与服务端的输出内容、时间保存到文本文件中

3.要求服务器端可以实现同时与多个客户端进行通信,与每一个客户端通信的内容,保存为一个“学号_ip.txt”的文件

4..提交文件结果包括:代码,通信后生成的txt文件 

一.设计思路:使用多线程技术和套接字写一个聊天室程序,客户可以输入圆的半径并发送给服务器,服务器把计算出的圆的面积返回给客户。因此可以将计算量大的工作放在服务器端,客户端负责计算量小的工作,实现客户---服务器的交互计算,来完成任务。

二.运用到的知识点:使用多线程,使用Socket类的构造方法Socket()创建一个套接字对象,使用connect方法,可以使用SocketAddress 的子类InetSocketAddress 创建一个对象,InetSocketAddress 的构造方法是public InetSocket Address(InetAddress addr,int    port)。

Client.java

import java.io.*;
import java.net.*;
import java.util.*;
public class Client_Main{
    public static void main(String args[]){
        Scanner scanner =new Scanner(System.in);
        Socket mysocket=null;
        DataInputStream in =null;
        DataOutputStream out=null;
        Thread readData;
        Read read =null;
        try{mysocket =new Socket();
        read =new Read();
        readData =new Thread(read);//负责读取信息的线程
        System.out.print("输入服务器的IP:");
        String IP =scanner.nextLine();
        System.out.print("输入服务器的IP:");
        int port =scanner.nextInt();
        if(mysocket.isConnected()){}
        else{
            InetAddress address =InetAddress.getByName(IP);
            InetSocketAddress socketAddress =new InetSocketAddress
            (address,port);
            mysocket.connect(socketAddress);
            in=new DataInputStream(mysocket.getInputStream());
            out =new  DataOutputStream(mysocket.getOutputStream());
            read.setDataInputStream(in);
            readData.start();//启动负责读取信息的线程
        }
        }
        catch(Exception e){
            System.out.println("服务器已断开"+e);
        }
        System.out.print("输入圆的半径(放弃请输入N):");
        while(scanner.hasNext()){
            double radius=0;
            try{
                radius =scanner.nextDouble();
            }
            catch(InputMismatchException exp){
                System.exit(0);
            }
            try{
                out.writeDouble(radius);//向服务器发送信息
            }
            catch(Exception e){}
        }
    }
}

 Read.java

import java.io.*;
public class Read implements Runnable{
	DataInputStream in;
	public void setDataInputStream(DataInputStream in){
		this.in=in;
	}
	public void run(){
		double result =0;
		while(true){
			try{
				result =in.readDouble();//读取服务器发送来的信息
				System.out.println("圆的面积:"+result);
				System.out.print("输入圆的半径(放弃请输入N):");
			}
			catch(IOException e){
				System.out.println(“与服务器已断开"+e);
				break;
			}
		}
	}
}

  

Server_Main.java

import java.io.*;
import java.net.*;
import java.util.*;
public class Server_Main{
	public static void main(String args[]){
		ServerSocket server =null;
		ServerThread thread;
		Socket you =null;
		while(true){
			try{server =new ServerSocket(2010);
			}
			catch(IOException el){
				System.out.println("正在监听");//ServerSocket  对象不能重复创建
			}
			try{System.out.println("等待客户呼叫:");
			you =server.accept();
			System.out.println("客户的地址:"+you.getInetAddress());
			}
			catch(IOException e){
				System.out.println("正在等待客户");
			}
			if(you!=null){
				new ServerThread(you).start();//为每个客户启动一个专门的线程
			}
		}
	}
}
class ServerThread extends Thread{
	Socket socket;
	DataOutputStream out =null;
	DataInputStream in =null;
	String s =null;
	ServerThread(Socket t){
		socket =t;
		try{
			out =new DataOutputStream(socket.getOutputStream());
			in =new DataInputStream(socket.getInputStream());
			
		}
		catch(IOException e){}
	}
		public void run(){
			while(true){
				try{double r=in.readDouble();//阻塞状态,除非读取到信息
				double area =Math.PI*r*r;
				out.writeDouble(area);
				}
				catch(IOException e){
					System.out.println("客户离开");
					return;
				}
			}
		}
	}
	
			
				

运行结果:

总结:这一学期的java 课程即将结束了,因为掌握的代码量太少,知识点掌握的不好,所以在编写程序的过程中没有思路,不知道该从哪开始写,第四次的考核代码也是看书上的,在运行结果的时候也不对。

博客字数 238
代码字数 120
   

课堂练习码云地址:https://gitee.com/changchundehui/16012008-

 

你可能感兴趣的:(第四次过程性考核)