求助高手!简陋聊天室!

本文介绍了一个简单的聊天室程序实现过程,包括客户端和服务端的设计与代码实现。服务端负责消息转发,客户端实现用户交互。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 调了很久的聊天室代码,最后终于不报错了,可是还是收不到。下面细细道来:
总体架构思维:服务端一个程序,包含收发线程的调用,以及等待新用户的线程;客户端一个程序,继承线程,包括一个绘画面板的类,以及一个接收信息的线程RUN方法;

下面开始贴程序咯:
首先是我封装信息的MyNode类,包含的套接字和他们各自经实例化后的ObjectIs &ObjectOs
import java.net.*;
import java.io.*;

public class myNode{

  public static int num;
  public Socket socket;
  public ObjectInputStream ois;
  public ObjectOutputStream oos;
 
}

然后是是构造继承了接收信息线程的客户端:

public class EChat extends Thread{

public ObjectInputStream ois; 
public ObjectOutputStream oos;

public String message;
public String userName;
public JTextField enter;
public JTextArea display;
 

public EChat(String un)
{
JFrame app = new JFrame(un+" is chatting with u");
userName = un;
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(470,400);

Container c = app.getContentPane();
c.setLayout(null);

display = new JTextArea();
display.setBounds(0, 0, 450,300);
JScrollPane sp1 = new JScrollPane(display);
sp1.setBounds(0, 0, 350,300);

enter = new JTextField();
enter.setEditable(false);
enter.setBounds(0, 300, 350 ,70);
JScrollPane sp2 = new JScrollPane(enter);
sp2.setBounds(0, 300, 350 ,70);
   
c.add(sp1);
    c.add(sp2);
   
    enter.requestFocusInWindow();
   
    app.setVisible(true);
   


   
    enter.addActionListener(new ActionListener(){
   
    public void actionPerformed(ActionEvent event)
    {
    try
    {
    String s = event.getActionCommand();
    oos.writeObject(s);
    oos.flush();

    mb_displayAppend("【"+userName+"】:"+s);
    enter.setText("");
    }
    catch(Exception e)
    {
    System.err.println(e);
    e.printStackTrace();
    }
    }
   
   
    });
 

}


public void mb_displayAppend(String s)
{
display.append(s+"/n");
display.setCaretPosition(display.getText().length());
enter.requestFocusInWindow();
}


public void run()
{
try
{

  while(true)
  {
  String s  = this.ois.readObject().toString();
  this.mb_displayAppend(s);
  }
}
catch(Exception e)
{
System.err.println(e);
e.printStackTrace();
}

}
}


再来是测试通信生成的带Main客户端运行程序:


public class EClient {

/**
* @param args
*/

    public static void main(String[] args) {
// TODO 自动生成方法存根

    EChat ec = new EChat("李佳玲");
    ec.enter.setEditable(true);
   
    EChat ec1 = new EChat("Lucia");
    ec1.enter.setEditable(true);
   
   
    try
    {
    Socket s = new Socket("localhost",5050);
    ec.oos = new ObjectOutputStream(s.getOutputStream());
    ec.ois = new ObjectInputStream(s.getInputStream());
        ec.start();
       
        //this.sleep(1000);
     
        Socket ss = new Socket("localhost",5050);
    ec1.oos = new ObjectOutputStream(s.getOutputStream());
    ec1.ois = new ObjectInputStream(s.getInputStream());
    ec1.start(); 
 
    }
    catch(Exception e)
    {
    System.err.println(e);
    e.printStackTrace();
   
    }
   
   
}

}


精彩来了,服务器端;
首先是服务器等待用户的监听线程 ,继承了线程;

public class CS extends Thread{

public ServerSocket ss;
public ArrayList alist;

public CS(ServerSocket ss,ArrayList alist )
{
this.ss = ss;
this.alist = alist;

}


public void run()
{


try
{


while(true)
{
Socket s = ss.accept();
EServerThread.mb_display(s.toString());

System.out.println("运行到这儿了.......");
new SThread(s,alist).start();


}

}
catch(Exception e)
{
System.err.println(e);
e.printStackTrace();
}


}


}


再来是带Main的服务器运行线程,包括收发晓得的线程;


public class SThread extends Thread{


public static JTextArea display; 
public  ArrayList alist;
    public ObjectInputStream ois;
    public ObjectOutputStream oos;
 
   
public static void initial()
{
  JFrame app = new JFrame("服务器端");
  app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  app.setSize(300,300);
 
  Container c = app.getContentPane();
  c.setLayout(null);
 
  display = new JTextArea();
  display.setBounds(0, 0, 300, 300);
  JScrollPane sp = new JScrollPane(display);
  sp.setBounds(0, 0, 300, 300);
 
  c.add(sp);
  app.setVisible(true);

}

public SThread(Socket socket,ArrayList alist)
{
try
{
myNode md = new myNode();
this.alist = alist;
md.ois = new ObjectInputStream(socket.getInputStream());
md.oos = new ObjectOutputStream(socket.getOutputStream());
alist.add(md);
}
catch(Exception e)
{
System.err.println(e);
e.printStackTrace();
}

}

public void run()
{
while(true)
{



//System.out.println("运行到Run方法中了......");
try
{

Iterator it = alist.iterator();
Iterator itt = alist.iterator();

                  while(it.hasNext())
{
try
{
myNode mnd = (myNode)(it.next());
myNode mmnd = (myNode)(itt.next());
ObjectInputStream oiis = mnd.ois;
    while(itt.hasNext())
    {
    ObjectOutputStream ooos = mmnd.oos;
    ooos.writeObject("【服务器转发】:"+oiis.readObject().toString());
    ooos.flush();
    }
//System.out.println("循环一次...");


}
catch(Exception e)
{
System.err.println(e);
e.printStackTrace();

}
}}


catch(Exception e)
{
System.err.println(e);
e.printStackTrace();
}

}

}

public static void mb_display(String s)
{
display.append(s+"/n");
display.setCaretPosition(display.getText().length());
}

public static void main(String[] args) {

EServerThread.initial();
try
{

        ServerSocket ss = new ServerSocket(5050);

ArrayList alist = new ArrayList();

new CS(ss,alist).start();

}
catch(Exception e)
{
System.err.println(e);
e.printStackTrace();
}

}
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值