码云地址: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-