java tcp socket编程

xiaoxiao2021-02-27  352

客户端使用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; } }

转载请注明原文地址: https://www.6miu.com/read-5171.html

最新回复(0)