我正在使用看起来像这样的 GUI 用 Java 编写聊天程序 这个
想法是在一台计算机上启动服务器,在另一台(或多台)计算机上启动客户端(我目前只是在同一台计算机上运行两者)。服务器启动后,客户端输入主机号和端口号并点击连接。到目前为止,所有这些都有效。一旦连接,用户或服务器都可以输入文本字段并点击发送,消息可以发送到服务器,服务器将消息发送给所有客户端。
我的问题是:如何将文本从客户端发送到服务器,反之亦然?
我很难理解这是如何工作的。服务器处于一个while循环中并等待更多连接(所有这些都有效),所以我不知道它如何接受文本然后将其推回。
这是整个程序,因此您可以编译它并查看我遇到的问题:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.util.*;
import java.io.*;
import java.lang.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.io.PrintWriter;
import java.util.Scanner;
public class Chat extends Frame implements Runnable, WindowListener, ActionListener, ItemListener
{
int port = 44004;
String host = "127.0.0.1";
//GUI objects
TextField ipAddressField = new TextField();
TextField portField = new TextField(""+port);
TextField hostField = new TextField(host);
TextField inputBox = new TextField();
static TextArea conversationBox = new TextArea();
Button startServerButton = new Button("Start Server");
Button sendButton = new Button("Send");
Button changeHost = new Button("Change Host");
Button changePort = new Button("Change Port");
Button connectButton = new Button("Connect");
Button disconnectButton = new Button("Disconnect");
Label hostLabel = new Label("Host:");
Label portLabel = new Label("Port:");
MenuBar mb = new MenuBar();
Menu colorMenu = new Menu("Color");
CheckboxMenuItem redItem = new CheckboxMenuItem("Red");
CheckboxMenuItem blueItem = new CheckboxMenuItem("Blue");
CheckboxMenuItem orangeItem = new CheckboxMenuItem("Orange");
CheckboxMenuItem blackItem = new CheckboxMenuItem("Black");
//runtime variables
Color color = Color.red;
volatile boolean kill = false;
volatile boolean isServer = false;
volatile boolean isClient = false;
String connections[];
//messaging variables
String message;
Scanner in;
PrintWriter out;
public static void main(String [] args)
{
new Chat();
}
ServerSocket server;
Socket s;
//gui components
protected Chat()
{
double[] colWeight = {1,1,1,1,1,1};
double[] rowWeight = {5,1,1,1,1};
int[] colWidth = {1,1,1,1,1,1};
int[] rowHeight = {5,1,1,1,1};
GridBagConstraints c = new GridBagConstraints();
GridBagLayout gbl = new GridBagLayout();
gbl.rowHeights = rowHeight;
gbl.columnWidths = colWidth;
gbl.columnWeights = colWeight;
gbl.rowWeights = rowWeight;
setBounds(100,100,400,600);
setLayout(gbl);
//add conversation box
this.conversationBox.setSize(400, 400);
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 5;
c.gridheight = 5;
c.fill = 1;
c.gridx = 0;
c.gridy = 0;
gbl.setConstraints(this.conversationBox, c);
//input text box
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 4;
c.gridheight = 1;
c.fill = 1;
c.gridx = 0;
c.gridy = 5;
gbl.setConstraints(this.inputBox, c);
//send button
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 4;
c.gridy = 5;
gbl.setConstraints(this.sendButton, c);
//host label
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 0;
c.gridy = 6;
gbl.setConstraints(this.hostLabel, c);
//host input
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 2;
c.gridheight = 1;
c.fill = 1;
c.gridx = 1;
c.gridy = 6;
gbl.setConstraints(this.hostField, c);
//change host button
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 3;
c.gridy = 6;
gbl.setConstraints(this.changeHost, c);
//start server button
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 4;
c.gridy = 6;
gbl.setConstraints(this.startServerButton, c);
//row
//port label
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 0;
c.gridy = 7;
gbl.setConstraints(this.portLabel, c);
//port input
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 2;
c.gridheight = 1;
c.fill = 1;
c.gridx = 1;
c.gridy = 7;
gbl.setConstraints(this.portField, c);
//change port button
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 3;
c.gridy = 7;
gbl.setConstraints(this.changePort, c);
//connect button
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 4;
c.gridy = 7;
gbl.setConstraints(this.connectButton, c);
//disconnect button, shunned in the corner
c.weightx = 1;
c.weighty = 1;
c.gridwidth = 1;
c.gridheight = 1;
c.fill = 1;
c.gridx = 4;
c.gridy = 8;
gbl.setConstraints(this.disconnectButton, c);
mb.add(colorMenu);
colorMenu.add(redItem);
colorMenu.add(blueItem);
colorMenu.add(orangeItem);
colorMenu.add(blackItem);
add(this.conversationBox);
add(this.inputBox);
add(this.sendButton);
add(this.hostLabel);
add(this.hostField);
add(this.changeHost);
add(this.startServerButton);
add(this.portLabel);
add(this.portField);
add(this.changePort);
add(this.connectButton);
add(this.disconnectButton);
inputBox.addActionListener(this);
sendButton.addActionListener(this);
changeHost.addActionListener(this);
changePort.addActionListener(this);
startServerButton.addActionListener(this);
connectButton.addActionListener(this);
disconnectButton.addActionListener(this);
hostField.addActionListener(this);
portField.addActionListener(this);
redItem.addItemListener(this);
blueItem.addItemListener(this);
orangeItem.addItemListener(this);
blackItem.addItemListener(this);
setMenuBar(mb);
addWindowListener(this);
setResizable(true);
pack();
setVisible(true);
new Thread(this).start();
}
public void run()
{
conversationBox.appendText("Session Start.\n");
inputBox.requestFocus();
while (!kill)
{
if (isServer)
{
conversationBox.appendText("Server starting on port " + port + "\n");
conversationBox.appendText("Waiting for clients...\n");
startServer();
}
if (isClient)
{
conversationBox.appendText("Starting connection to host " + host + " on port " + port + "\n");
startClient();
}
}
}
public void startClient()
{
try
{
Socket c = new Socket(host, port);
in = new Scanner(c.getInputStream());
out = new PrintWriter(c.getOutputStream());
while (true)
{
if (in.hasNext())
{
Chat.conversationBox.appendText("You Said: " + message);
out.println("Client Said: " + message);
out.flush();
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public void startServer()
{
try
{
server = new ServerSocket(port);
while (true)
{
s = server.accept();
conversationBox.appendText("Client connected from " + s.getLocalAddress().getHostName() + "\n");
}
}
catch (Exception e)
{
conversationBox.appendText("An error occurred.\n");
e.printStackTrace();
isServer = false;
reEnableAll();
}
}
public void actionPerformed(ActionEvent e) throws NumberFormatException
{
Object o = e.getSource();
if (o == sendButton || o == inputBox)
{
if(inputBox.getText() != "")
{
out.println(inputBox.getText());
inputBox.setText("");
}
}
if (o == changeHost || o == hostField)
{
if (hostField.getText() != "" && hostField.getText() != host)
{
host = hostField.getText();
conversationBox.appendText("Host changed to " + host + "\n");
}
}
if (o == changePort || o == portField)
{
if (portField.getText() != "" && Integer.valueOf(portField.getText()) != port)
{
try
{
port = Integer.valueOf(portField.getText());
conversationBox.appendText("Port changed to " + port + "\n");
}
catch(NumberFormatException up)
{
throw up; //blargh enter a real value
}
}
}
if (o == startServerButton)
{
isServer = true;
isClient = false;
startServerButton.enable(false);
connectButton.enable(false);
changeHost.enable(false);
changePort.enable(false);
hostField.enable(false);
portField.enable(false);
}
if (o == connectButton)
{
isServer = false;
isClient = true;
startServerButton.enable(false);
}
inputBox.requestFocus();
}
public void reEnableAll()
{
startServerButton.enable(true);
connectButton.enable(true);
changeHost.enable(true);
changePort.enable(true);
hostField.enable(true);
portField.enable(true);
}
public void windowClosing(WindowEvent e)
{
removeWindowListener(this);
inputBox.removeActionListener(this);
sendButton.removeActionListener(this);
changeHost.removeActionListener(this);
changePort.removeActionListener(this);
startServerButton.removeActionListener(this);
connectButton.removeActionListener(this);
disconnectButton.removeActionListener(this);
dispose();
System.exit(0);
}
public void windowClosed(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowDeactivated(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
public void itemStateChanged(ItemEvent e)
{
Object o = e.getSource();
if (o == redItem)
{
redItem.setState(true);
blueItem.setState(false);
orangeItem.setState(false);
blackItem.setState(false);
color = Color.red;
}
if (o == blueItem)
{
redItem.setState(false);
blueItem.setState(true);
orangeItem.setState(false);
blackItem.setState(false);
color = Color.red;
}
if (o == orangeItem)
{
redItem.setState(false);
blueItem.setState(false);
orangeItem.setState(true);
blackItem.setState(false);
color = Color.red;
}
if (o == blackItem)
{
redItem.setState(false);
blueItem.setState(false);
orangeItem.setState(false);
blackItem.setState(true);
color = Color.red;
}
}
}