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