海珠 2009-11-09 22:49
浏览 272
已采纳

java聊天室问题(有钱给补上,不胜感激!)

首先我的想法是写一个聊天室的程序,一个服务器可以连接多个客户端,不同客户端可以自由聊天,并且在客户端有的信息显示框中可以显示每个客户所发的信息(通过服务器发到每个客户端上)!
我现在的问题是:服务器可以连接多个客户端,但是每个客户端的信息显示框中只能显示自己所发的信息,不能显示别人发的信息!下面是我写的代码,请问大虾们错在哪里!给与指正,不胜感激!


package com.chat;
import java.net.*;
import java.io.*;
/**

  • @see 服务器端代码
  • @author 章黎
    *@see 创建一个服务器端的端口,并接受客户端得端口,用一个线程来监听各个客户端
    */
    public class Server {
    private static int port=6788;
    private static ServerSocket server;
    private static Socket socket;
    public Server()
    {
    try {
    System.out.println("服务器已启动");
    server=new ServerSocket(port);
    while(true)
    {
    socket= server.accept();
    System.out.println("连接上一个服务器");
    MyThread myThread=new MyThread(socket);
    myThread.start();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    class MyThread extends Thread
    {
    Socket socket;
    BufferedReader reader;
    PrintStream ps;
    String msg;
    public MyThread(Socket s)
    {
    this.socket=s;
    }
    public void run()
    {
    try {
    reader=new BufferedReader(new InputStreamReader(socket.getInputStream()) );
    PrintStream out=new PrintStream(socket.getOutputStream(),true);
    while(true)
    {
    msg=reader.readLine();
    if(msg==null)
    {
    return;
    }
    else
    if(msg.equals("exit"))
    break;
    else
    out.println(msg);
    out.flush();
    System.out.println(msg);
    }

            server.close();
    
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    }
    public static void main(String []args)
    {
    new Server();
    }

}



package com.chat;

import javax.swing.*;

//import com.chat.Server.MyThread;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.*;

/**

  • @see客户端代码
  • @author 章黎
    *@see客户端要创建一个套接字与服务器连上,不过在这之前得做好用户界面,
    *客户端要做的事就是将信息发给服务器、同时接受服务器端传过来的信息
    */
    public class Client extends JFrame implements ActionListener{
    PrintStream ps;
    InputStream in;
    private int port=6788;
    Socket socket;
    JLabel label1,label2;
    JTextField nameField;
    JTextArea msgArea;
    JTextArea showmsgArea;
    JButton sendButton;
    JPanel panel,panel1,panel2;
    StringBuffer msg;
    String s1;
    Date datetime;
    public Client()
    {
    super("Chating room");
    panel=new JPanel();
    panel1=new JPanel();
    panel2=new JPanel();
    showmsgArea=new JTextArea();
    showmsgArea.setEditable(false);
    sendButton=new JButton("发送");
    sendButton.addActionListener(this);
    label1=new JLabel("用户名:");
    nameField=new JTextField(10);
    label2=new JLabel("聊天信息:");
    msgArea=new JTextArea(3,20);
    JScrollPane p=new JScrollPane(msgArea);
    panel1.setLayout(new GridLayout(2,1,3,3));
    panel1.add(label1);
    panel1.add(nameField);
    panel2.add(label2);
    panel2.add(p);
    panel2.add(sendButton);
    panel.add(panel1);
    panel.add(panel2);
    this.setLayout(new BorderLayout());
    this.add(panel,BorderLayout.NORTH);
    this.add(showmsgArea,BorderLayout.CENTER);
    this.setSize(500,300);
    this.setLocation(300, 280);
    this.setVisible(true);

    }

    public void actionPerformed(ActionEvent e) {
    try
    {
    if(e.getSource()==sendButton)
    {
    if(socket!=null)
    {
    datetime=new Date();
    s1=nameField.getText();
    msg=new StringBuffer(s1+":");
    msg.append(msgArea.getText());
    msgArea.setText("");
    ps.println(datetime);
    ps.println(msg);
    ps.flush();
    }
    if(socket==null)
    {

             socket=new Socket("localhost",port);
             ps=new PrintStream(socket.getOutputStream(),true);
             s1=nameField.getText();
             msg=new StringBuffer(s1+":");
             msg.append(msgArea.getText());
             ps.println(datetime);
             ps.println(msg);
             ps.flush();
         }
         MyThread myThread=new MyThread(this,socket);
         myThread.start();
     }
     }catch(Exception e1)
     {
         e1.getMessage();
     }
    

    }
    class MyThread extends Thread
    {
    BufferedReader reader;
    Socket socket;
    Client client;
    public MyThread(Client c,Socket s)
    {
    this.client=c;
    this.socket=s;
    }
    public void run()
    {

        try {
            in = socket.getInputStream();
            reader=new BufferedReader(new InputStreamReader(in));
    
        } catch (IOException e) {
            e.printStackTrace();
        }
        while (socket!=null)
        {
            try {
                String msgin=reader.readLine();
                if(msgin.equals(""))
                    return;
                else
                    showmsgArea.append(msgin);
                    showmsgArea.append("\n");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    

    }
    public static void main(String[] args) {
    new Client();
    }

}


  • 写回答

3条回答 默认 最新

  • JavaHero080 2009-11-10 05:29
    关注

    你的服务器端,在从客户A接到一个消息后,只会发给A,而不会发给其它客户,所以结果当然是每个客户只收到自己的消息看不到别人的。

    你需要把所有的MyThread对象都存在一起,然后某一个对象收到消息时,把所有的发消息。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析