java tcp socket编程

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值