Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么可以';我在文本区域显示一个字符串,从一个帧到另一个帧,处理多个线程?_Java_Multithreading_Sockets - Fatal编程技术网

Java 为什么可以';我在文本区域显示一个字符串,从一个帧到另一个帧,处理多个线程?

Java 为什么可以';我在文本区域显示一个字符串,从一个帧到另一个帧,处理多个线程?,java,multithreading,sockets,Java,Multithreading,Sockets,我正在学习用简单的套接字示例在java中处理多线程 服务器表单 package chat_server; import java.io.*; import java.net.*; import java.util.*; public class TCPServer extends javax.swing.JFrame { ArrayList clientOutputStreams; ArrayList<String> users; // ArrayLis

我正在学习用简单的套接字示例在java中处理多线程

服务器表单

package chat_server;

import java.io.*;
import java.net.*;
import java.util.*;


public class TCPServer extends javax.swing.JFrame {

    ArrayList clientOutputStreams;
    ArrayList<String> users;
//    ArrayList<Object> lstUsers;

    public class ClientHandler implements Runnable {

        BufferedReader reader;
        Socket sock;
        PrintWriter client;

        public ClientHandler(Socket clientSocket, PrintWriter user) {
            client = user;
            try {
                sock = clientSocket;
                InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
                reader = new BufferedReader(isReader);
            } catch (IOException e) {
                ta_chat.append("Unexpected error... \n");
            }
        }

        @Override
        public void run() {
            String message, connect = "Connect", disconnect = "Disconnect", chat = "Chat";
            String[] data;

            try {
                while ((message = reader.readLine()) != null) {
                    ta_chat.append("Received : " + message + "\n");
                    data = message.split(":");

                    for (String token : data) {
                        ta_chat.append(token + "\n");
                    }

                    if (data[2].equals(connect)) {

                        sendToChatRoom("connect");

                    } else if (data[2].equals(disconnect)) {

                        sendToChatRoom("disconnect");

                    } else if (data[2].equals(chat)) {

                        sendToChatRoom(message);
                    } else {
                        ta_chat.append("No Conditions were met. \n");
                    }
                }
            } catch (Exception ex) {
                ta_chat.append("Lost a connection. \n");
                ex.printStackTrace();
                clientOutputStreams.remove(client);
            }
        }
    }


    public TCPServer() {
        initComponents();
    }

         // initComponents()

    private void btn_startActionPerformed(java.awt.event.ActionEvent evt) {                                          
        new ChatRoom().setVisible(true);
        Thread starter = new Thread(new ServerStart());
        starter.start();

        ta_chat.append("Server started...\n");
    }                                         

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new TCPServer().setVisible(true);

            }
        });
    }

    public class ServerStart implements Runnable {

        @Override
        public void run() {
            clientOutputStreams = new ArrayList();
            users = new ArrayList();

            try {
                ServerSocket serverSock = new ServerSocket(2222);

                while (true) {
                    Socket clientSock = serverSock.accept();
                    PrintWriter writer = new PrintWriter(clientSock.getOutputStream());
                    clientOutputStreams.add(writer);

                    Thread listener = new Thread(new ClientHandler(clientSock, writer));
                    listener.start();
                    ta_chat.append("Got a connection. \n");
                }
            } catch (Exception ex) {
                ta_chat.append("Error making a connection. \n");
            }
        }
    }

    public void sendToChatRoom(String message) {
        Thread chatroom = new Thread(new ChatRoom(message));
        chatroom.start();
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton btn_chatroom;
    private javax.swing.JButton btn_clear;
    private javax.swing.JButton btn_end;
    private javax.swing.JButton btn_start;
    private javax.swing.JButton btn_users;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea ta_chat;
    // End of variables declaration                   
}
套餐聊天服务器;
导入java.io.*;
导入java.net。*;
导入java.util.*;
公共类TCPServer扩展了javax.swing.JFrame{
ArrayList clientOutputStreams;
ArrayList用户;
//ArrayList用户;
公共类ClientHandler实现Runnable{
缓冲读取器;
插座;
PrintWriter客户端;
公共ClientHandler(套接字clientSocket,PrintWriter用户){
客户=用户;
试一试{
sock=clientSocket;
InputStreamReader isReader=新的InputStreamReader(sock.getInputStream());
读卡器=新的BufferedReader(isReader);
}捕获(IOE异常){
tau chat.append(“意外错误…\n”);
}
}
@凌驾
公开募捐{
字符串消息,connect=“connect”,disconnect=“disconnect”,chat=“chat”;
字符串[]数据;
试一试{
而((message=reader.readLine())!=null){
ta_chat.append(“接收:“+消息+”\n”);
数据=message.split(“:”);
for(字符串标记:数据){
tau chat.append(令牌+“\n”);
}
if(数据[2]。等于(连接)){
发送至舱室(“连接”);
}else if(数据[2]。等于(断开连接)){
发送至舱室(“断开”);
}else if(数据[2]。等于(聊天)){
发送至舱室(信息);
}否则{
tau chat.append(“未满足任何条件。\n”);
}
}
}捕获(例外情况除外){
tau chat.append(“失去连接。\n”);
例如printStackTrace();
clientOutputStreams.remove(客户端);
}
}
}
公共TCPServer(){
初始化组件();
}
//initComponents()
私有无效btn_startActionPerformed(java.awt.event.ActionEvent evt){
新建聊天室().setVisible(true);
线程启动程序=新线程(newserverstart());
starter.start();
tau chat.append(“服务器已启动…\n”);
}                                         
公共静态void main(字符串参数[]){
invokeLater(new Runnable()){
公开募捐{
新建TCPServer().setVisible(true);
}
});
}
公共类ServerStart实现可运行{
@凌驾
公开募捐{
clientOutputStreams=新的ArrayList();
users=newarraylist();
试一试{
ServerSocket serverSock=新的ServerSocket(2222);
while(true){
Socket clientSock=serverSock.accept();
PrintWriter writer=新的PrintWriter(clientSock.getOutputStream());
clientOutputStreams.add(writer);
线程侦听器=新线程(新ClientHandler(clientSock,writer));
listener.start();
tau chat.append(“已建立连接。\n”);
}
}捕获(例外情况除外){
tau chat.append(“建立连接时出错。\n”);
}
}
}
公共void发送到聊天室(字符串消息){
线程聊天室=新线程(新聊天室(消息));
聊天室;
}
//变量声明-不修改
私有javax.swing.JButton btn_聊天室;
私有javax.swing.JButton btn_clear;
私有javax.swing.JButton btn_end;
私有javax.swing.JButton btn_start;
私有javax.swing.JButton btn_用户;
私有javax.swing.JScrollPane-jScrollPane1;
私有javax.swing.JTextArea ta_chat;
//变量结束声明
}
聊天室表单

package chat_server;

import java.util.ArrayList;
import javax.swing.*;


public class ChatRoom extends javax.swing.JFrame implements Runnable {

    ArrayList<String> users;
    String message;

    /**
     * Creates new form ChatRoom
     */
    public ChatRoom() {
        initComponents();
    }

    public ChatRoom(String message) {
        this.message = message;
    }

    @Override
    public void run() {

        try {
            if (this.message != null) {
                System.out.println(this.message);  // run
                ta_chatroom.append(message); // can't run
            }
             ta_chatroom.append("null");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


    private void initComponents() {
             // GUI
       }

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new ChatRoom().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JList<String> lst_users;
    private javax.swing.JTextArea ta_chatroom;
    // End of variables declaration                   
}
套餐聊天服务器;
导入java.util.ArrayList;
导入javax.swing.*;
公共类聊天室扩展javax.swing.JFrame实现可运行{
ArrayList用户;
字符串消息;
/**
*创建新表单聊天室
*/
公共聊天室(){
初始化组件();
}
公共聊天室(字符串消息){
this.message=消息;
}
@凌驾
公开募捐{
试一试{
如果(this.message!=null){
System.out.println(this.message);//运行
tau chatroom.append(message);//无法运行
}
ta_聊天室。附加(“空”);
}捕获(例外情况除外){
例如printStackTrace();
}
}
私有组件(){
//桂
}
invokeLater(new Runnable()){
公开募捐{
新建聊天室().setVisible(true);
}
});
}
//变量声明-不修改
私有javax.swing.JScrollPane-jScrollPane1;
私有javax.swing.JScrollPane-jScrollPane2;
私有javax.swing.JList lst_用户;
私有javax.swing.JTextArea ta_聊天室;
//变量结束声明
}
我的程序包括几个线程,如创建套接字线程、发送/接收缓冲区线程、创建聊天室表单线程和打开表单线程

我的想法是当我按下启动按钮启动服务器时,这个事件也会打开聊天室窗体。我想将客户端的缓冲区写入服务器,然后它也会显示在聊天室的文本区域

我的问题是:当客户端向服务器发送请求时,聊天室线程也向聊天室发送缓冲区