从斜面服务器将数据发送到客户端只viceverse用java(Cant send data from

2019-10-17 16:49发布

一直试图弄清楚这个问题了约5个小时,但似乎无法看到它,尽管所有的步骤完成发送数据,我只能接收邮件服务器,而不是从服务器到客户端。 我在建筑/学习如何在命令行做一个聊天客户端程序的早期阶段。 以下是服务器代码:

该CServer类:

public class CServer {

private static int port=2008, maxConnections=0;
private static String shutDownServer = "no";

public static void main(String[] args) throws IOException{


    ServerSocket listen = new ServerSocket(port);
    Socket server;

    while(shutDownServer.equalsIgnoreCase("no")){

        doComm connection;

        System.out.println("\nWaiting for clients to connect...");

        server = listen.accept(); // accept incomming connections from client
        System.out.println("Client connected. Location: " + server.getInetAddress().getHostName());
        connection = new doComm(server);

        Thread thread = new Thread(connection);
        thread.start();
    }



}

public void shutDownServer(String command){

    this.shutDownServer = command;
}
}

现在doComm类来处理每个客户端螺纹:

public class doComm implements Runnable{

Socket server;
private String clientData;

  public doComm(Socket server){

      this.server = server;
  } 

  public void run(){

     try {

      BufferedReader fromClient = new BufferedReader(new InputStreamReader(server.getInputStream()));
      DataOutputStream toClient = new DataOutputStream(server.getOutputStream());

      clientData = fromClient.readLine();
         System.out.println("Client sent: "+clientData);

((-imo-可以是该语句的问题:))

      toClient.writeBytes("Recieved your sentence '"+clientData+"' and more to come :)!");

    //server.close();

  } catch (IOException e) {
    System.out.println("IOException on socket listen: " + e);
    e.printStackTrace();
  }

  }
}

现在,客户端类CClient:

    public class CClient {

    static String address = "localhost";

static int port = 4444;
static Socket echoSocket;

     public CClient(int port, String addr){

         changePort(port);
         changeAddr(addr);
     }

     public static void main(String[] args) throws IOException, UnknownHostException{

         Scanner scan = new Scanner(System.in);

         System.out.println("Please enter the port to connect to: ");
         int temp_port = Integer.parseInt(scan.nextLine());
         System.out.println("Please enter the address of server: ");
         System.out.flush();
         String temp_addr = scan.nextLine();

         CClient client = new CClient(temp_port,temp_addr);

            PrintWriter out = null;
            BufferedReader in = null;

         try{
             System.out.flush();
             echoSocket =  new Socket(address,port);
             out = new PrintWriter(echoSocket.getOutputStream(), true);
             in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
         }
         catch(IOException e){

             System.err.println("IOException error: " + e.getStackTrace());
         }

         BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in));
    String userInput;

    while ((userInput = stdIn.readLine()) != null) {

        out.println(userInput);
            System.out.println("thingy prints right after this...");

((或在这里:))

System.out.println("echo: " + in.readLine());
}
 }

 public void changePort(int port){

     this.port=port;
 }

 public void changeAddr(String addr){

     this.address=addr;
 }
}

Answer 1:

  clientData = fromClient.readLine();

  toClient.writeBytes("Recieved your sentence '"+clientData+"' and more to come :)!");

这是一个非常普遍的问题,其根本原因是被用于通信的故障记录指定协议。 在这里,您收到线 ,但发送字节数 。 如果你有一个协议文件,它要么指定线路进行了交流或字节的那个任意单位进行了交流。 这将表明,这行代码的一个是错误的,你可以解决它。 但是,如果没有一个协议规范,你甚至无法知道哪一方是错的。

请从多年的惨痛教训,采纳我的建议 - 你实现之前记录的协议。 然后,如果它不工作,你可以按照这个过程分为三个步骤:

  1. 客户是否遵循记录的协议? 如果不是,它是坏了。

  2. 服务器是否遵循记录的协议? 如果不是,它是坏了。

  3. 协议规范被打破了。

在这种情况下,协议规范会记录什么是你的协议的“消息”。 那么这将是各方的责任向完整的消息,并找到接收这些消息边界。 然而,在你的情况下,一段代码需要一个行结束标记消息边界另一侧不发送一个。

是发送者错误地忽略消息边界? 在接收器错误的坚持接收一个? 没有人知道,因为没有规范说什么是应该做的事情。



文章来源: Cant send data from Server to client only viceverse using java
标签: java client chat