Java语言考题试题,请大家帮我做做。高分160分!主要用到多线程 字符串拆分 IO流,这个题目我没有做出来
需求:
1.请使用简单通熟易懂的语句,别使用高深语句。
2.用面向对象的思想语句,就是class类下面最开始写所有要用的private的成员变量的引用;然后如果需要写一个构造器。然后在再一个方法内写主题语言。最后mian函数实例化调取这个方法。
编程题目:
假设有客户端向服务器发送格式相同的请求,客户端的字符串格式如下: GET/ ? user=Clientl&name=xxx&pwd=xxx HTTP/1.1
不同客户端发送的字符串中的user参数有可能不同,例如:
第一个客户端发送为
GET/ ?user=Clientl1&name=xxx&pwd=xxx HTTP/1.1
第二个客户端发送为
GET/ ?user=Clientl2&name=xxx&pwd=xxx HTTP/1.1
等等
~~
字符串中xxx随意设置,并不重要。
实现该服务器。
要求:服务器在接受到客户端发送上来的字符串后都做以下操作
以user的值作为propertie属性文件的名称;然后,把name和pwd作为属性文件的记录保存。
比如:客户端发送的字符串为:
GET/ ?user=Clientl1&name=xxx&pwd=xxx HTTP/1.1,则服务器需要创建属性文件Clientl1.properties。该文件内容如下
name=zhangsan
pwd=123456 展开
主体由两个类来完成,一个服务器类,监听连接,并将来自客户端的连接加到一个队列中
另一个是处理线程类,从队列中获取到连接,并从连接中读取数据写文件,然后响应客户端
服务器类
package tt;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class SimpleHttpServer {
//监听的服务器
private ServerSocket soc;
//监听的端口
private int port;
//待处理队列
private BlockingQueue<Socket> queue;
//创建服务器
public SimpleHttpServer(int port){
this.port = port;
this.queue = new ArrayBlockingQueue<Socket>(200);
}
//启动服务器
public void startServer() throws Exception{
this.soc = new ServerSocket(port);
System.out.println("服务器启动,监听" + this.port + "端口");
//启动处理线程
DealThread thread = new DealThread(this.queue);
thread.start();
//开始获取来自客户端的连接,将接收到的连接加入到队列中,供处理线程处理
while(true){
//接受到新的连接
Socket clientSocket = this.soc.accept();
//加入到队列中
queue.put(clientSocket);
}
}
public static void main(String[] args) throws Exception{
SimpleHttpServer sh = new SimpleHttpServer(80);
sh.startServer();
}
}
处理线程类
package tt;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.BlockingQueue;
public class DealThread extends Thread{
private BlockingQueue<Socket> queue;
public DealThread(BlockingQueue<Socket> queue){
super();
this.queue = queue;
}
public void run(){
while(true){
Socket clientSocket = null;
BufferedReader br = null;
Map<String,String> paramMap = new HashMap<String,String>(); //用来保存上传参数的map,键名为参数名,键值为参数值,例如user=Clientl1,将保存为user键名,Clientl1为键值
try{
//从队列中获取到新的连接
clientSocket = queue.take();
//从连接中读取数据
br = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String input = br.readLine(); //读取客户端的输入,按题目要求,应为: GET/ ?user=Clientl1&name=xxx&pwd=xxx HTTP/1.1
String[] inputArray = input.split(" "); //使用空格将字符串转为数组,第一项为GET/ 第二项为?user=Clientl1&name=xxx&pwd=xxx,第三项为HTTP/1.1
String str = inputArray[1]; //str即为 ?user=Clientl1&name=xxx&pwd=xxx
//去掉问号,即去掉首字母
str = str.substring(1);
//用“&”分隔符,再次将字符串转为数组,转化的结果为 user=Clientl1,name=xxx,pwd=xxx
String[] strArray = str.split("&");
for(String s : strArray){
//等号前面的部份作为键名,等号后面的部份作为键值 如user=Clientl1则user为键名,Clientl1为键值
paramMap.put(s.substring(0,s.indexOf("=")), s.substring(s.indexOf("=") + 1));
}
String user = paramMap.get("user");
String name = paramMap.get("name");
String pwd = paramMap.get("pwd");
//user或name或pwd任一项为空,则响应“报文格式不正确”给客户端
if(user == null || name == null || pwd ==null){
//响应客户端
clientSocket.getOutputStream().write("报文格式不正确".getBytes());
clientSocket.getOutputStream().flush();
}
else
{
//写perperties文件
Properties prop = new Properties();
prop.setProperty("name", name);
prop.setProperty("pwd", pwd);
//创建文件
File file = new File("D:\\" + user + ".perperties");
prop.store(new FileOutputStream(file), null);
//响应客户端
clientSocket.getOutputStream().write("处理成功".getBytes());
clientSocket.getOutputStream().flush();
}
}catch(Exception e)
{
e.printStackTrace();
}finally{
//关闭资源
try{
if(br != null)
br.close();
if(clientSocket != null)
clientSocket.close();
}catch(Exception e)
{
e.printStackTrace();
}
}
}
}
}
你先帮我写一下那个客户端类吧~谢谢你了~肯定采纳你的。我还提一个类似的考题问题,而且这个问题稍微还有一点难,还两个一样的问题,一共600分,你能有时间再帮我做做吗。三个问题一起采纳谢谢了。 因为小弟我的差所以,希望你们帮我写一下。知道网址我给你私信了。
package com.lonwin.fcos;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String s = " GET/ ?user=Clientl1&name=xxx&pwd=xxx HTTP/1.1";
String fileName = s.split("&")[0].split("user=")[1];
String name = s.split("&")[1].split("name=")[1];
String pwd = s.split("&")[2].split("pwd=")[1].split(" ")[0];
Properties prop = new Properties();
prop.put("name", name);
prop.put("pwd", pwd);
try {
FileOutputStream out;
out = new FileOutputStream("C:\\" + fileName + ".properties");
//为properties添加注释
prop.store(out, "注释");
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
面向对象的思想你自己做吧
这段代码写的比较潦草,尤其是处理字符串那
我就是给你个大概的思路,具体的你自己想想写吧, 很简单
麻烦你帮我写一下吧,我实在不会了。很恼火,头很昏 分加到200分了! 好像客户端提示输入姓名 和密码 然后 服务器端响应并返回题目的需求样。