您的MyStreamSocket
类不需要扩展 Socket。神秘的错误信息是因为 MyStreamSocket 所代表的 Socket 从来没有连接到任何东西。其socket
成员引用的 Socket 是已连接的。因此,当您从 MyStreamSocket 获取输入流时,它确实没有连接。这会导致错误,这意味着客户端关闭。这会导致套接字关闭,服务器会及时报告
使用 BufferedReader 会给你带来麻烦。它总是尽可能多地读取到它的缓冲区中,因此在文件传输开始时,它将读取“200”消息,然后将被发送的文件的前几 Kb 将被解析为字符数据。结果将是一大堆错误。
我建议您现在摆脱 BufferedReader 并改用 DataInputStream 和 DataOutputStream 。您可以使用 writeUTF 和 readUTF 方法发送您的文本命令。要发送文件,我建议使用简单的块编码。
如果我给你代码,这可能是最简单的。
首先是您的客户类。
import java.io.*;
import java.net.InetAddress;
public class EchoClient2 {
public static void main(String[] args) {
InputStreamReader is = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(is);
File file = new File("C:\\MyFile.txt");
try {
System.out.println("Welcome to the Echo client.\n"
+ "What is the name of the server host?");
String hostName = br.readLine();
if( hostName.length() == 0 ) // if user did not enter a name
hostName = "localhost"; // use the default host name
System.out.println("What is the port number of the server host?");
String portNum = br.readLine();
if( portNum.length() == 0 ) portNum = "7"; // default port number
MyStreamSocket socket = new MyStreamSocket(
InetAddress.getByName(hostName), Integer.parseInt(portNum));
boolean done = false;
String echo;
while( !done ) {
System.out.println("Enter Code: 100 = Login, 200 = Upload, 400 = Logout: ");
String message = br.readLine();
boolean messageOK = false;
if( message.equals("100") ) {
messageOK = true;
System.out.println("Enter T-Number: (Use Uppercase 'T')");
String login = br.readLine();
if( login.charAt(0) == 'T' ) {
System.out.println("Login Worked fantastically");
} else {
System.out.println("Login Failed");
}
socket.sendMessage("100");
}
if( message.equals("200") ) {
messageOK = true;
socket.sendMessage("200");
socket.sendFile(file);
}
if( (message.trim()).equals("400") ) {
messageOK = true;
System.out.println("Logged Out");
done = true;
socket.sendMessage("400");
socket.close();
break;
}
if( ! messageOK ) {
System.out.println("Invalid input");
continue;
}
// get reply from server
echo = socket.receiveMessage();
System.out.println(echo);
} // end while
} // end try
catch (Exception ex) {
ex.printStackTrace();
} // end catch
} // end main
} // end class
然后你的服务器类:
import java.io.*;
import java.net.*;
public class EchoServer2 {
static final String loginMessage = "Logged In";
static final String logoutMessage = "Logged Out";
public static void main(String[] args) {
int serverPort = 7; // default port
String message;
if( args.length == 1 ) serverPort = Integer.parseInt(args[0]);
try {
// instantiates a stream socket for accepting
// connections
ServerSocket myConnectionSocket = new ServerSocket(serverPort);
/**/System.out.println("Daytime server ready.");
while( true ) { // forever loop
// wait to accept a connection
/**/System.out.println("Waiting for a connection.");
MyStreamSocket myDataSocket = new MyStreamSocket(
myConnectionSocket.accept());
/**/System.out.println("connection accepted");
boolean done = false;
while( !done ) {
message = myDataSocket.receiveMessage();
/**/System.out.println("message received: " + message);
if( (message.trim()).equals("400") ) {
// Session over; close the data socket.
myDataSocket.sendMessage(logoutMessage);
myDataSocket.close();
done = true;
} // end if
if( (message.trim()).equals("100") ) {
// Login
/**/myDataSocket.sendMessage(loginMessage);
} // end if
if( (message.trim()).equals("200") ) {
File outFile = new File("C:\\OutFileServer.txt");
myDataSocket.receiveFile(outFile);
myDataSocket.sendMessage("File received "+outFile.length()+" bytes");
}
} // end while !done
} // end while forever
} // end try
catch (Exception ex) {
ex.printStackTrace();
}
} // end main
} // end class
然后是 StreamSocket 类:
public class MyStreamSocket {
private Socket socket;
private DataInputStream input;
private DataOutputStream output;
MyStreamSocket(InetAddress acceptorHost, int acceptorPort)
throws SocketException, IOException {
socket = new Socket(acceptorHost, acceptorPort);
setStreams();
}
MyStreamSocket(Socket socket) throws IOException {
this.socket = socket;
setStreams();
}
private void setStreams() throws IOException {
// get an input stream for reading from the data socket
input = new DataInputStream(socket.getInputStream());
output = new DataOutputStream(socket.getOutputStream());
}
public void sendMessage(String message) throws IOException {
output.writeUTF(message);
output.flush();
} // end sendMessage
public String receiveMessage() throws IOException {
String message = input.readUTF();
return message;
} // end receiveMessage
public void close() throws IOException {
socket.close();
}
public void sendFile(File file) throws IOException {
FileInputStream fileIn = new FileInputStream(file);
byte[] buf = new byte[Short.MAX_VALUE];
int bytesRead;
while( (bytesRead = fileIn.read(buf)) != -1 ) {
output.writeShort(bytesRead);
output.write(buf,0,bytesRead);
}
output.writeShort(-1);
fileIn.close();
}
public void receiveFile(File file) throws IOException {
FileOutputStream fileOut = new FileOutputStream(file);
byte[] buf = new byte[Short.MAX_VALUE];
int bytesSent;
while( (bytesSent = input.readShort()) != -1 ) {
input.readFully(buf,0,bytesSent);
fileOut.write(buf,0,bytesSent);
}
fileOut.close();
}
} // end class
抛弃“助手”类。它没有帮助你。