服务器可以向客户端发送消息,但不能从客户端接收消息

问题描述 投票:0回答:1

我有一个客户端服务器程序,其中servercoket将接受来自客户端的连接,并且客户端可以从服务器接收消息,反之亦然。客户:

public class ChatClient {

private final String serverName;
private final int serverPort;
private Socket socket;
private OutputStream serverOut;
private InputStream serverIn;
private BufferedReader bufferedInputStream;
//private ArrayList<UserStatusListener> userListners = new ArrayList<UserStatusListener>();


private ChatClient(String serverName, int serverPort) {
    super();
    this.serverName = serverName;
    this.serverPort = serverPort;
}


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

    ChatClient client = new ChatClient("localhost", 8818);

    // Make sure serverboot is running and listenig first
    if (! client.connect()) {
        System.out.println("Connection Failed. Is ServerBoot running/listening?");
    }else {
        System.out.println("Connection succesful");
    client.login("guest");
    }

}


private boolean connect() {
    // TODO Auto-generated method stub
    try {
        this.socket = new Socket(serverName, serverPort); 

        // get streams
        this.serverOut = socket.getOutputStream();
        this.serverIn = socket.getInputStream();
        this.bufferedInputStream = new BufferedReader(new InputStreamReader(serverIn));

        return true;
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        return false;
    }

}

private void login (String login) throws IOException {

    // send login to server
    try {

    String serverResponse = bufferedInputStream.readLine();
    System.out.println("Server response: " + serverResponse);

    while (bufferedInputStream.readLine() != null) {
        System.out.println(bufferedInputStream.readLine());
    }
String send = "Login : " + login;
        serverOut.write(send.getBytes());


    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
}

来自服务器的摘录:

 try {
                ServerSocket serverSocket = new ServerSocket(serverPortNumber);
                while (true) {
                    // Listen for incoming connections and craete connection with accept
                    System.out.println("Waiting for client connection.... on localhost port " + serverPortNumber
                            + ". \n Client connect via netcat localhost 8818");

                    Socket clientSocket = serverSocket.accept();// returns a client Socket object
                    System.out.println("Conenction established with " + clientSocket);


                    // Each new connection will be handled on a new thread and can run concurrenlty
                    ManageMultipleConnections multipleConnections = new ManageMultipleConnections(this, clientSocket);
                    clientList.add(multipleConnections);
                    multipleConnections.start();
                }

//获取客户端套接字输入流

clientInput = clientSocket.getInputStream();
        clientoutput = clientSocket.getOutputStream();

//写入客户端套接字

clientoutput.write((message).getBytes());

//尝试从客户端阅读,但我们从未收到任何消息

BufferedReader br = new BufferedReader(new InputStreamReader(clientInput, ENCODING));
        String inputLine;
        String returnMessage;

        String msg = br.readLine();
        System.out.println(br.readLine());

        while ((inputLine = br.readLine()) != null && inputLine != "") {....do stuff

感谢任何输入。

java client-server communication
1个回答
0
投票

客户代码


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


public class Client {
   private String            serverIP = "127.0.0.1";
   private int               portNo   = 3030;
   private Socket            clientsock;
   private BufferedReader    keyRead;
   private OutputStream      ostream;
   private PrintWriter       pwrite;
   private InputStream       istream;
   private BufferedReader    receiveRead;
   private String            receiveMessage, sendMessage;
   private ArrayList<String> chatList;

   /**
    * Default constructor
    * 
    * @throws Exception
    */

   public Client() throws Exception {
       clientsock = new Socket(serverIP, portNo);

       // reading from keyboard (keyRead object)
       keyRead = new BufferedReader(new InputStreamReader(System.in));

       // chat save
       chatList = new ArrayList<String>();

       // sending to client (pwrite object)
       ostream = clientsock.getOutputStream(); 
       pwrite  = new PrintWriter(ostream, true);

       // receiving from server (receiveRead object)
       istream     = clientsock.getInputStream();
       receiveRead = new BufferedReader(new InputStreamReader(istream));

       System.out.println("Start the chitchat, type and press Enter key");
   } 

   /**
    * Runs the client, exchanging one-line messages with the Server,
    * collecting and displaying them until 'exit' is typed.
    * 
    * @throws Exception
    */

   public void run() throws Exception {
       boolean chatOn = true; 
       while (chatOn) {        
           sendMessage = keyRead.readLine();  // keyboard reading
           chatList.add("Me:  "+sendMessage); // save to array        
           if (sendMessage.equalsIgnoreCase("exit")) {
               chatOn = false;
           }

           pwrite.println(sendMessage);      // sending to server
           pwrite.flush();                   // flush the data

           if (chatOn) {
               if ((receiveMessage = receiveRead.readLine()) != null) {
                   // receive from server
                   System.out.println(receiveMessage);   // displaying at prompt
                   chatList.add("You: "+receiveMessage); // save to array
               }
           }
       }               
   }

   /**
    * Stores the accumulated message log on disk
    * 
    * @throws Exception
    */

   public void chatSave() throws Exception {
       PrintStream print = new PrintStream(new File("log.txt"));
       for (String str : chatList)
           print.println(str);
       print.close();
   }

   /**
    * Main driver method that creates a Client object, runs it,
    * saves the chat and, when the run is complete, exits
    * 
    * @throws Exception
    */

   public static void main(String[] args) throws Exception {      
       Client thisClient = new Client();
       thisClient.run();
       thisClient.chatSave();
       System.exit(0);
   }                    
} 

服务器代码-这必须首先启动

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



public class Server {
    private int            portNo = 3030;
    private ServerSocket   sersock;
    private Socket         clientsock;                        
    private BufferedReader keyRead;
    private OutputStream   ostream;
    private PrintWriter    pwrite;
    private InputStream    istream;
    private BufferedReader receiveRead;
    private String         receiveMessage, sendMessage;

    /**
     * Default constructor
     */

    public Server() {
        try{
            //init
            sersock = new ServerSocket(portNo);
            System.out.println("Server  ready for chatting");
            clientsock = sersock.accept( ); 

            // reading from keyboard (keyRead object)
            keyRead = new BufferedReader(new InputStreamReader(System.in));

            // sending to client (pwrite object)
            ostream = clientsock.getOutputStream(); 
            pwrite  = new PrintWriter(ostream, true);

            // receiving from server ( receiveRead  object)
            istream     = clientsock.getInputStream();
            receiveRead = new BufferedReader(new InputStreamReader(istream));
        } catch(Exception e) {
            return;
        }
    }

    /**
     * Runs the server, exchanging one-line messages with the Client,
     * displaying them until 'exit' is typed at the Client.
     */

    public void run() {
        boolean chatOn = true; 
        while(chatOn) {
            try {
                if ((receiveMessage = receiveRead.readLine()) != null) {
                    System.out.println(receiveMessage);         
                }         
                if (receiveMessage.equalsIgnoreCase("exit")) {
                    chatOn = false;
                }

                if (chatOn) {
                    sendMessage = keyRead.readLine(); 
                    pwrite.println(sendMessage);             
                    pwrite.flush();
                }
            } catch(Exception e) {
                return;
            }
        }
    }

    /**
     * Main driver method that creates a Server object, runs it,
     * and, when the run is complete, exits
     */

    public static void main(String[] args) {
        Server thisServer = new Server();
        thisServer.run();
        System.exit(0);
    }                    
} 

© www.soinside.com 2019 - 2024. All rights reserved.