2015-03-19 4 views
0

Я пытаюсь понять этот код учебника, http://www.cise.ufl.edu/~amyles/tutorials/tcpchat/, TCPChat.java.writeBytes не работает для программы Server/Client

Вот моя программа,

import java.lang.*; 
import java.util.*; 
import java.io.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import java.net.*; 

public class GuessMyNumber{ 

JFrame frame = new JFrame(); 
JPanel mainPanel = new JPanel(); 
JLabel hostL = new JLabel("Host IP:"); 
static JTextField hostTF = new JTextField("localhost"); 
JButton hostBtn = new JButton("Host"); 
JButton connectBtn = new JButton("Connect"); 
JButton disconnectBtn = new JButton("Disconnect"); 
static JTextField chatText = new JTextField(); 
JButton sendBtn = new JButton("Send"); 

static int status = 0; // 1:Disconnected, 2:Disconnecting, 3:Begin Connect, 4:Connected 
static boolean isHost = true; 
static int port = 1234; 
public static ServerSocket hostServer = null; 
public static Socket socket = null; 
public final static String END_CHAT_SESSION = 
    new Character((char)0).toString(); 
    static DataInputStream dis = null; 
    static DataOutputStream dos = null; 
    static String toSend = ""; 
    static String s = ""; 

GuessMyNumber(){ 
    frame.setTitle("Guess My Number"); 
    frame.setSize(500,500); 
    frame.setResizable(false); 
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    frame.setLocationRelativeTo(null); 
    mainPanel.setLayout(null); 

    hostL.setBounds(10,10,50,20); 
    hostTF.setBounds(60,10,140,20); 
    hostBtn.setBounds(210,10,60,20); 
    connectBtn.setBounds(280,10,90,20); 
    disconnectBtn.setBounds(380,10,100,20); 
    disconnectBtn.setEnabled(false); 
    chatText.setBounds(60,40,140,20); 
    sendBtn.setBounds(210,40,60,20); 
    mainPanel.add(hostL); 
    mainPanel.add(hostTF); 
    mainPanel.add(hostBtn); 
    mainPanel.add(connectBtn); 
    mainPanel.add(disconnectBtn); 
    mainPanel.add(chatText); 
    mainPanel.add(sendBtn); 

    hostBtn.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 
         beginHost(); 
        } 
       } 
      ); 

    connectBtn.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 
         beginConnect(); 
        } 
       } 
      ); 

    disconnectBtn.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 
         disConnect(); 
        } 
       } 
      ); 

    sendBtn.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent e){ 
         toSend = chatText.getText(); 
        } 
       } 
      ); 

    frame.add(mainPanel); 
    frame.setVisible(true); 
} 

public static void main(String[] args){ 
    GuessMyNumber gmn = new GuessMyNumber(); 
    while (true) { 
    try { // Poll every ~10 ms 
     Thread.sleep(10); 
    } 
    catch (InterruptedException e) {} 

    if(status == 3){ 
     try { 
      if (isHost) { 
       hostServer = new ServerSocket(port); 
       socket = hostServer.accept(); 
      } 
      else { 
       socket = new Socket(hostTF.getText(), port); 
      } 
      dis = new DataInputStream(socket.getInputStream()); 
      dos = new DataOutputStream(socket.getOutputStream()); 
      status = 4; 
      System.out.println("COnnected"); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }else 
    if(status == 4){ 
     System.out.println("Ready to Chat"); 
     try { 
      System.out.println(toSend.length()); 
      if (toSend.length() != 0) { 
       dos.writeBytes(toSend); 
       toSend=""; 
       chatText.setText(""); 
      } 

      if((s = dis.readLine()) != null){ 
       if ((s != null) && (s.length() != 0)) { 
       if (s.equals(END_CHAT_SESSION)) { 
       } 

       else { 

        System.out.println("loL"); 
       } 
       } 
      } 


     }catch (Exception e) { 

      e.printStackTrace(); 
     } 
    }else 
    if(status == 2){ 
     System.out.println("Discon na!"); 
     try { 

     } 
     catch (Exception e) { 

      e.printStackTrace(); 
     } 
    } 
    } 
} 

public void beginConnect(){ 
    status = 3; 
    isHost = false; 
    hostTF.setEditable(false); 
    hostBtn.setEnabled(false); 
    connectBtn.setEnabled(false); 
    disconnectBtn.setEnabled(true); 
} 

public void disConnect(){ 
    status = 2; 
    hostTF.setEditable(true); 
    hostBtn.setEnabled(true); 
    connectBtn.setEnabled(true); 
    disconnectBtn.setEnabled(false); 
} 

public void beginHost(){ 
    status = 3; 
    isHost = true; 
    hostTF.setEditable(false); 
    hostBtn.setEnabled(false); 
    connectBtn.setEnabled(false); 
    disconnectBtn.setEnabled(true); 
} 

} 

Запуск мою программу, она выводит "Connected", "готов к Chat" и "0" .. Так что клиент и сервер подключены. Если сервер или клиент пытаются отправить сообщение, он не работает. Может ли кто-нибудь помочь мне решить эту проблему?

В коде учебника они использовали BufferReader, но я использовал DataInputStream. В bufferReader они могут использовать .ready(), но для DataInputStream он не имеет этого метода. Я думаю, что это один из факторов, вызывающих эту проблему.

+0

«Он не работает» не говорит нам ничего о том, что вы наблюдаете, и о том, что вы ожидали наблюдать. Вы представили много кода - было бы полезно, если бы вы могли сократить это до минимального * примера, демонстрирующего проблему. (Как подсказка - вам не нужен пользовательский интерфейс. Просто создайте пару консольных приложений, и вам будет намного легче помочь вам.) –

ответ

0

вместо многократного объединения вещей в вашем цикле while, вместо этого вместо этого нужно ввести соответствующий код или вызвать его из прослушивателей действий.

Таким образом, вместо того, чтобы просто

 sendBtn.addActionListener(
      new ActionListener(){ 
       public void actionPerformed(ActionEvent e){ 
        toSend = chatText.getText(); 
       } 
      } 
     ); 

Вы также должны поставить код, который записывает текст в сети. Если для написания текста требуется слишком много времени, и вы обнаружите его блокировку gui, вы можете вместо этого использовать SwingWorker, чтобы запустить его в фоновом режиме.

0
System.out.println(toSend.length()); 
      if (toSend.length() != 0) { 
       dos.writeBytes(toSend); 
       toSend=""; 
       chatText.setText(""); 

Вместо написания dos.writeBytes (ToSend) вы можете написать dos.writeBytes (ToSend + '\ п'). Он должен работать.