Java客户端/服务器读取和写入不起作用,没有错误

时间:2013-03-30 17:35:26

标签: java string client-server utf

Client.java

package Client;

import java.io.*;
import java.net.*;

class Client {
        /*
     To send string to server use "out.print(data)"
     To use info sent from server use "in.readLine()"
     */
    int port = 1234;
    String hostname = "localhost";
    String input,output;

    public void send(String text) {
    try {
         Socket skt = new Socket(hostname, port);           /*Connects to server*/

         BufferedReader in = new BufferedReader(new
         InputStreamReader(skt.getInputStream()));          /*Reads from server*/
         System.out.println("Server:" + in.readLine());

         PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
         out.print(text);                                   /*Writes to server*/

         skt.close();
         out.close();    /*Closes all*/
         in.close();
      }

      catch(Exception e) {
         System.out.print("Error Connecting to Server\n");
      } 
    }
   public static void main(String args[]) {
     Client c = new Client();
     c.send("Server is online");    //sends message to server
   }
}

Server.java

package Server;

import java.io.*;
import java.net.*;

class Server {
    /*
     To send string to client use "out.print(data)"
     To use info sent from client use "in.readLine()"
     */
        int port = 1234;
    String input,output;

    public void send(String text) {
    try {
         ServerSocket srvr = new ServerSocket(port);
         Socket skt = srvr.accept();                    /*Waiting for Connection from client*/
         System.out.print("Server has connected!\n");

         PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
         out.print(text);                                                  /*Write/Send to Client*/

          BufferedReader in = new BufferedReader(new
            InputStreamReader(skt.getInputStream()));                   /*Read from Client*/
         System.out.println("Client:" + in.readLine());

         out.close();
         in.close();
         skt.close();               /*Closes all*/
         srvr.close();
      } catch( Exception e) {
         System.out.print("Error Connecting\n");
      } 
    }

   public static void main(String args[]) {
       Server s = new Server();
       s.send("Client is online");  //sends a message to client

   }
}

为什么除了 Server has connected! 我从服务器和客户端发送的时间都发生了

s.send("X is online");

应该在另一边读取并打印出cmd?

(是因为缓冲区阅读器在打印机之后被激活并且没有取出它?如果是这样,我该如何解决?)

3 个答案:

答案 0 :(得分:3)

除非您发送换行符,否则BufferedReader#readLine来电将无限期阻止。取代

out.print(text); 

out.println(text); 

匹配来自客户端和客户端的BufferedReader#readLine来电服务器

答案 1 :(得分:1)

一种可能性 - 看看这里的订购:

 PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
 out.print(text);

 skt.close();
 out.close(); 

在关闭 writer 之前,您正在关闭套接字。这意味着如果编写器有任何缓冲数据,它就没有机会编写它。尝试切换关闭事物的顺序 - 关闭套接字作为 last 事物。

(通常你会在finally区块中有这些,请注意......)

编辑:然后我注意到你没有在服务器端打印。您应该进行更改。

答案 2 :(得分:1)

package client;

import java.io.*;
import java.net.*;

class Client {
        /*
     To send string to server use "out.print(data)"
     To use info sent from server use "in.readLine()"
     */
    int port = 1234;
    String hostname = "localhost";
    String input,output;

    public void send(String text) {
    try {
         Socket skt = new Socket(hostname, port);           /*Connects to server*/

         BufferedReader in = new BufferedReader(new
         InputStreamReader(skt.getInputStream()));          /*Reads from server*/
         System.out.println("Server:" + in.readLine());

         PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
         out.println(text);                                   /*Writes to server*/
         out.close();    /*Closes all*/
         in.close();
         skt.close();

      }

      catch(Exception e) {
         System.out.print("Error Connecting to Server\n");
      } 
    }
   public static void main(String args[]) {
     Client c = new Client();
     c.send("Server is online");    //sends message to server
   }
}
package server;

import java.io.*;
import java.net.*;

class Server {
    /*
     To send string to client use "out.print(data)"
     To use info sent from client use "in.readLine()"
     */
        int port = 1234;
    String input,output;

    public void send(String text) {
    try {

        ServerSocket srvr = new ServerSocket(port);
         Socket skt = srvr.accept();                    /*Waiting for Connection from client*/
         System.out.println("Server has connected!\n");

         PrintWriter out = new PrintWriter(skt.getOutputStream(), true);
         out.println(text);                                                  /*Write/Send to Client*/

          BufferedReader in = new BufferedReader(new
            InputStreamReader(skt.getInputStream()));                   /*Read from Client*/
         System.out.println("Client:" + in.readLine());

       out.close();
         in.close();
         skt.close();              /*Closes all*/
        srvr.close();
      } catch( Exception e) {
         System.out.print("Error Connecting\n");
      } 
    }

   public static void main(String args[]) {
       Server s = new Server();
       s.send("Client is online");  //sends a message to client

   }
}

以上代码对我有用 看看你错过了什么