多线程聊天,只需要启动一次server,在局域网中,启动client输入sever的ip
server端:
package qq.com.duoren2;
import java.awt.BorderLayout;
import java.io.*;
import java.net.*;
import java.util.Vector;
import javax.swing.*;
public class MyServer extends JFrame{
/**
* @param QQ
* @author Emine Wang
*/
JTextArea jta;
JTextField jtf;
Vector<Socket> socketList = new Vector<Socket>();
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ServerSocket ss = new ServerSocket(8888);
MyServer ms = new MyServer();
while(true)
{
Socket s = ss.accept();
ms.socketList.add(s);
new Thread(new QQserver(ms,s)).start();
}
}
public MyServer ()
{
jta = new JTextArea();
jtf = new JTextField();
this.add(new JScrollPane(jta));
this.add(jtf,BorderLayout.SOUTH);
this.setBounds(100,100,200,200);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setTitle("服务器");
}
}
class QQserver implements Runnable
{
MyServer qq;
Socket socket;
BufferedReader br;
public QQserver(MyServer qq,Socket s) throws IOException//这个s是通过ss.accept()接受的
{
this.qq = qq;
this.socket = s;
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
}
@Override
public void run()
{
String str= "";
try
{
while((str = br.readLine())!=null)
{
for(Socket s : qq.socketList)
{
PrintStream ps = new PrintStream(s.getOutputStream());
ps.println(str);
}
qq.jta.append(str+"\r\n");
}
}
catch( Exception e)
{
e.printStackTrace();
}
}
}
client端
package qq.com.duoren2;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.*;
public class MyClient extends JFrame {
/**
* @param args
*/
JTextArea jta;
JTextField jtf;
Socket s;
public static void main(String[] args) throws UnknownHostException,IOException {
// TODO Auto-generated method stub
Socket s = new Socket("localhost",8888);//更换成对应的IP
MyClient m1 = new MyClient("小名",s);
Socket s2 =new Socket("localhost",8888);
MyClient m2 = new MyClient("Emine",s2);
new Thread(new QQclient(m1,s)).start();
new Thread(new QQclient(m2,s2)).start();
}
public MyClient(String name,Socket s)
{
this.s = s;
jta = new JTextArea();
jtf = new JTextField();
this.add(new JScrollPane(jta));
this.add(jtf,BorderLayout.SOUTH);
this.setTitle(name);
this.setVisible(true);
this.setBounds(200,200,200,200);
jtf.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
String name = MyClient.this.getTitle();
PrintStream ps;
try {
ps = new PrintStream(MyClient.this.s.getOutputStream());//当有2个对s的申明是要明确指出
ps.println(name+": "+jtf.getText());//jta只有一个不必指出
jtf.setText("");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
);
}
}
class QQclient implements Runnable{
MyClient client;
Socket s;
BufferedReader br;
public QQclient(MyClient client ,Socket s) throws IOException
{
this.client = client;
this.s = s;
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
}
public void run() {
String str="";
try
{
while((str = br.readLine())!=null)
{
client.jta.append(str+"\r\n");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
放在这里,忘了看看。