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