JAVA TCP客户机-服务器连接
当我运行这个程序时,客户机类会提示用户输入一个命令,该命令应该转到服务器类并打开一个文件,读取该文件的每一行,并将字节长度返回给要显示的客户机类 不幸的是,一旦我输入命令,什么也没有发生&不知道为什么 TCP客户端类JAVA TCP客户机-服务器连接,java,tcpclient,tcpserver,Java,Tcpclient,Tcpserver,当我运行这个程序时,客户机类会提示用户输入一个命令,该命令应该转到服务器类并打开一个文件,读取该文件的每一行,并将字节长度返回给要显示的客户机类 不幸的是,一旦我输入命令,什么也没有发生&不知道为什么 TCP客户端类 package TcpClient; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; import java.io.*; public class
package TcpClient;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.io.*;
public class TcpClient {
public static void main(String[] args) {
String temp;
String displayBytes;
try {
//create input stream
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
//create client socket, connect to server
Socket clientSocket = new Socket("localhost",5555);
//create output stream attached to socket
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
System.out.print("Command : ");
//create input stream attached to socket
BufferedReader inFromServer =
new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
temp = inFromUser.readLine();
//send line to server
outToServer.writeBytes(temp);
//read line from server
//displayBytes = inFromServer.readLine();
while((displayBytes = inFromServer.readLine()) != null) {
System.out.print(displayBytes);
}
//clientSocket.close();
}
catch(Exception ex) {
}
}
}
TCP服务器类
package TcpServer;
import java.io.BufferedReader;
import java.io.*;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
// The name of the file to open.
String fileName = "input.txt";
// This will reference one line at a time
String line = null;
String holder=null;
String clientWord;
int bytNumber;
try {
//create welcoming socket at port 5555
ServerSocket welcomeSocket = new ServerSocket(5555);
//wait, on welcoming socket for contact by client
Socket connectionSocket = welcomeSocket.accept();
//create input stream, attached to socket
BufferedReader inFromClient =
new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
//create output stream, attached to socket
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
//read in line from socket
clientWord = inFromClient.readLine();
if(clientWord.equals("query")) {
try {
// FileReader reads text files in the default encoding.
FileReader fileReader = new FileReader(fileName);
// Always wrap FileReader in BufferedReader.
BufferedReader buffer = new BufferedReader(fileReader);
while((line = buffer.readLine()) != null) {
System.out.println(line);
bytNumber = line.getBytes().length;
holder=Integer.toString(bytNumber);
//pr.println(bytNumber);//only printing first line not going until eof
outToClient.writeBytes(holder);
// line = buffer.readLine();
// pr.flush();
}
// Always close files.
buffer.close();
}
catch(FileNotFoundException ex) {
System.out.println("Unable to open file '" + fileName + "'");
}
catch(IOException ex) {
System.out.println ("Error reading file '" + fileName + "'");
// Or we could just do this:
// ex.printStackTrace();
}
}// end if statement
}
catch(Exception ex) {
}
}
}
我建议您仅在两侧使用
DataOutputStream
和DataInputStream
,不要使用BufferedInputStream
。
下面稍加修改的代码能够正确地将消息从客户端发送到服务器。现在你可以很容易地让它为你想要实现的目标而工作
服务器
import java.io.BufferedReader;
import java.io.*;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
// The name of the file to open.
String fileName = "input.txt";
// This will reference one line at a time
String line = null;
String holder=null;
String clientWord;
int bytNumber;
try
{
//create welcoming socket at port 5555
ServerSocket welcomeSocket = new ServerSocket(5555);
//wait, on welcoming socket for contact by client
Socket connectionSocket = welcomeSocket.accept();
//create input stream, attached to socket
DataInputStream inFromClient =
new DataInputStream(connectionSocket.getInputStream());
//create output stream, attached to socket
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
//read in line from socket
clientWord = inFromClient.readUTF();
System.out.println(clientWord);
if(clientWord.equals("query"))
{
try
{
// FileReader reads text files in the default encoding.
FileReader fileReader = new FileReader(fileName);
// Always wrap FileReader in BufferedReader.
BufferedReader buffer = new BufferedReader(fileReader);
while((line = buffer.readLine()) != null)
{
System.out.println(line);
bytNumber = line.getBytes().length;
holder=Integer.toString(bytNumber);
//pr.println(bytNumber);//only printing first line not going until eof
outToClient.writeBytes(holder);
// line = buffer.readLine();
// pr.flush();
}
// Always close files.
buffer.close();
}
catch(FileNotFoundException ex)
{
System.out.println(
"Unable to open file '" +
fileName + "'");
}
catch(IOException ex)
{
System.out.println(
"Error reading file '"
+ fileName + "'");
// Or we could just do this:
// ex.printStackTrace();
}
}// end if statement
}
catch(Exception ex)
{
}
}
}
客户端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.io.*;
public class TcpClient {
public static void main(String[] args) {
String temp;
String displayBytes;
try
{
//create input stream
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
//create client socket, connect to server
Socket clientSocket = new Socket("localhost",5555);
//create output stream attached to socket
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
System.out.print("Command : ");
//create input stream attached to socket
DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream());
temp = inFromUser.readLine();
//send line to server
//outToServer.writeBytes(temp);
outToServer.writeUTF(temp);
outToServer.flush();
//read line from server
//displayBytes = inFromServer.readLine();
while((displayBytes = inFromServer.readUTF()) != null)
{
System.out.print(displayBytes);
}
//clientSocket.close();
}
catch(Exception ex)
{
}
}
}
我建议您仅在两侧使用
DataOutputStream
和DataInputStream
,不要使用BufferedInputStream
。
下面稍加修改的代码能够正确地将消息从客户端发送到服务器。现在你可以很容易地让它为你想要实现的目标而工作
服务器
import java.io.BufferedReader;
import java.io.*;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer {
public static void main(String[] args) {
// The name of the file to open.
String fileName = "input.txt";
// This will reference one line at a time
String line = null;
String holder=null;
String clientWord;
int bytNumber;
try
{
//create welcoming socket at port 5555
ServerSocket welcomeSocket = new ServerSocket(5555);
//wait, on welcoming socket for contact by client
Socket connectionSocket = welcomeSocket.accept();
//create input stream, attached to socket
DataInputStream inFromClient =
new DataInputStream(connectionSocket.getInputStream());
//create output stream, attached to socket
DataOutputStream outToClient =
new DataOutputStream(connectionSocket.getOutputStream());
//read in line from socket
clientWord = inFromClient.readUTF();
System.out.println(clientWord);
if(clientWord.equals("query"))
{
try
{
// FileReader reads text files in the default encoding.
FileReader fileReader = new FileReader(fileName);
// Always wrap FileReader in BufferedReader.
BufferedReader buffer = new BufferedReader(fileReader);
while((line = buffer.readLine()) != null)
{
System.out.println(line);
bytNumber = line.getBytes().length;
holder=Integer.toString(bytNumber);
//pr.println(bytNumber);//only printing first line not going until eof
outToClient.writeBytes(holder);
// line = buffer.readLine();
// pr.flush();
}
// Always close files.
buffer.close();
}
catch(FileNotFoundException ex)
{
System.out.println(
"Unable to open file '" +
fileName + "'");
}
catch(IOException ex)
{
System.out.println(
"Error reading file '"
+ fileName + "'");
// Or we could just do this:
// ex.printStackTrace();
}
}// end if statement
}
catch(Exception ex)
{
}
}
}
客户端
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;
import java.io.*;
public class TcpClient {
public static void main(String[] args) {
String temp;
String displayBytes;
try
{
//create input stream
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
//create client socket, connect to server
Socket clientSocket = new Socket("localhost",5555);
//create output stream attached to socket
DataOutputStream outToServer =
new DataOutputStream(clientSocket.getOutputStream());
System.out.print("Command : ");
//create input stream attached to socket
DataInputStream inFromServer = new DataInputStream(clientSocket.getInputStream());
temp = inFromUser.readLine();
//send line to server
//outToServer.writeBytes(temp);
outToServer.writeUTF(temp);
outToServer.flush();
//read line from server
//displayBytes = inFromServer.readLine();
while((displayBytes = inFromServer.readUTF()) != null)
{
System.out.print(displayBytes);
}
//clientSocket.close();
}
catch(Exception ex)
{
}
}
}
首先不要忽略客户机类中的异常。你看,忽略错误消息并不是一个很好的调试方法…我得到的唯一消息是一个关闭clientSocket的警告,但当我这样做时,我仍然得到相同的输出。可能会有各种问题,比如没有正确地关闭此处或此处的套接字,或者连接问题。。。因此,提示:尝试在调试器中运行。添加打印语句以查看发生了什么;也许首先:阅读指导您完成整个客户机/服务器通信过程的分步教程(如)。@n00bie1221您的一个catch块包含注释“或者我们可以这样做:例如printStackTrace();”,但您选择不这样做,这是多么讽刺啊,这是您所展示的代码中最严重的错误。您应该从不忽略客户端类中的异常开始。你看,忽略错误消息并不是一个很好的调试方法…我得到的唯一消息是一个关闭clientSocket的警告,但当我这样做时,我仍然得到相同的输出。可能会有各种问题,比如没有正确地关闭此处或此处的套接字,或者连接问题。。。因此,提示:尝试在调试器中运行。添加打印语句以查看发生了什么;也许首先:阅读指导您完成整个客户机/服务器通信过程的分步教程(如)。@n00bie1221您的一个catch块包含注释“或者我们可以这样做:例如printStackTrace();”,但您选择不这样做,这是您所展示代码中最严重的错误,这是多么讽刺啊。