Mac环境下简单TCP客户端-服务器认证功能异常问题求助
TCP客户端/服务器登录验证问题修复
问题根源
客户端代码存在逻辑错误:将输入流读取的字节数与字符串"ok"直接比较,导致无论服务器返回什么结果,都会判定为登录失败。
原客户端代码错误行:
if("ok".equals(len))
len是inputStream.read(bytes)返回的整数类型字节长度,和字符串"ok"类型不匹配,永远不可能相等。
修复方案
将读取到的字节数组转换为字符串后再进行结果判断,同时补充流刷新操作确保数据及时发送:
修正后的TcpClient.java代码
import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.Scanner; public class TcpClient { public static void main(String[] args) throws IOException { while(true){ Scanner scanner = new Scanner(System.in); System.out.println("Please enter username: "); String username = scanner.nextLine(); System.out.println("Please enter password: "); String pwd = scanner.nextLine(); Socket socket = new Socket("127.0.0.1", 8080); OutputStream outputStream = socket.getOutputStream(); String text ="userName="+username+"&userPwd="+pwd; outputStream.write(text.getBytes(StandardCharsets.UTF_8)); // 刷新输出流,确保数据立即发送至服务器 outputStream.flush(); InputStream inputStream = socket.getInputStream(); byte[] bytes = new byte[1024]; int len = inputStream.read(bytes); // 将字节数组转换为字符串 String result = new String(bytes, 0, len, StandardCharsets.UTF_8); if("ok".equals(result)){ System.out.println("login successfully"); }else{ System.out.println("failed to login"); } // 依次关闭所有资源 inputStream.close(); outputStream.close(); socket.close(); } } }
额外优化建议
- 服务器代码需补充关闭
OutputStream,避免资源泄漏; - 服务器添加字符串分割的异常处理,防止客户端发送格式错误数据时抛出数组越界异常;
- 统一使用指定字符集(如UTF-8)转换字节与字符串,避免跨平台编码差异。
内容的提问来源于stack exchange,提问作者dean7
相关产品推荐
相关产品推荐

