在java

时间:2017-11-15 03:05:52

标签: java arrays sockets

我的套接字编程代码有问题。我有一个服务器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;
&#13;
&#13;

1 个答案:

答案 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){