我的套接字编程代码有问题。我有一个服务器tcp从客户端接收密码,如果是真的,服务器会将文件发送回客户端保存,否则服务器将发送一个长度为0的字节数组。
然后客户端将接收字节数组并获得与0比较的长度,如果字节长度= 0,客户端将打印出"错误的密码",否则它将告诉您输入文件名。
最大的问题是当密码错误时服务器发送长度为0的字节数组,但是客户端接收长度为1的字节数组。我不知道如何解决它.... :(
这是我的TCPServer代码:
import java.io.*;
import java.net.*;
import java.util.Scanner;
class ServerTCP{
public static void main (String[] args){
try{
ServerSocket ss = new ServerSocket(2018);
System.out.println("\n(*) Server Socket has been created!");
while(true){
Socket s = ss.accept();
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os);
Scanner sc = new Scanner(is);
//Receive information from client
String mail = sc.nextLine();
String pass = sc.nextLine();
System.out.println("Password is: " + pass);
if(matkhau.equals("passtcp")){
String filegui = "D:/filename.pdf";
FileInputStream f = new FileInputStream(filegui);
int lenf = f.available();
byte b2[] = new byte[lenf];
f.read(b2);
f.close();
os.write(b2);
}
else{
byte b[] = new byte[1];
int lenb = 0;
os.write(b);
}
}
}catch(IOException e){
System.out.println("\n(!)An error occured while creating socket!");
}
}
}

这是我的客户代码
import java.net.*;
import java.io.*;
import java.util.Scanner;
class UdpTcpTest{
public static void main (String[] args){
//String matkhau = new String();
Scanner k = new Scanner(System.in);
try{
//Enter TCP Server's ip
System.out.print("Enter TCP Server's ip: ");
String ip1 = k.nextLine();
//Tao socket
Socket s = new Socket(ip1, 2018);
InputStream is = s.getInputStream();
OutputStream os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os);
String mail = "yourmail@test.com";
String password = "matkhaune";
//send mail and password to server
pw.println(mail); pw.flush();
pw.println(password); pw.flush();
//receive information
byte brecv[] = new byte[60000];
int lenfile = is.read(brecv);
System.out.println("Length = " + lenfile);
if(lenfile <= 1){
System.out.println("Wrong password! Length = " + lenfile);
}
else{
//Save file
System.out.print("Enter file name to save: ");
String filenamed = k.nextLine();
FileOutputStream f = new FileOutputStream(filenamed);
f.write(brecv, 0, lenfile);
f.close();
System.out.println("Saving Scuccess!");
s.close();
}
}catch(IOException e){
System.out.println("Error while excuting!");
}
}
}
&#13;
答案 0 :(得分:1)
我的套接字编程代码有问题。我有一个服务器tcp,它从客户端接收密码,如果是真的,服务器会将文件发送回客户端保存,否则服务器将发送一个长度为0的字节数组。
不可能。
然后客户端将接收字节数组并获得与0比较的长度,如果字节长度= 0,客户端将打印出“密码错误”,否则它将告诉您输入文件名。
不可能。您将不得不重新设计您的协议。您不能通过TCP发送零长度的字节数组。最小值是一个字节。
最大的问题是服务器在密码错误时发送长度为0的字节数组
不,没有。它发送了一个长度为1的字节数组:
byte b[] = new byte[1]; // Here is your byte array of length 1
int lenb = 0; // This is unused. Delete.
os.write(b); // Here you are sending the entire byte array
但客户端接收长度为1的字节数组。
这是正确的。
我不知道如何解决它...... :(
这里没有什么可以解决的。您的代码按设计工作。您只需调整客户端以测试1字节接收而不是不可能的零字节接收:
int lenfile = is.read(brecv);
System.out.println("Length = " + lenfile);
if(lenfile == 1){