会员可以在此提问,百战程序员老师有问必答
对大家有帮助的问答会被标记为“推荐”
看完课程过来浏览一下别人提的问题,会帮你学得更全面
截止目前,同学们一共提了 132838个问题
JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 2492楼

相关代码:Request类

package com.bjsxt.server;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Request {//请求
	private InputStream is;//输入流
	private String requestInfo;//请求字符串,请求方式,请求路径,参数,协议,协议版本,请求正文
	private String method;//请求方式
	private String url;//请求的url
	//输入框name为key,值为value
	/**
	 * key:username value:bjsxt
	 * key:pwd		value:123
	 * key:hobby 	value:    read,ball
	 */
	private Map<String,List<String>> parametermapValues;//参数 
	private static final String CRLF="\r\n";//换行
	private static final String BLANK=" ";//空格
	//构造方法,初始化属性
	public Request() {
		parametermapValues=new HashMap<String,List<String>>();
		method="";
		url="";
		requestInfo="";
	}
	public Request(InputStream is) {
		this();
		this.is=is;
		try {
			byte[]buf=new byte[20480];
			int len=this.is.read(buf);
			requestInfo=new String(buf,0,len);
		} catch (IOException e) {
			return;
		}	
		this.parseRequestInfo();
	}//分解请求信息的方法
	/**请求方式
	 * 请求路径
	 * 请求参数
	 * 
	 */
	private void parseRequestInfo() {
		String paraString="";//用于存储请求参数
		//获取请求参数的第一行
		String firstLine = requestInfo.substring(0, requestInfo.indexOf(CRLF)).trim();
		//分解出请求方式
		int index = firstLine.indexOf("/");
		this.method=firstLine.substring(0, index).trim();
		//分解url,可能包含参数(get),也可能不包含参数(post)
		String urlString = firstLine.substring(index,firstLine.indexOf("HTTP/") ).trim();
		if ("get".equalsIgnoreCase(this.method)) {
			if (urlString.contains("?")) {
				String[] urlArray=urlString.split("\\?");
				this.url=urlArray[0];
				paraString=urlArray[1];
				
			}else {
				this.url=urlString;
			}
		}else {//不包含请求参数
			this.url=urlString;
			paraString=requestInfo.substring(requestInfo.lastIndexOf(CRLF)).trim();						
		}
		if (paraString.equals("")) {
			return;
		}
		//请求参数
		System.out.println(paraString);
	}//用于测试
	public void show() {
		System.out.println(this.url);
		System.out.println(this.method);
	}
}


Server类

package com.bjsxt.server;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {//服务器,用于启动和停止服务
	private ServerSocket server;
	public static void main(String[] args) {
		Server server=new Server();
		server.start();
	}
	public void start() {
		this.start(8888);
	}
	public void start(int port) {
		try {
			server=new ServerSocket(port);
			this.receive();//请求接收信息的方法
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	private void receive() {
		//监听
		try {
			Socket client=server.accept();
			//获取用户请求
			/*InputStream is=client.getInputStream();
			byte[] buf=new byte[20480];
			int len=is.read(buf);			
			System.out.println(new String(buf,0,len));*/
			//封装请求信息
			Request req=new Request(client.getInputStream());
			req.show();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}


JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 2495楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 2496楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2498楼

一、问题:判断一个字符串的对称性。

老师,为啥我输出的会是false,感觉逻辑没有问题,而且代码跟老师讲课一样,但为什么输出的不是true。

二、代码

package com.bjsxt;

import java.util.Stack;

public class StackTest {
    public static void main(String[] args) {
        System.out.println("-------判断字符串的对称性---------");
        StackTest stackTest = new StackTest();
        stackTest.symmetry();
    }
    //判断字符串的对成型
    public void symmetry(){
        String str="...{.....[....(....)...]....}..(....)..[...]...";
        Stack<String> stack = new Stack<>();
        boolean flag = true;//假设是匹配的
        for (int i=0;i<str.length();i++){
            char c = str.charAt(i); //拆分字符,把字符拿出来
            if (c=='{'){
                stack.push("}");
            }
            if (c=='['){
                stack.push("]");
            }
            if (c=='('){
                stack.push(")");
            }
            if (c == ')'|| c == ']'|| c == '}'){
                //修正处理
                if (stack.empty()){
                    flag = false;
                    break;
                }
                String x = stack.pop();
                //修正处理
                if (x.charAt(0) != c){
                    flag = false;
                    break;
                }
            }
        }
        if (!stack.empty()){
            flag = false;
        }
        System.out.println(flag);
    }
}

三、运行效果图

图片.png

JAVA 全系列/第二阶段:JAVA 基础深化和提高/容器(旧) 2499楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/数据结构 2500楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/多线程和并发编程(旧) 2502楼
JAVA 全系列/第二阶段:JAVA 基础深化和提高/手写服务器项目(旧) 2504楼

截屏2020-11-11 上午9.55.32.png


如上图:while循环里面是一直在创建线程吧,那为什么老师说每有一个客户端就创建一个线程

图2:

package chatGroup;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;

/**
 * 服务器路径线程
 */
public class MyChannel implements Runnable{
    private DataInputStream dis;
    private DataOutputStream dos;
    private boolean flag=true;

    public MyChannel(Socket socket) {
        try {
            dis=new DataInputStream(socket.getInputStream());
        } catch (IOException e) {
            flag=false;
            CloseUtil.close(dis);
        }
        try {
            dos=new DataOutputStream(socket.getOutputStream());
        } catch (IOException e) {
            flag=false;
            CloseUtil.close(dos);
        }
    }

    @Override
    public void run() {
        while (flag){
            //this.send(gain());
            sendOther();
        }
    }
    public String gain(){
        String str="";
        try {
            str=dis.readUTF();
        } catch (IOException e) {
            flag=false;
            CloseUtil.close(dis);
            MyServer.list.remove(this);
        }
        return str;
    }
    public void send(String str){
        if (str!=null&&str.length()!=0){
            try {
                dos.writeUTF(str);
                dos.flush();
            } catch (IOException e) {
                flag=false;
                CloseUtil.close(dos);
                MyServer.list.remove(this);
            }
        }
    }
    public void sendOther(){
        String str=this.gain();
        List<MyChannel> list=MyServer.list;
        for (MyChannel other:list){
            if (other==this){
                continue;
            }
            other.send(str);
        }
    }
}

图2中:Myserver.list.remove(this),将元素从容器中移除,这里的元素就是客户端,如果客户端发送的流出了异常,接收流没有出异常,就删除该客户端吗,就是说接收和发送只要一个有异常就移除这个客户端吗?


JAVA 全系列/第二阶段:JAVA 基础深化和提高/网络编程(旧) 2505楼

课程分类

百战程序员微信公众号

百战程序员微信小程序

©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园
网站维护:百战汇智(北京)科技有限公司
京公网安备 11011402011233号    京ICP备18060230号-3    营业执照    经营许可证:京B2-20212637