求Java Socket大神帮忙看一下小弟这里的Java Socket API的readStr()方法中的bug在哪里?

cj008CJCO008cj 2017-02-22 07:57:38
大神,您好:
小弟的代码现场如下图一:

求大神点拨:
图片中两行画红色方框的代码,会不会把通信发起端写过来的一行数据给阻塞了?正常情况下,通信发起方肯定发出的是一行写出数据,但是通信接收方却用两句阻塞读的语句来接收通信发起方的通信数据。这样的话,应该会造成通信接收方的“阻塞”状态持续,无法退出阻塞状态吧?
希望大神能够点拨: 小弟的Socket API中的bug,是否是小弟上面指出的问题?

附:(小弟的SocketClient类:一个Socket API的客户端API)
package test;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.HashMap;
import java.util.Map;

/**
* 剪切板工具类
*
* @author NeverChange
*
*/

public class SocketClient {

public Socket getS() {
return s;
}

public void setS(Socket s) {
this.s = s;
}

BufferedReader br = null;
private Socket s;
private InputStream in;
private Map<Socket, BufferedReader> rm = new HashMap<Socket, BufferedReader>();
private OutputStream out;
private BufferedReader inStr;
private PrintWriter outStr;
public String myObjIP = "";
private Map<Socket, PrintWriter> wm = new HashMap<Socket, PrintWriter>();
String MyKey = "CJCO5888CJCO";
PrintWriter pw = null;

public SocketClient(String ip, int port) {
try {
s = new Socket(ip, port);
if(port == 9911)//只要连接端口是9911的,我就在这停下,然后看代码的堆栈,就知道哪地方哥哥,堆栈怎么看,您能告诉弟吗?
{
}
in = s.getInputStream();
out = s.getOutputStream();
myObjIP = ip;
inStr = new BufferedReader(new InputStreamReader(in));
outStr = new PrintWriter(new OutputStreamWriter(out));
} catch (Exception e) {
e.printStackTrace();
}
}
public String readStr() throws IOException {
if (null == (br = rm.get(s))) {
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
rm.put(s, br);
}
String str0 = br.readLine();
str0 = Systemcrypt.Recovery(str0,"CJCO");
synchronized (this.in) {
String str = this.inStr.readLine();
return str;
}
}
public void writeStr(String str, String myThreadName, int myFuct,
Integer chatPartnerSerialMark) {
// TODO Auto-generated method stub
String myInfo = "str"+"丗"+myThreadName +"丗"+"1"+"丗"+chatPartnerSerialMark;
}

public void writeStr(String str, String myThreadName, String myFuct,
String chatPartnerSerialMark) {
// TODO Auto-generated method stub
String myInfo = "str"+"丗"+myThreadName +"丗"+"1"+"丗"+chatPartnerSerialMark;
}

public void write(Socket s, String content) throws IOException {
if (null == (pw = wm.get(s))) {
pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
wm.put(s, pw);
}
content = Systemcrypt.HloveyRC4(content, "CJCO");
pw.println(content);
pw.flush();
}

public void writeStr0(String myFuctnum,String myObjNum, String myThreadName) {
// TODO Auto-generated method stub
synchronized (this.out) {
String IP = GetMyUserIP.getMyIP();
String str = myFuctnum+"龖"+"a1"+"龖"+myObjNum+"龖"+"D"+"龖"+"Y"+"龖"+MyJButtonLogin.mySysUID+"丗"+MyJButtonLogin.mySysPWD+"丗"+"D"+"丗"+IP+"龖"+myThreadName;
outStr.println(str);
outStr.flush();
}
}

public void writeStr1(String myFuctnum,String myObjNum, String myThreadName,String mydportfuct,String mydportsubfuct,String mySocketData) {
// TODO Auto-generated method stub
synchronized (this.out) {
String IP = GetMyUserIP.getMyIP();
String content0 = "";
myThreadName = "";
String str = myFuctnum+"龖"+"a1"+"龖"+myObjNum+"龖"+"D"+"龖"+"D" +"龖"+mydportfuct+"丗"+mydportsubfuct+"丗"+"C"+"丗"+"a1"+"丗"+mySocketData+"丗"+"D"+"丗"+"BeiJing"+"丗"+IP+"丗"+myThreadName+"龖"+myThreadName;
outStr.println(str);
outStr.flush();
}
}

public void writeStr2(String myFuctnum,String myObjNum, String myThreadName,String mysportfuct,String mySocketData) {
// TODO Auto-generated method stub
synchronized (this.out) {
String IP = GetMyUserIP.getMyIP();
myThreadName = "";
String str = myFuctnum+"龖"+"a1"+"龖"+myObjNum+"龖"+"D"+"龖"+"S" +"龖"+mysportfuct+"丗"+mySocketData+"丗"+"D"+"丗"+"S"+"丗"+"a1"+"丗"+IP+"丗"+myThreadName+"丗"+1+"龖"+myThreadName;
outStr.println(str);
outStr.flush();
}
}

public void writeStr3(String myFuctnum,String myObjNum,String mycportfuct,String mySocketData,String myThreadName){
synchronized (this.out) {
String IP = GetMyUserIP.getMyIP();
InetAddress addr = null;
try {
addr = InetAddress.getLocalHost();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String ip=addr.getHostAddress().toString();
String AP = "a1"+"龖"+myObjNum+"龖"+"Y"+"龖"+"C"+"龖";
String CP = mycportfuct+"丗"+"9"+"丗"+mySocketData+"丗"+"Y"+"丗"+ip+"丗"+"SocketClient"+"龖"+myThreadName;
String str = myFuctnum + "龖" + AP +CP;
synchronized(s){
outStr.println(str);//因为println默认会在每行的后面加上/r/n,所以不需要再重复加了,避免不必要的影响
}
outStr.flush();
}}

public void writeStr4(String myFuctnum,String myObjNum, String myThreadName,String mydportfuct,String mydportsubfuct,String mySocketData) {
// TODO Auto-generated method stub
synchronized (this.out) {
String IP = GetMyUserIP.getMyIP();
myThreadName = "";
String str = myFuctnum+"龖"+mySocketData+"龖"+DRecv.myProjectVersion+"龖"+DRecv.MYPORTSYSNUM+"龖"+"D" +"龖"+mydportfuct+"丠"+
mydportsubfuct+"丠"+"Y"+"丠"+"a1"+"丠"+mySocketData+"丠"+""+"丠"+"小区D节点运营商所在营业地址"+"丠"+IP+"丠"+myThreadName+"龖"+myThreadName;
outStr.println(str);
outStr.flush();
}
}

public void ServerThread(Socket s){
try {
in = s.getInputStream();
out = s.getOutputStream();
inStr = new BufferedReader(new InputStreamReader(in));
outStr = new PrintWriter(new OutputStreamWriter(out));
} catch (Exception e) {
}
}

}

希望能够帮助我的大神,快快到来。
谢谢大神的过目!!
...全文
942 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
没看懂想问什么,能贴下异常信息吗?
cj008CJCO008cj 2017-02-23
  • 打赏
  • 举报
回复
引用
readLine 方法在读到换行符时才会返回,如果发送方没有发送换行符,方法会一直等待
尊敬的大侠,小灰狼哥,您好: 小弟的本楼的Socket API中的“SocketClient”,这个“客户端的”Socket写出类,您看过了,并且提出了“#1”的建议。 下面,弟为您呈上小弟的Socket API中的“SocketServer”,这个“服务端”的Socket接收类,相信您看过后,能够让您更加全面地掌握弟的本地的代码环境。 小弟的SocketServer类型源码如下:
package test;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.Map;

public class SocketServer {
	private ServerSocket ss = null;
	private Map<Socket, BufferedReader> rm = new HashMap<Socket, BufferedReader>();
	private Map<Socket, PrintWriter> wm = new HashMap<Socket, PrintWriter>();
	String MyKey = "CJCO5888CJCO";
	BufferedReader br = null;
	PrintWriter pw = null;

	public SocketServer(int port) {
		try {
			ss = new ServerSocket(port);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public Socket nextSocket() {
		Socket s = null;
		try {
			s = ss.accept();
		} catch (Exception e) {
		}
		//System.out.println("               $$$$$$$$$$$$$$$$$               "+s);
		return s;
	}

	public String read(Socket s) throws IOException {
		if (null == (br = rm.get(s))) {
			br = new BufferedReader(new InputStreamReader(s.getInputStream()));
			rm.put(s, br);
		}
		String str = br.readLine();
		str = Systemcrypt.Recovery(str,"CJCO");
		return str;
	}

	public void write(Socket s, String content) throws IOException {
		if (null == (pw = wm.get(s))) {
			pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
			wm.put(s, pw);
		}
		content = Systemcrypt.HloveyRC4(content, "CJCO");
		pw.println(content);
		pw.flush();
	}

	public void getMyresourceBack() {
		if (pw != null) {
			pw.close();
		}
		if (br != null) {
			try {
				br.close();
			} catch (IOException e) {
				e.printStackTrace();
				// TODO Auto-generated catch block
				
			}
		}
		if (rm != null) {
			rm.clear();
		}
		if (wm != null) {
			wm.clear();
		}
		if (ss != null) {
			try {
				ss.close();
			} catch (IOException e) {
				e.printStackTrace();
				// TODO Auto-generated catch block
				
			}
		}
	}
}
希望大侠,小灰狼哥,能够为弟做一下分析,小弟的本楼的提问: ----------------------------------------------------------------------------- 求大神点拨: 图片中两行画红色方框的代码,会不会把通信发起端写过来的一行数据给阻塞了?正常情况下,通信发起方肯定发出的是一行写出数据,但是通信接收方却用两句阻塞读的语句来接收通信发起方的通信数据。这样的话,应该会造成通信接收方的“阻塞”状态持续,无法退出阻塞状态吧? 希望大神能够点拨: 小弟的Socket API中的bug,是否是小弟上面指出的问题? ----------------------------------------------------------------------------------------------------------------- 是否正确? 希望得到小灰狼大侠的点拨!! 谢谢小灰狼大侠!!
Java_攻城狮 2017-02-23
  • 打赏
  • 举报
回复
写的像TS...............
小灰狼 2017-02-22
  • 打赏
  • 举报
回复
readLine 方法在读到换行符时才会返回,如果发送方没有发送换行符,方法会一直等待

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧