Java 使用JDBC的群组聊天服务器
我知道那里有无穷无尽的聊天服务器,但我似乎无法将这些解决方案应用到我的代码中。 我的代码的工作方式是启动一个服务器,我可以将任意多个客户端连接到这个服务器,所有这些客户端都可以一起通信。除了最重要的部分,我什么都做得很好。我似乎无法让客户端显示彼此的消息。我尝试使用JDBC,但每次添加都会返回太多错误Java 使用JDBC的群组聊天服务器,java,mysql,jdbc,server,client,Java,Mysql,Jdbc,Server,Client,我知道那里有无穷无尽的聊天服务器,但我似乎无法将这些解决方案应用到我的代码中。 我的代码的工作方式是启动一个服务器,我可以将任意多个客户端连接到这个服务器,所有这些客户端都可以一起通信。除了最重要的部分,我什么都做得很好。我似乎无法让客户端显示彼此的消息。我尝试使用JDBC,但每次添加都会返回太多错误 public class Client { private static final String host = "localhost"; private static final int po
public class Client {
private static final String host = "localhost";
private static final int portNumber = 4466;
private String userName;
private String serverHost;
private int serverPort;
private Scanner userInputScanner;
static JButton enterButton;
public static JTextArea output;
public static JTextField input;
static JFrame frame;
static JPanel panel;
public static String testString = "test";
public static void main(String[] args){
String readName = null;
Scanner scan = new Scanner(System.in);
System.out.println("Please input username:");
while(readName == null || readName.trim().equals("")){
readName = scan.nextLine();
if(readName.trim().equals("")){
System.out.println("Invalid. Please enter again:");
}
}
Client client = new Client(readName, host, portNumber);
client.startClient(scan);
}
private void startClient(Scanner scan){
try{
Socket socket = new Socket(serverHost, serverPort);
Thread.sleep(1000); // waiting for network communicating.
ServerThread serverThread = new ServerThread(socket, userName);
Thread serverAccessThread = new Thread(serverThread);
serverAccessThread.start();
while(serverAccessThread.isAlive()){
if(scan.hasNextLine()){
serverThread.addNextMessage(scan.nextLine());
}
}
}catch(IOException ex){
System.err.println("Fatal Connection error!");
ex.printStackTrace();
}catch(InterruptedException ex){
System.out.println("Interrupted");
}
}
private Client(String userName, String host, int portNumber){
this.userName = userName;
this.serverHost = host;
this.serverPort = portNumber;
}
}
public class ChatServer {
private static final int portNumber = 4466;
private int serverPort;
private List<ClientThread> clients;
public static void main(String[] args){
ChatServer server = new ChatServer(portNumber);
server.startServer();
}
public ChatServer(int portNumber){
this.serverPort = portNumber;
}
public List<ClientThread> getClients(){
return clients;
}
private void startServer(){
clients = new ArrayList<ClientThread>();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(serverPort);
acceptClients(serverSocket);
} catch (IOException e){
System.err.println("Could not listen on port: "+serverPort);
System.exit(1);
}
}
private void acceptClients(ServerSocket serverSocket){
final JFrame frame = new JFrame("Server Window");
frame.setSize(600, 400);
frame.getContentPane().setBackground( Color.BLACK );
//--------------------------------------//
//Display
JPanel display = new JPanel();
JTextArea editArea2 = new JTextArea(22,52);
display.add(editArea2);
frame.add(display);
display.setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(2000, 100);
frame.setBackground(Color.BLACK);
frame.setVisible(true);
editArea2.append("server starts port = " + serverSocket.getLocalSocketAddress() + "\n");
while(true){
try{
Socket socket = serverSocket.accept();
editArea2.append("accepts : " + socket.getRemoteSocketAddress() + "\n");
ClientThread client = new ClientThread(this, socket);
Thread thread = new Thread(client);
thread.start();
clients.add(client);
} catch (IOException ex){
editArea2.append("Accept failed on : "+serverPort);
}
}
}
}
public class ChatServer {
private static final int portNumber = 4466;
private int serverPort;
private List<ClientThread> clients;
public static void main(String[] args){
ChatServer server = new ChatServer(portNumber);
server.startServer();
}
public ChatServer(int portNumber){
this.serverPort = portNumber;
}
public List<ClientThread> getClients(){
return clients;
}
private void startServer(){
clients = new ArrayList<ClientThread>();
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(serverPort);
acceptClients(serverSocket);
} catch (IOException e){
System.err.println("Could not listen on port: "+serverPort);
System.exit(1);
}
}
private void acceptClients(ServerSocket serverSocket){
final JFrame frame = new JFrame("Server Window");
frame.setSize(600, 400);
frame.getContentPane().setBackground( Color.BLACK );
//--------------------------------------//
//Display
JPanel display = new JPanel();
JTextArea editArea2 = new JTextArea(22,52);
display.add(editArea2);
frame.add(display);
display.setBackground(Color.BLACK);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(2000, 100);
frame.setBackground(Color.BLACK);
frame.setVisible(true);
editArea2.append("server starts port = " + serverSocket.getLocalSocketAddress() + "\n");
while(true){
try{
Socket socket = serverSocket.accept();
editArea2.append("accepts : " + socket.getRemoteSocketAddress() + "\n");
ClientThread client = new ClientThread(this, socket);
Thread thread = new Thread(client);
thread.start();
clients.add(client);
} catch (IOException ex){
editArea2.append("Accept failed on : "+serverPort);
}
}
}
}
public class ServerThread implements Runnable {
private Socket socket;
private String userName;
private final LinkedList<String> messagesToSend;
private boolean hasMessages = false;
private static String ENTER = "Enter";
static JButton enterButton;
public static JTextArea output;
public static JTextField input;
static JFrame frame;
static JPanel panel, imagePanel;
public static String testString = "test";
String userWord = "";
public JTextField text;
public BufferedReader in ;
public PrintWriter out;
public OutputStream outputStream;
public void addNextMessage(String message){
synchronized (messagesToSend){
hasMessages = true;
messagesToSend.push(message);
}
}
@Override
public void run(){
output.append("Welcome to the chat room :" + userName + "\n");
try{
//This is where i am going wrong. I can't get the messages to pass the input stream correctly
OutputStream os = socket.getOutputStream();
PrintWriter serverOut = new PrintWriter(socket.getOutputStream(), true);
text= new JTextField();
String str = text.getText();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
str = br.readLine();
serverOut.println(str);
while(!socket.isClosed()){
if(br.ready() == true){
{
serverOut.println(str);
System.out.println(str);
}
}
if(hasMessages)
{
String nextSend = "";
synchronized(messagesToSend){
nextSend = messagesToSend.pop();
hasMessages = !messagesToSend.isEmpty();
}
output.append(userName + " > " + nextSend);
}
}
}
catch(IOException ex){
ex.printStackTrace();
}
}
//creating my JPanel
public ServerThread(Socket socket, String userName){
this.socket = socket;
this.userName = userName;
messagesToSend = new LinkedList<String>();
frame = new JFrame("Chat Server "+ userName);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(600, 400);
panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
panel.setOpaque(true);
ButtonListener buttonListener = new ButtonListener();
output = new JTextArea(15, 40);
output.setWrapStyleWord(true);
output.setEditable(false);
JScrollPane scroller = new JScrollPane(output);
scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
scroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
JPanel inputpanel = new JPanel();
inputpanel.setLayout(new FlowLayout());
input = new JTextField(20);
enterButton = new JButton("Send");
imagePanel = new JPanel();
imagePanel.setSize(20,20);
imagePanel.setVisible(true);
enterButton.setActionCommand(ENTER);
enterButton.addActionListener(buttonListener);
input.setActionCommand(ENTER);
input.addActionListener(buttonListener);
DefaultCaret caret = (DefaultCaret) output.getCaret();
caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
panel.add(scroller);
inputpanel.add(imagePanel);
inputpanel.add(input);
inputpanel.add(enterButton);
panel.add(inputpanel);
frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.setLocationByPlatform(true);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
frame.setResizable(false);
input.requestFocus();
final JToolBar toolBar = new JToolBar();
JButton upload = new JButton("Upload");
toolBar.add(button);
toolBar.add(upload);
frame.getContentPane().add(toolBar, BorderLayout.SOUTH);
upload.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fc = new JFileChooser();
fc.showOpenDialog(null);
File f = fc.getSelectedFile();
String filename = f.getAbsolutePath();
try {
File file = new File(filename);
BufferedImage image = ImageIO.read(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", baos);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
}
public static class ButtonListener implements ActionListener
{
public void actionPerformed(final ActionEvent ev)
{
if (!input.getText().trim().equals(""))
{
String cmd = ev.getActionCommand();
if (ENTER.equals(cmd))
{
output.append(input.getText());
input.getText().trim().equals(testString);
output.append("\n");
}
}
input.setText("");
input.requestFocus();
}
}
}
公共类客户端{
私有静态最终字符串host=“localhost”;
专用静态最终int端口号=4466;
私有字符串用户名;
私有字符串服务器主机;
专用int服务器端口;
专用扫描器用户输入扫描器;
静态按钮输入按钮;
公共区域输出;
公共静态JTextField输入;
静态JFrame;
静态JPanel面板;
公共静态字符串testString=“test”;
公共静态void main(字符串[]args){
字符串readName=null;
扫描仪扫描=新扫描仪(System.in);
System.out.println(“请输入用户名:”);
while(readName==null | | readName.trim().equals(“”){
readName=scan.nextLine();
if(readName.trim()等于(“”){
System.out.println(“无效。请重新输入:”);
}
}
客户端=新客户端(readName、主机、端口号);
客户端.startClient(扫描);
}
专用void startClient(扫描仪扫描){
试一试{
套接字=新套接字(服务器主机、服务器端口);
Thread.sleep(1000);//等待网络通信。
ServerThread ServerThread=新的ServerThread(套接字,用户名);
线程serverAccessThread=新线程(serverThread);
serverAccessThread.start();
while(serverAccessThread.isAlive()){
if(scan.hasNextLine()){
serverThread.addNextMessage(scan.nextLine());
}
}
}捕获(IOEX异常){
System.err.println(“致命连接错误!”);
例如printStackTrace();
}捕获(中断异常例外){
系统输出打印项次(“中断”);
}
}
专用客户端(字符串用户名、字符串主机、int端口号){
this.userName=用户名;
this.serverHost=host;
this.serverPort=portNumber;
}
}
公共类聊天服务器{
专用静态最终int端口号=4466;
专用int服务器端口;
私人名单客户;
公共静态void main(字符串[]args){
ChatServer服务器=新的ChatServer(端口号);
server.startServer();
}
公共聊天服务器(int端口号){
this.serverPort=portNumber;
}
公共列表getClients(){
返回客户;
}
私有void startServer(){
clients=newarraylist();
ServerSocket ServerSocket=null;
试一试{
serverSocket=新的serverSocket(serverPort);
接受客户端(服务器套接字);
}捕获(IOE异常){
System.err.println(“无法侦听端口:“+serverPort”);
系统出口(1);
}
}
专用void AcceptClient(服务器套接字服务器套接字){
最终JFrame=新JFrame(“服务器窗口”);
框架。设置尺寸(600400);
frame.getContentPane().setBackground(Color.BLACK);
//--------------------------------------//
//展示
JPanel display=新的JPanel();
JTextArea EditArea 2=新的JTextArea(22,52);
显示.添加(编辑区2);
frame.add(显示);
显示.背景(颜色.黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
帧设置位置(2000100);
框架.立根背景(颜色.黑色);
frame.setVisible(true);
editArea2.append(“服务器启动端口=“+serverSocket.getLocalSocketAddress()+”\n”);
while(true){
试一试{
Socket=serverSocket.accept();
editArea2.append(“接受:”+socket.getRemoteSocketAddress()+“\n”);
ClientThread客户端=新的ClientThread(这个,套接字);
线程=新线程(客户端);
thread.start();
客户。添加(客户);
}捕获(IOEX异常){
editArea2.append(“在:+serverPort上接受失败”);
}
}
}
}
公共类聊天服务器{
专用静态最终int端口号=4466;
专用int服务器端口;
私人名单客户;
公共静态void main(字符串[]args){
ChatServer服务器=新的ChatServer(端口号);
server.startServer();
}
公共聊天服务器(int端口号){
this.serverPort=portNumber;
}
公共列表getClients(){
返回客户;
}
私有void startServer(){
clients=newarraylist();
ServerSocket ServerSocket=null;
试一试{
serverSocket=新的serverSocket(serverPort);
接受客户端(服务器套接字);
}捕获(IOE异常){
System.err.println(“无法侦听端口:“+serverPort”);
系统出口(1);
}
}
专用void AcceptClient(服务器套接字服务器套接字){
最终JFrame=新JFrame(“服务器窗口”);
框架。设置尺寸(600400);
frame.getContentPane().setBackground(Color.BLACK);
//--------------------------------------//
//展示
JPanel display=新的JPanel();
JTextArea EditArea 2=新的JTextArea(22,52);
显示.添加(编辑区2);
frame.add(显示);
显示.背景(颜色.黑色);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
帧设置位置(2000100);
框架.立根背景(颜色.黑色);
frame.setVisible(true);
editArea2.append(“服务器启动端口=“+serverSocket.getLocalSocketAddress()+”\n”);
while(true){
试一试{
Socket=serverSocket.accept();
editArea2.append(“接受:”+socket.getRemoteSocketAddress()+“\n”);
ClientThread客户端=新的ClientThread(这个,套接字);
线程=新线程(客户端);
thread.start();
客户。添加(客户);
}捕获(IOEX异常){
editArea2.append(“在:+serverPort上接受失败”);
}
}
}
}
公共类ServerThread实现可运行{
私有的