⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mm7sender.java

📁 彩信发送源代码,实现mm7接口
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
														MMConstants.CONTENT_LENGTH);
												int conlen2 = baos.toString().indexOf("\r", conlen1);
												contlen3 = Integer.parseInt(baos.toString().substring(
														(conlen1 + MMConstants.CONTENT_LENGTH.length() + 1), conlen2)
														.trim());
												httpseper = baos.toString().indexOf("\r\n\r\n");
												if (httpCode.equals("200")) {
													// 还要再加判断客户端是否是长连接
													ResendCount = 0;
													excuteFlag = true;
													if (ConnectionFlag.trim().toLowerCase().equals("keep-alive")) {
														pool.setNonceCount(Integer.toString(Integer.parseInt(pool
																.getNonceCount(), 8) + 1));
														connWrap.setDigestInfor(setDigestAuth(authInfor));
														continue;
													}
												}
											}
											// 开始接收http体
											if (totalresline == httpseper + contlen3 + 4) {
												/*
												 * if(this.TimeOutFlag==true){
												 * SevereBuffer.append("baos.tostring()=="+baos.toString()); }
												 */
												if (pool.getKeepAlive().equals("off")) {
													sender.close();
													receiver.close();
													client.close();
												}
												else {
													connWrap.setUserfulFlag(true);
													connWrap.setFree(true);
												}
												flag = true;
												bReceive = true;
												break;
											}
										}
									}
									else if (baos.toString().indexOf("Basic") != -1) {
										if (log.isDebugEnabled())
											log.debug("进行了Basic加密,对其进行解析");
										if (ResendCount < mm7Config.getReSendCount()) {
											ResendCount = ResendCount + 1;
											receiveMessge();
										}
										else {
											bReceive = false;
											break;
										}
									}
								}
								else {
									bReceive = false;
									break;
								}
							}
							else {
								int index1 = baos.toString().toLowerCase().indexOf(MMConstants.CONTENT_LENGTH);
								int index2 = baos.toString().indexOf("\r", index1);
								int contlength = 0;
								if (index1 == -1 || index2 == -1) {
									if (log.isDebugEnabled())
										log.debug("index1=" + index1 + ",index2=" + index2 + ",这个应该不会出现!!!");
									int encodingindex = baos.toString().toLowerCase().indexOf("transfer-encoding:");
									if (log.isDebugEnabled())
										log.debug("encodingindex=" + encodingindex);
									if (encodingindex >= 0) {
										int encodingend = baos.toString().indexOf("\r\n", encodingindex);
										if (encodingend >= 0) {
											String strenc = baos.toString().substring(
													encodingindex + "transfer-encoding:".length(), encodingend).trim();
											if (strenc.equalsIgnoreCase("chunked")) {
												// //在这里可以增加chunked的处理

												int endencindex2 = baos.toString().indexOf("\r\n", encodingend + 1);
												if (endencindex2 >= 0) {
													int xmlbeg = baos.toString().indexOf(MMConstants.BEGINXMLFLAG,
															endencindex2 + 1);
													if (xmlbeg > 0) {
														String strTempContLen = baos.toString().substring(endencindex2,
																xmlbeg).trim();
														contlength = Integer.parseInt(strTempContLen, 16);
													}
												}
											}
											else {
												bReceive = false;
												break;
											}
										}
										else {
											bReceive = false;
											break;
										}
									}
									else {
										continue;
									}

									if (totalline >= httpsepindex + contlength + 8) {
										SevereBuffer.append("receive end");
										SevereBuffer.append("baos.toString()==" + baos.toString());
										if (pool.getKeepAlive().equals("off")) {
											sender.close();
											receiver.close();
											client.close();
										}
										else {
											connWrap.setUserfulFlag(true);
											connWrap.setFree(true);
										}
										bReceive = true;
										break;
									}

								}
								else {
									contlength = Integer.parseInt(baos.toString().substring(
											(index1 + MMConstants.CONTENT_LENGTH.length() + 1), index2).trim());
									if (log.isDebugEnabled())
										log.debug("收到的响应消息的长度为:" + contlength);
									// 开始接收http体
									if (totalline == httpsepindex + contlength + 4) {

										if (log.isDebugEnabled())
											log.debug("返回的响应消息正常接收结束!!!");
										// System.out.println("正常接收结束");
										// add by hudm to test 104 problem
										// 2004-06-09
										if (this.TimeOutFlag == true)
											SevereBuffer.append("baos.tostring()==" + baos.toString());
										// end add by hudm
										if (pool.getKeepAlive().equals("off")) {
											sender.close();
											receiver.close();
											client.close();
										}
										else {
											connWrap.setUserfulFlag(true);
											connWrap.setFree(true);
										}
										bReceive = true;
										break;
									}
								}
							}
						}
						else {
							bReceive = false;
							break;
						}

					}
				}
				else if (readlineOut == 1) {
					log.warn("第一次从流中读数据返回值为-1,返回false");
					//将这条链路从连接池中删除掉
					pool.deleteURL(this.TimeOutWrap);
					
					return false;
					// modified by liuhuafeng on 2006/7/26
					// 如果从流中读数据的返回值为-1,则返回false
					// System.out.println("第1083行。");
					// this.TimeOutFlag = true;
					// sendBaos = getSendMessage(this.TimeOutbCount);
					// if (sendBaos != null) {
					// // System.out.println("第1087行。");
					// res = SendandReceiveMessage(sendBaos);
					// if (res != null) {
					// this.TimeOutFlag = false;
					// return true;
					// }
					// }
					// else
					// return false;
				}else if(System.currentTimeMillis()-now>=5000){
					//将这条链路从连接池中删除掉
					pool.deleteURL(this.TimeOutWrap);
					log.warn("连续5秒读取数据的返回值为-1,返回false");
					return false;
				}
			}
			return bReceive;
		}
		catch (SocketTimeoutException ste) {
			log.error("读取返回消息超时:"+ste);
			//将这条链路从连接池中删除掉
			pool.deleteURL(this.TimeOutWrap);
			// System.out.println("第1100行。");
//			this.TimeOutFlag = true;
//			ReadTimeOutCount++;
//			if (ReadTimeOutCount < mm7Config.getReSendCount()) {
//				sendBaos = getSendMessage(this.TimeOutbCount);
//				if (sendBaos != null) {
//					res = SendandReceiveMessage(sendBaos);
//					if (res != null) {
//						this.TimeOutFlag = false;
//						return true;
//					}
//					/*
//					 * if (res.getStatusCode() ==
//					 * MMConstants.RequestStatus.SUCCESS) { this.TimeOutFlag =
//					 * false; return true; }
//					 */
//				}
//				else
//					return false;
//			}
//			this.TimeOutFlag = false;
			//modified by liuhuafeng on 2006/7/26,不考虑发送失败重发的情况
			res.setStatusCode(-101);
			res.setStatusText("超时发送失败!");
			SevereBuffer.append("[Comments={-101;" + res.getStatusText() + "}]");
			ReadTimeOutCount = 0;
			return false;
		}
	}

	/** 输入string,输出经过MD5编码的String */
	public String calcMD5(String str) {
		try {
			MessageDigest alga = MessageDigest.getInstance("MD5");
			alga.update(str.getBytes());
			byte[] digesta = alga.digest();
			return byte2hex(digesta);
		}
		catch (NoSuchAlgorithmException ex) {
//			System.out.println("出错了!!没有这种算法!");
			log.error("calcMD5():"+ex);
		}
		return "NULL";
	}

	// byte[]数组转成字符串
	public String byte2hex(byte[] b) {
		String hs = "";
		String stmp = "";
		for (int n = 0; n < b.length; n++) {
			stmp = (Integer.toHexString(b[n] & 0XFF));
			if (stmp.length() == 1)
				hs = hs + "0" + stmp;
			else
				hs = hs + stmp;
			if (n < b.length - 1)
				hs = hs + "";
		}
		return hs;
	}

	private String setDigestAuth(String authinfor) {
		String auth = authinfor + "\r\n";
		int equal = -1;
		int comma = -1;
		StringBuffer authBuffer = new StringBuffer();
		authBuffer.append("Authorization: Digest ");
		String qopValue;
		String MD5A2;
		String algValue;
		String cnonceValue = "";
		String ncValue;
		String responseValue;
		String uri = mm7Config.getMMSCURL();
		if (uri == null)
			uri = "";
		String username = mm7Config.getUserName();
		authBuffer.append("uri=\"" + uri + "\",");
		authBuffer.append("username=\"" + username + "\",");

		String passwd = mm7Config.getPassword();
		// 获得realm的值
		int realmindex = auth.indexOf(MMConstants.REALM);
		equal = auth.indexOf("=", realmindex + 1);
		comma = auth.indexOf("\"", equal + 2);
		String realmValue = auth.substring(equal + 1, comma);
		if (realmValue.startsWith("\""))
			realmValue = realmValue.substring(1, realmValue.length());
		authBuffer.append("realm=\"" + realmValue + "\",");
		String MD5A1;
		// 取得nonce的值
		int nonceindex = auth.indexOf(MMConstants.NONCE);
		equal = auth.indexOf("=", nonceindex + 1);
		comma = auth.indexOf("\"", equal + 2);
		String nonceValue = auth.substring(equal + 1, comma);
		if (nonceValue.startsWith("\""))
			nonceValue = nonceValue.substring(1, nonceValue.length());
		authBuffer.append("nonce=\"" + nonceValue + "\",");
		// 判断有没有opaque,若有,则原封不动地返回给服务器
		int opaqueindex = auth.indexOf(MMConstants.OPAQUE);
		if (opaqueindex > 0) {
			equal = auth.indexOf("=", opaqueindex + 1);
			comma = auth.indexOf("\"", equal + 2);
			authBuffer.append("opaque=" + auth.substring(equal + 1, comma + 1));
		}
		// 取得algorithm的值
		int algindex = auth.indexOf(MMConstants.ALGORITHM);
		if (algindex > 0) {
			equal = auth.indexOf("=", algindex);
			comma = auth.indexOf(",", equal + 2);
			if (comma >= 0) {
				algValue = auth.substring(equal + 1, comma);
				if (algValue.startsWith("\""))
					algValue = algValue.substring(1, algValue.length() - 1);
			}
			else {
				comma = auth.indexOf("/r", equal);
				algValue = auth.substring(equal + 1, comma);
				if (algValue.startsWith("\""))
					algValue = algValue.substring(1, algValue.length());
			}
		}
		else {
			algValue = "MD5";
		}
		// 取得qop的值
		int qopindex = auth.indexOf(MMConstants.QOP);
		if (algValue.equals("MD5") || algValue.equals("MD5-sess")) {
			MD5A1 = calcMD5(username + ":" + realmValue + ":" + passwd);
			// 服务器存在qop这个字段
			if (qopindex > 0) {
				equal = auth.indexOf("=", qopindex);
				comma = auth.indexOf("\"", equal + 2);
				qopValue = auth.substring(equal + 1, comma);
				if (qopValue.startsWith("\""))
					qopValue = qopValue.substring(1, qopValue.length());
				/**
				 * 表明服务器给出了两种qop,为auth和auth-int, 这是应该是客户端自己选择采用哪种方式进行鉴权
				 */
				if (qopValue.indexOf(",") > 0) {
					if (mm7Config.getDigest().equals("auth-int")) {
						MD5A2 = calcMD5("POST" + ":" + uri + ":" + calcMD5(entityBody.toString()));
					}
					else {
						MD5A2 = calcMD5("POST" + ":" + uri);
					}
					ncValue = String.valueOf(pool.getNonceCount());
					cnonceValue = getBASE64(ncValue);
					responseValue = calcMD5(MD5A1 + ":" + nonceValue + ":" + ncValue + ":" + cnonceValue + ":"
							+ qopValue + ":" + MD5A2);
					authBuffer.append("qop=\"" + mm7Config.getDigest() + "\",");
					authBuffer.append("nc=" + ncValue + ",");
					authBuffer.append("cnonce=\"" + cnonceValue + "\",");
					authBuffer.append("response=\"" + responseValue + "\",");
				}
				// 服务器端只有一种qop方式。
				else {
					if (qopValue.equals("auth-int")) {
						MD5A2 = calcMD5("POST" + ":" + uri + ":" + calcMD5(entityBody.toString()));
					}
					else
						MD5A2 = calcMD5("POST" + ":" + uri);
					ncValue = String.valueOf(pool.getNonceCount());
					cnonceValue = getBASE64(ncValue);
					responseValue = calcMD5(MD5A1 + ":" + nonceValue + ":" + ncValue + ":" + cnonceValue + ":"
							+ qopValue + ":" + MD5A2);
					authBuffer.append("qop=\"" + qopValue + "\",");
					authBuffer.append("nc=" + ncValue + ",");
					authBuffer.append("cnonce=\"" + cnonceValue + "\",");
					authBuffer.append("response=\"" + responseValue + "\",");
				}
			}
			// 服务器端不存在对qop的方式的选择
			else {
				MD5A2 = calcMD5("POST" + ":" + uri);
				responseValue = calcMD5(MD5A1 + ":" + nonceValue + ":" + MD5A2);
				authBuffer.append("response=\"" + responseValue + "\",");
			}
		}
		// 去掉最后一个逗号
		int lastcommaindex = authBuffer.lastIndexOf(",");
		authBuffer.delete(lastcommaindex, lastcommaindex + 1);
		authBuffer.append("\r\n");
		return authBuffer.toString();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -