gpt4 book ai didi

java - 如何让我的 java 聊天客户端和服务器从文本字段交换消息

转载 作者:行者123 更新时间:2023-11-30 09:29:14 25 4
gpt4 key购买 nike

我正在用 Java 使用如下所示的 GUI 编写聊天程序 GUI
这个想法是在一台计算机上启动服务器,在另一台(或多台)计算机上启动客户端(我目前只是在同一台计算机上运行两者)。服务器启动后,客户端输入主机号和端口号并点击连接。到目前为止,所有这些都在起作用。连接后,用户或服务器都可以在文本字段中键入并点击发送,消息可以发送到服务器,服务器将消息发送到所有客户端。


我的问题是:如何将文本从客户端发送到服务器,反之亦然?
我无法理解它是如何工作的。服务器处于 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;
}
}
}

最佳答案

我测试了你的代码,我发现在你的 startServer() 函数中,你没有创建 OutputStream 和 InputStream

像这样修改您的startClient 函数:(创建两个全局变量:BufferedWriter bwBufferedReader br,因为我们需要它在您的actionPerformed 函数)

BufferedWriter bw = null;
BufferedReader br = null;
public void startClient()
{
try
{
Socket c = new Socket(host, port);

bw = new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
br = new BufferedReader(new InputStreamReader(c.getInputStream()));

char buffer[] = new char[1024];
while (br.read(buffer) > 0)
{
Chat.conversationBox.appendText("You Said: " + new String(buffer));
}
}
catch (Exception e)
{
e.printStackTrace();
}
}

像这样修改您的 startServer 函数:

public void startServer()
{
try
{
server = new ServerSocket(port);
while (true)
{

s = server.accept();

s.getInputStream();

conversationBox.appendText("Client connected from " + s.getLocalAddress().getHostName() + "\n");

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

char buffer[] = new char[1024];
conversationBox.appendText("Reading....");
while(br.read(buffer) > 0)
{
conversationBox.appendText("Client Say : " + new String(buffer));
bw.write(buffer);
bw.flush();
}
conversationBox.appendText("Reading Done....");
}
}
catch (Exception e)
{
conversationBox.appendText("An error occurred.\n");
e.printStackTrace();
isServer = false;
reEnableAll();
}
}

并且在您的actionPerformed 函数中,请修改以下代码:

    if (o == sendButton || o == inputBox)
{
if (inputBox == null)
{
System.out.println("NULL");
}

if(inputBox.getText() != "")
{
//out.println(inputBox.getText());
//out.flush();

try
{
bw.write(inputBox.getText());
bw.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}

inputBox.setText("");
}
}

关于java - 如何让我的 java 聊天客户端和服务器从文本字段交换消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13675602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com