- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 java 构建一个具有多个客户端和单个服务器的简单聊天应用程序,但我似乎一次不能拥有多个客户端类型。
当只有客户端和服务器时一切正常。
但是,当我尝试添加第二个客户端时,事情就出了问题。
第二个客户端能够建立连接,但随后代码的流部分中的某些内容似乎被阻塞,因为代码无法继续通过第二个客户端中的 setupStreams 点。
这是客户端:
package instantMessanger;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
import java.util.Random;
import javax.swing.text.AttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
public class ClientRunner {
public static void main(String[] args){
Client client = new Client("127.0.0.1"); //using local host
client.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
client.startRunning();
}
}
public class Client extends JFrame{
/**
* An Instant Messaging Client
*/
private static final long serialVersionUID = 1L;
private JTextField userText;
private JTextPane chatWindow;
private JScrollPane sPane;
private ObjectOutputStream output;
private ObjectInputStream input;
private String message = "";
private String serverIP;
private Socket connection;
private String ClientUserName;
//constructor
public Client(String host){
super("Client Instant Messanger");
serverIP = host;
userText = new JTextField();
userText.setEditable(false);
userText.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
sendMessage(event.getActionCommand()); //takes text from text area and sends it
userText.setText("");
}
}
);
add(userText, BorderLayout.NORTH);
//chatWindow = new JTextArea();
chatWindow = new JTextPane();
sPane = new JScrollPane(chatWindow);
add(sPane, BorderLayout.CENTER);
setSize(600, 300);
setVisible(true);
}
//start
public void startRunning(){
try{
connectToServer();
setupStreams();
whileChatting();
}catch(EOFException e){
showMessage("\n Client terminated the connection ");
}catch(IOException i){
i.printStackTrace();
}finally{
cleanUp();
}
}
//connect to server
private void connectToServer() throws IOException{
showMessage("Attempting connection... \n");
connection = new Socket(InetAddress.getByName(serverIP), 6879);
showMessage("Connected to: " + connection.getInetAddress().getHostName());
}
//generate username with random (unique) number
private void generateUserName(){
ClientUserName = "CLIENT"+ (int)Math.floor(Math.random() * ( 10 ));
}
//set up streams to send and receive messages
private void setupStreams() throws IOException{
output = new ObjectOutputStream(connection.getOutputStream());
output.flush();
input = new ObjectInputStream(connection.getInputStream());
}
//while chatting with server
private void whileChatting() throws IOException{
generateUserName();
ableToType(true);
do{
try{
message = (String) input.readObject();
showMessage("\n" + message);
}catch(ClassNotFoundException c){
showMessage("\n user input not accepted");
}
}while(!message.equals("SERVER - END"));
}
//clean up
private void cleanUp(){
showMessage("\n Closing the chat!");
ableToType(false);
try{
output.close();
input.close();
connection.close();
}catch(IOException i){
i.printStackTrace();
}
}
//send message to server
private void sendMessage(String message){
try{
output.writeObject(ClientUserName + " — " + message);
output.flush();
showMessage("\n" + ClientUserName + " — " + message);
}catch(IOException ioE){
appendToPane(chatWindow, "\n Error sending message", Color.RED);
}
}
//change + update chatWindow
private void showMessage(final String message){
System.out.println("the message is: " + message + " ends here");
SwingUtilities.invokeLater(
//create the thread
new Runnable(){
public void run(){
if(message.contains("CLIENT")){
appendToPane(chatWindow, message, Color.blue); //append the message to the history
}else if(message.contains("SERVER")){
appendToPane(chatWindow, message, Color.MAGENTA);
}else{
appendToPane(chatWindow, message, Color.green);
}
}
}
);
}
//allow user to type into text box
private void ableToType(final boolean tof){
SwingUtilities.invokeLater(
new Runnable(){
public void run(){
userText.setEditable(tof);
}
}
);
}
//append to pane
private void appendToPane(JTextPane tp, String msg, Color c)
{
StyleContext sc = StyleContext.getDefaultStyleContext();
AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);
aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console");
aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED);
int len = tp.getDocument().getLength();
tp.setCaretPosition(len);
tp.setCharacterAttributes(aset, false);
tp.replaceSelection(msg);
}
}
这是服务器:
package instantMessanger;
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;
public class ServerRunner {
public static void main(String[] args){
Server server = new Server();
server.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //close when hit x
server.startRunning(); //run the server class
}
}
public class Server extends JFrame{
/**
* An Instant Messaging Server
*/
private static final long serialVersionUID = 3671904040330502199L;
private JTextField userText;
private JTextPane chatWindow;
private ObjectOutputStream output;
private ObjectInputStream input;
private ServerSocket server;
private Socket connection;
private String text = "";
//constructor
public Server(){
super("Server Instant Messanger");
userText = new JTextField();
userText.setEditable(false); //before connected to anyone else, can't type
userText.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent event){
sendMessage(event.getActionCommand()); //send the text when enter is hit
userText.setText(""); //after the text is sent, message field goes back to blank
}
}
);
add(userText, BorderLayout.NORTH);
chatWindow = new JTextPane();
add(new JScrollPane(chatWindow));
setSize(600, 300);
setVisible(true);
}
//set up and run the server
public void startRunning(){
try{
server = new ServerSocket(6879, 100); //port num is first arg
while (true){
try{
//connect and have conversation
waitForConnection();
setupStreams();
whileChatting();
}catch(EOFException eofException){
//when host ends the connection, throw and catch exception
showMessage("\n Server ended the connection");
}finally{
cleanUp();
}
}
}catch(IOException ioException){
ioException.printStackTrace();
}
}
//wait for connection, then display connection info
private void waitForConnection() throws IOException{
showMessage("Waiting for someone to connect ... \n");
connection = server.accept(); //accept a connection and create socket
new ThreadedSocket(connection).start();
showMessage("Connected to: "+ connection.getInetAddress().getHostName() );
}
public class ThreadedSocket extends Thread {
Socket socket;
ThreadedSocket( Socket socket ) {
this.socket = socket;
}
}
//get stream to send and receive data
private void setupStreams() throws IOException {
output = new ObjectOutputStream(connection.getOutputStream()); // stream for send message
output.flush();
input = new ObjectInputStream(connection.getInputStream()); //stream for receive message
}
//during the chat conversation
private void whileChatting() throws IOException{
ableToType(true); //allow the user to type
do{
try{
text = (String) input.readObject();
showMessage('\n' + text);
}catch(ClassNotFoundException classNotFoundException){
showMessage("\n user input not accepted");
}
}while(!text.contains("END")); //if user types END, end convo
}
//close streams and sockets after done to cleanup
private void cleanUp() {
showMessage("\n Closing connections..... \n");
ableToType(false);
try{
output.close(); //close input
input.close(); //close output
connection.close(); //close the connection
}catch(IOException ioException){
ioException.printStackTrace();
}
}
//send a message to the client
private void sendMessage(String message){
try{
output.writeObject("SERVER - " + message); //replace server with username?
output.flush(); //flush the buffer
showMessage("\nSERVER - " + message);
}catch(IOException ioException){
appendToPane(chatWindow,"\n Error: Message not sent", Color.red);
}
}
//update the chatWindow
private void showMessage(final String text){
SwingUtilities.invokeLater( //create a thread that updates the GUI
new Runnable(){
public void run(){
if(text.contains("CLIENT")){
appendToPane(chatWindow, text, Color.blue); //append the message to the history
}else if(text.contains("SERVER")){
appendToPane(chatWindow, text, Color.MAGENTA);
}else{
appendToPane(chatWindow, text, Color.green);
}
}
}
);
}
//let the user type when connected
private void ableToType(final boolean tof){
SwingUtilities.invokeLater( //create a thread that updates the GUI
new Runnable(){
public void run(){
userText.setEditable(tof); //set to passed in true or false
}
}
);
}
//append to pane
private void appendToPane(JTextPane tp, String msg, Color c)
{
StyleContext sc = StyleContext.getDefaultStyleContext();
AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c);
aset = sc.addAttribute(aset, StyleConstants.FontFamily, "Lucida Console");
aset = sc.addAttribute(aset, StyleConstants.Alignment, StyleConstants.ALIGN_JUSTIFIED);
int len = tp.getDocument().getLength();
tp.setCaretPosition(len);
tp.setCharacterAttributes(aset, false);
tp.replaceSelection(msg);
}
}
任何和所有的帮助将不胜感激!
最佳答案
您正尝试对服务器的所有连接使用一个变量。这不起作用,因为一旦创建新的套接字连接,以前的连接将被垃圾收集。当接受新连接时,请将其添加到列表中。我不会提供代码示例,因为这需要更改代码的大部分部分并且会使答案变得臃肿。
请注意,它还要求您为每个连接创建单独的输入/输出流,而现在一旦建立新连接,您就会覆盖先前连接的流。
关于java - 无法将多个客户端添加到此 Java 聊天中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36050339/
我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我的第一个想法如下: 我在服务器上创建了一个中央 ServerSocket,所有应用程序都可以连接到该服务器。
我正在 Unity 中构建多人游戏。为此,我必须将一些值从客户端发送到两个或多个通过服务器连接的客户端。我想将其构建为服务器真实游戏。客户端将使用 Android,他们的数据将通过服务器同步(可能是一
练习 C 网络编程:我正在编写一个简单的 TCP 客户端-服务器应用程序,它应该将消息(在每个客户端的单独线程中)作为字符串从服务器发送到客户端并在客户端(稍后将成为控制台商店应用程序)。我首先发送消
我使用证书身份验证设置了 AWS Client VPN。我正在为客户端-客户端访问系统进行设置,基本上如 this AWS scenario/example 中所述.一切正常,如果我知道他们的 IP
我正在开发一个小型客户端1/客户端2、服务器(线程)TCP 游戏。在尝试处理延迟问题时,我意识到我的 transmitState() 中存在缺陷。它强制将不必要的信息传递到通讯流中,从而造成迟缓,将汽
来自文档:Configurable token lifetimes in Azure Active Directory (Public Preview) 它提到“ secret 客户端”,刷新 tok
Apollo 客户端开发工具无法连接到我的应用程序。我已在 ApolloClient 构造函数中将 connectToDevTools 传递为 true,但没有任何 react 。我也试过this p
我想在 Pod 内使用 Fabric8 kubernetes 客户端 (java)。如何获取部署集群的 kubernetes 客户端? 我可以使用该集群的 kubeconfig 文件获取任何集群的配置
我正在阅读 the security issue with Log4j我了解此产品受此漏洞影响。但是 Oracle 客户端 11.2 和 12 是否受此问题影响? 我找不到这些产品是否使用任何 Log
Eureka 服务器设置 pom.xml 1.8 Hoxton.SR1 org.springframework.cloud spring
我有一个点对点(客户端/服务器)设置(通过本地 LAN),它使用 Netty,一个 Java 网络框架。我使用原始 TCP/IP(例如,没有 HTTP)进行通信和传输。现在,根据要求,我们希望转向 T
上一篇已经实现了ModbusTcp服务器和8个主要的功能码,只是还没有实现错误处理功能。 但是在测试客户端时却发现了上一篇的一个错误,那就是写数据成功,服务器不需要响应。 接下来要做的就是实现Modb
有没有办法将二维十六进制代码数组转换为 png 图像? 数组看起来像这样(只是更大) [ [ '#FF0000', '#00FF00' ], [ '#0000FF'
我是套接字编程的新手。每次我运行客户端程序时,它都会说“无法连接到服务器”。谁能告诉我我在哪里犯了错误。任何帮助将不胜感激。 这是client.c #include #include #inclu
我们在UNIX环境下制作了简单的client.c和server.c程序。我们使用它来传输一个简单的文本文件,首先打开它,然后读取它并使用 open、read 和 send 系统调用发送;在客户端,我接
当我的程序来自 my previous question正在响应客户端,它应该发送加密消息。 当客户端连接时,它会发送一条类似“YourMessage”的消息。现在我想做的是,当客户端连接时,应该以某
我正在使用 C 和 putty 编写客户端/服务器程序。两个 c 文件位于同一系统上。 我目前在向客户端写回其正在使用的框架以及打印我的框架时遇到问题。它打印出 3 0 9 8,但随后开始打印 134
我正在使用 C 中的 select() 制作一个模拟快餐或其他任何东西的客户端服务器。 我有客户随机点 1-5 种“食物”。服务器每 30 秒决定一次。所有客户最喜欢的食物是什么?他为那些客户提供服务
对于单机游戏,基本的游戏循环是(来源:维基百科) while( user doesn't exit ) check for user input run AI move enemies
1、CentOS安装TortoiseSVN 复制代码 代码如下: yum install -y subversion 2、SVN客户端命令
我是一名优秀的程序员,十分优秀!