客户端使用sockit,连接java写的server,但是只有断开才收到消息,使用单片机测试同样的问题。
代码是从网上搜的,如下:
package zyb.org.server;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
/**
* 该类为多线程类,用于服务端
*/
public class ServerThread implements Runnable {
private Socket client = null;
public ServerThread(Socket client){
this.client = client;
}
@Override
public void run() {
try{
//获取Socket的输出流,用来向客户端发送数据
PrintStream out = new PrintStream(client.getOutputStream());
//获取Socket的输入流,用来接收从客户端发送过来的数据
BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
boolean flag =true;
while(flag){
//接收从客户端发送过来的数据
String str = buf.readLine();
if(str == null || "".equals(str)){
flag = false;
}else{
if("bye".equals(str)){
flag = false;
}else{
//将接收到的字符串前面加上echo,发送到对应的客户端
out.println("echo:" + str);
}
}
}
out.close();
client.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
主要问题出在读取输入流上,服务器不认为消息已结束,所以一直堵塞在读取输入流中,读取代码改为:
private static String readInputStream(BufferedInputStream inputStream) throws IOException {
String inputStr = "";
int inputByte = inputStream.read();
if (inputByte == -1) {
return null;
} else {
inputStr = inputStr + "" + (char) inputByte;
int availableByte = inputStream.available();
if (availableByte > 0) {
byte[] bytes = new byte[availableByte];
inputStream.read(bytes);
inputStr = inputStr + new String(bytes);
}
return inputStr;
}
}
private void startServer() {
InputStream inputStream = null;
BufferedInputStream in = null;
PrintStream out = null; // 获取Socket的输出流,用来向客户端发送数据
logger.info("> 客户端连接成功: " + client.getInetAddress().getHostAddress());
try {
out = new PrintStream(client.getOutputStream());
inputStream = client.getInputStream();
in = new BufferedInputStream(inputStream);
} catch (IOException e) {
logger.error("> Cound\'t open input stream on Client ", e);
this.setDisconnected(true);
return;
}
while (true) {
String inputStr = null;
try {
inputStr = readInputStream(in);
} catch (Exception e) {
this.setDisconnected(true);
if (!this.disconnected) {
logger.error("> Server lost SocketClient conection.", e);
} else {
logger.info("> Server closed SocketClient conection.");
}
break;
}
if (inputStr == null) {
this.setDisconnected(true);
logger.info("> 客户端关闭连接.");
break;
}
logger.info("> 客户端 [" + client.getInetAddress().getHostAddress() + "] 发送消息:" + inputStr);
// 将接收到的字符串前面加上echo,发送到对应的客户端
out.println("" + inputStr);
}
}
@Override
public void run() {
this.startServer();
if (client != null) {
try {
client.close();
} catch (Exception e) {
logger.error("Erro closing client socket : ", e);
}
client = null;
}
}