2016-05-18 9 views
0

私はチャットの目的でサーバ/クライアントを作成しようとしています。私は、クライアントが接続するのを待つサーバーを起動します。クライアントは接続しますが、クライアントがユーザー名を送信するのを待っています。ここでサーバがユーザ名を待っているのを待っています

はサーバです:

package chat_server; 

import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

public class Chat_Server { 
    private ServerSocket ss; 
    private Socket connection; 
    private List<ClientT> users; 
    private static int usersNumber; 

    public Chat_Server() { 
     users = new ArrayList<ClientT>(); 
     usersNumber = 1; 

     try { 
      ss = new ServerSocket(2016); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.err.println(3); 
     } 
    } 

    public void acceptRequests() throws IOException { 
     while (true) { 
      try { 
       connection = ss.accept(); 

       ClientT ct = new ClientT(connection); 

       users.add(ct); 

       System.out.print("Connected users: "); 

       for(int i = 0; i < users.size(); i++) 
        System.out.print(users.get(i) + " "); 
       System.out.println(); 

       ct.start(); 
      } catch (IOException e) { 
       System.out.println("Could not accept connection from client: " 
        + e); 
       System.err.println(4); 
      } 
     } 
    } 
} 

    class ClientT extends Thread { 
     private Socket s; 
     private BufferedReader in; 
     private DataOutputStream out; 
     private String userName = "a"; 
     private String message; 
     int userNr; 

     public ClientT(Socket _s) { 
      this.s = _s; 
      userNr = usersNumber++; 

      System.out.println("In client: s = " + s + " userNr = " + userNr); 

      try { 
       System.out.println("Creating 'in' and 'out' objects"); 
       out = new DataOutputStream(s.getOutputStream()); 
       in = new BufferedReader(new InputStreamReader(
         s.getInputStream())); 

       System.out.println("Catching username..."); 

       **//--it gets stuck here--** 
       userName = (String) in.readLine(); 
       System.out.println(userName + " connected..."); 
      } catch (IOException e) { 
       e.printStackTrace(); 
       System.err.println(1); 
      } 
     } 

     public void run() { 
      System.out.println("In ClientT run..."); 
      while (true) { 
       try { 
        message = in.readLine(); 
        System.out.println("Message: " + message); 
        System.out.println("Notifying all clients!"); 
        messageNotifyAll(message); 
       } catch (IOException e) {} 
      } 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     Chat_Server cs = new Chat_Server(); 
     System.out.println("Accepting requests..."); 
     cs.acceptRequests(); 
    } 
} 

そして、ここでクライアント:

package chatClient; 

import java.awt.BorderLayout; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class Client extends JFrame { 
    private JTextArea textArea; 
    private JScrollPane scrollPane; 
    private JPanel panelButtons; 
    private JPanel panelList; 
    private JButton send; 
    private JButton disconnect; 
    @SuppressWarnings("rawtypes") 
    private JList userList; 
    private JLabel connectedUsers; 
    private JTextField text; 
    private JButton sendMessage; 
    private String name; 
    private Socket s; 
    BufferedReader in; 
    DataOutputStream out; 

    @SuppressWarnings("rawtypes") 
    public Client(String _name) throws InterruptedException { 
     System.out.println("Loading GUI..."); 

     //GUI left out 

     System.out.println("Loading GUI finished..."); 

     connectToServer(); 
    } 

    public void connectToServer() throws InterruptedException { 
     try { 
      textArea.append("Connecting to server...\n"); 
      s = new Socket("localhost", 2016); 

      textArea.append("Connected to " + s.getInetAddress() + ":" + s.getPort() +" as " + name + "..."); 

      in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
      out = new DataOutputStream(s.getOutputStream()); 

      new waitForMessage().start(); 

      out.writeBytes(name); 
     } catch (UnknownHostException e) { 
      textArea.append("Server not running!"); 
      // e.printStackTrace(); 
     } catch (IOException e) { 
      textArea.append(e + "\n"); 
      try { 
       disconnectFromServer(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 

    public void disconnectFromServer() throws IOException { 
     s.close(); 
     System.out.println("Disconnected!"); 
    } 

    public class FrameExit extends WindowAdapter { 
     public void windowClosing(WindowEvent e) { 
      e.getWindow().dispose(); 
     } 
    } 

    public class Disconnect implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      try { 
       s.close(); 
       System.out.println("Disconnecting..."); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 

    public class Send implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      try { 
       System.out.println("Sending message: " + text.getText()); 
       out.writeBytes(text.getText()); 
       text.setText(""); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 

    public class waitForMessage extends Thread { 
     @Override 
     public void run() { 
      System.out.println("Waiting for message!"); 
      while (true) { 
       try { 
        String message = in.readLine(); 

        System.out 
         .println("Message received! Displaying message in GUI!"); 

        textArea.append(message); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
public static void main(String[] args) { 
    //I have a login GUI from where I start the Client 
} 

}

任意の助けをいただければ幸いです!

+0

相手側が何かを送信するのを待っていますか? – Kayaman

+3

サーバー側では、行の読み取りを期待しているようですが、クライアント側からの改行はありません。また、書き出した後に 'out.flush()'を追加することを検討してください。 – Berger

+0

私は改行とout.flush()を追加しました。今それは動作します、ありがとう! – blacklight93

答えて

0

サーバ側では、読み込みを期待しているようですが、クライアント側からは改行がありません。

また、書き込み後にout.flush()を追加して、データが実際に送信されることを確認してください。 printlnのメソッドを持っているあなたの代わりにPrintWriterを使用することができ

out.writeBytes(name + System.getProperty("line.separator")); 
out.flush(); 

注意、新しい行の世話をします。

参照:What is the Difference between PrintWriter and DataOutputStream?

関連する問題