写在前面
只能说基础不牢吧,代码逻辑一切OK,就是接收不到服务器信息,发送没问题。
因为服务器不是我能控制的,只能在客户端想办法解决,后来断点知道了readLine()
阻塞的情况,大无语呀,阻塞好是好,但你要换行符,我哪知道服务器给的是什么。
这里socket的连接之类的代码很多,就不重复贴了,只放些解决方案供有同样问题的朋友参考
解决方案一 加换行符
就是上面提到的readLine()
要换行符才知道传送完成,所以这个只能是服务器端发送数据给客户端时,结尾一定要加个\r
或\n
又或者使用 println()
发送数据
如果服务器客户端都是你维护,那这个解决方案最简单高效。
以下代码当个参考,m_clientSocket 即是服务端通信用Socket,非连接用的ServerSocket
public void SendMessage(String msg) {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (m_clientSocket.isConnected()) {
if (!m_clientSocket.isOutputShutdown()) {
PrintWriter printWriter = new PrintWriter(new OutputStreamWriter(m_clientSocket.getOutputStream()), true);
printWriter.println(msg);
}
}
} catch (IOException e) {
log(e.getMessage());
}
}
}).start();
}
解决方案二 使用Read() 方法
这里记得新开线程或用异步任务执行接收数据的逻辑
private void WaitForData() {
FutureTask<Void> futureTask = new FutureTask<>(new Callable<Void>() {
@Override
public Void call() throws Exception {
try {
String charset = "GBK";
byte[] buffer = new byte[10240];
String msg;
int len;
InputStream inputStream = m_clientSocket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, charset));
while (true) {
if (!m_clientSocket.isInputShutdown()) {
len = inputStream.read(buffer);
if (len == -1) break;
msg = new String(buffer, 0, len, charset);
log(msg);
// 拿到了接收到的数据msg后面就是自己的处理逻辑了,是打印还是其他了
}
}
} catch (Exception e) {
log(e.getMessage());
}
return null;
}
});
new Thread(futureTask).start();
}
解决方案三 DataInputStream
这种方法好是好,但没有阻塞等待,会一直循环。(突然发现阻塞也是好东西呀)
一并贴出来供参考吧,看需要的朋友使用
private void WaitForData() {
FutureTask<Void> futureTask = new FutureTask<>(new Callable<Void>() {
@Override
public Void call() throws Exception {
int i = 0;
while (true) {
if (!client.isInputShutdown()) {
try {
DataInputStream inputStream = new DataInputStream(client.getInputStream());
byte[] buffer = new byte[inputStream.available()];
if(buffer.length != 0){
inputStream.read(buffer);
String msg = new String(buffer);
clientReceiveData.OnClientReceiveData(msg);
}
i++;
log(String.valueOf(i));
} catch (Exception ee) {
log(ee.getMessage());
}
}
}
}
});
new Thread(futureTask).start();
}