服务器端代码:
package chat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashSet;
import java.util.Iterator;
public class sever {
/**
* 服务器端
* @param args
*/
public HashSet clients = new HashSet();
public sever() {
try {
ServerSocket ss = new ServerSocket(8888);
Socket socketaccept = new Socket();
while(true){
socketaccept = ss.accept();
clients.add(socketaccept);
new ServerThread(socketaccept,clients).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class ServerThread extends Thread{
private Socket socketaccept;
private HashSet clients;
public ServerThread(Socket socketaccept, HashSet clients) {
this.socketaccept = socketaccept;
this.clients = clients;
}
@Override
public void run() {
try {
DataInputStream din = new DataInputStream(socketaccept.getInputStream());
while(true){
SendMess(din.readUTF());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void SendMess(String readUTF) {
Iterator iter = clients.iterator();
while(iter.hasNext()){
Socket temp = (Socket)iter.next();
try {
DataOutputStream dout = new DataOutputStream(temp.getOutputStream());
dout.writeUTF(readUTF);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args){
System.out.println("服务器已启动--");
new sever();
}
}
客户端代码:
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class client extends JFrame{
/**
* 客户端
* @param args
*/
private JTextArea jta;
private JTextField jtf;
private JButton jb;
private JLabel name;
private JPanel jp;
private static ThreadReceive trReceive = null;//接收线程
private static Socket sc;
public client(){
this.setSize(300, 350);
this.setTitle("聊天室");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出
jta = new JTextArea(15,20);
jtf = new JTextField(15);
jb = new JButton("发送");
name = new JLabel("");
jp = new JPanel();
jp.setLayout(new FlowLayout());
jp.add(jb);
jp.add(jtf);
jp.add(name);
jb.addActionListener(new SendMess());//发送数据..
this.setLayout(new BorderLayout());
this.add(jta,BorderLayout.CENTER);
this.add(jp,BorderLayout.SOUTH);
getMess();
this.setVisible(true);
}
class ThreadReceive extends Thread{
public void run() {
DataInputStream din;
try {
while(true){
din = new DataInputStream(sc.getInputStream());
jta.append(din.readUTF()+"\n");
//System.out.println("接收数据: "+din.readUTF());
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void getMess() {
try {
sc = new Socket("127.0.0.1",8888);
trReceive = new ThreadReceive();
trReceive.start();//循环接收数据
//}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
name.setText(JOptionPane.showInputDialog(this,"请输入你的姓名"));
}//getMess
class SendMess implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd");
String time = format.format(new Date());
try {
// while(true){//发送按钮
DataOutputStream dout = new DataOutputStream(sc.getOutputStream());
dout.writeUTF(time+' '+name.getText()+":"+jtf.getText());
//}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
public static void main(String[] args){
System.out.println("客户端..");
SwingUtilities.invokeLater(new Runnable() {
public void run() {
client thisClass = new client();
}
});
}
}采用socket编程,这个程序也是为了验证tcp通信可以多对1. 服务器端没有做界面。