我正在用java编写一个多客户端聊天服务器程序。但我不能运行它。这是我的多客户端服务器代码
/*代码可以运行单个客户端,但不能运行多个客户端。当我用我的客户机类运行这个程序时,它只能处理一个客户机。当我运行多个线程时,它失去了与第一个线程的通信。我不知道为什么*/我正在用java编写一个多客户端聊天服务器程序。但我不能运行它。这是我的多客户端服务器代码,java,Java,/*代码可以运行单个客户端,但不能运行多个客户端。当我用我的客户机类运行这个程序时,它只能处理一个客户机。当我运行多个线程时,它失去了与第一个线程的通信。我不知道为什么*/ import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; i
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import javax.swing.*;
公共类MultipleChatClient扩展JFrame{
向量客户端=新向量();
JButton btnSend=null;
JButton btnExit=null;
JTextArea taMessages=null;
JTextField tfInput=null;
BufferedReader br=null;
PrintWriter pw=null;
serversocketserver=null;
套接字=空;
int clientNumber=0;
公共多平台客户端(){
此.Interface();/*创建GUI*/
试一试{
服务器=新服务器套接字(8900);
while(true){
socket=server.accept();
HandleAClient任务=新建HandleAClient(套接字);/*将每个客户端添加到vector*/
添加(任务);
新线程(任务).start();
}
}
捕获(IOEX异常){
例如printStackTrace();
}
}
公共类handleClient实现可运行的{/*多线程类来处理多客户端*/
专用插座;
公共手持客户端(插座){
clientNumber++;
this.socket=socket;
}
公开募捐{
试一试{
br=新的BufferedReader(新的InputStreamReader(socket.getInputStream());
pw=新的PrintWriter(socket.getOutputStream(),true);
while(true){
String line=br.readLine();
taMessages.append(“客户号”+客户号+”表示:);
taMessages.append(第+行“\n”);
}
}
捕获(IOEX异常){
例如printStackTrace();
}
捕获(例外e){
taMessages.append(“连接丢失”);
}
}
公共无效发送消息(){
println(tfInput.getText());
}
}
public void Interface(){/*用于构建GUI*/
setLayout(新的BorderLayout());
btnSend=新的JButton(“发送”);
btnExit=新的JButton(“退出”);
taMessages=newjtextarea();
taMessages.setRows(10);
taMessages.setColumns(50);
taMessages.setEditable(false);
tfInput=新的JTextField(50);
JPanel but=新JPanel(新网格布局(2,1,5,10));
但是,添加(btnSend);
但是,添加(btnExit);
JScrollPane sp=新的JScrollPane(t消息,JScrollPane.垂直滚动条,根据需要,JScrollPane.水平滚动条,根据需要);
添加(sp,“Ce`在此处输入代码`enter”);
JPanel bp=newjpanel(newborderlayout());
添加(tfInput,BorderLayout.CENTER);
添加(但是,BorderLayout.EAST);
添加(bp,BorderLayout.SOUTH);
addActionListener(newButtonListner());
//addKeyListener(newButtonListner());
addActionListener(newButtonListner());
设置大小(600600);
setTitle(“服务器”);
setDefaultCloseOperation(关闭时退出);
setLocationRelativeTo(空);
setVisible(真);
//包装();
}
公共类buttonListner实现ActionListener{
@凌驾
已执行的公共无效操作(操作事件e){
如果(例如getSource()==btnExit){
系统出口(1);
}
否则{
taMessages.append(“你说:”);
taMessages.append(tfInput.getText()+“\n”);
用于(HandLeacClient c:客户端){
c、 sendMessage();
}
tfInput.setText(null);
}
}
}
公共静态void main(字符串[]args){
新的MultipleChatClient();
}
}
您必须使用多线程
。为连接到服务器的每个客户端创建一个新线程
我已经在相同的上下文中发布了一些示例
请看下面的帖子。这可能有助于你理解它
public class MultipleChatClient extends JFrame{
Vector<HandleAClient> clients = new Vector<HandleAClient>();
JButton btnSend = null;
JButton btnExit = null;
JTextArea taMessages = null;
JTextField tfInput = null;
BufferedReader br = null;
PrintWriter pw = null;
ServerSocket server = null;
Socket socket = null;
int clientNumber = 0;
public MultipleChatClient(){
this.Interface(); /* creates GUI */
try{
server = new ServerSocket(8900);
while(true){
socket = server.accept();
HandleAClient task = new HandleAClient(socket); /* add every client to vector */
clients.add(task);
new Thread(task).start();
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
public class HandleAClient implements Runnable{ /* multithreaded class to handle multiclients */
private Socket socket;
public HandleAClient(Socket socket){
clientNumber++;
this.socket = socket;
}
public void run(){
try{
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw = new PrintWriter(socket.getOutputStream(), true);
while(true){
String line = br.readLine();
taMessages.append("Client Number " + clientNumber + " said: ");
taMessages.append(line + "\n");
}
}
catch(IOException ex){
ex.printStackTrace();
}
catch(Exception e){
taMessages.append("Connection Lost");
}
}
public void sendMessage() {
pw.println(tfInput.getText());
}
}
public void Interface(){ /* to build GUI */
setLayout(new BorderLayout());
btnSend = new JButton("Send");
btnExit = new JButton("Exit");
taMessages = new JTextArea();
taMessages.setRows(10);
taMessages.setColumns(50);
taMessages.setEditable(false);
tfInput = new JTextField(50);
JPanel but = new JPanel(new GridLayout(2,1,5,10));
but.add(btnSend);
but.add(btnExit);
JScrollPane sp = new JScrollPane(taMessages, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
add(sp,"Ce`enter code here`nter");
JPanel bp = new JPanel(new BorderLayout());
bp.add(tfInput, BorderLayout.CENTER);
bp.add(but, BorderLayout.EAST);
add(bp, BorderLayout.SOUTH);
btnSend.addActionListener(new buttonListner());
//btnSend.addKeyListener(new buttonListner());
btnExit.addActionListener(new buttonListner());
setSize(600,600);
setTitle("Server");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
//pack();
}
public class buttonListner implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == btnExit){
System.exit(1);
}
else{
taMessages.append("You Said: ");
taMessages.append(tfInput.getText() + "\n");
for(HandleAClient c: clients){
c.sendMessage();
}
tfInput.setText(null);
}
}
}
public static void main(String[] args) {
new MultipleChatClient();
}
}