多客户端聊天程序

这是书上的一个练习题;微笑

允许任意数目的客户端互相聊天,实现一个服务器为所有的客户端服务。

客户端:

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Exercise30_13Client extends JFrame{
private JTextField name=new JTextField();
private JTextField jtf=new JTextField();
private JTextArea jta=new JTextArea();
private DataOutputStream toServer;
private DataInputStream fromServer;
private String host="localhost";


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

public Exercise30_13Client(){
JPanel p1=new JPanel();
p1.setLayout(new BorderLayout());
p1.add(new JLabel("Name"),BorderLayout.WEST);
p1.add(name,BorderLayout.CENTER);
JPanel p2=new JPanel();
p2.setLayout(new BorderLayout());
p2.add(new JLabel("Enter text"),BorderLayout.WEST);
p2.add(jtf,BorderLayout.CENTER);
JPanel p3=new JPanel();
p3.setLayout(new GridLayout(2,1));
p3.add(p1);
p3.add(p2);

jtf.setHorizontalAlignment(JTextField.RIGHT);

setLayout(new BorderLayout());
add(p3,BorderLayout.NORTH);
add(new JScrollPane(jta),BorderLayout.CENTER);

jtf.addActionListener(new TextFieldListener());

setTitle("Exercise30_13Client");
setSize(500,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
try{
Socket socket=new Socket(host,8000);
fromServer=new DataInputStream(socket.getInputStream());
toServer=new DataOutputStream(socket.getOutputStream());
while(true){
String t=fromServer.readUTF();
jta.append(t+'\n');
}

}
catch(IOException ex){
jta.append(ex.toString()+'\n');
}

}//public

private class TextFieldListener implements ActionListener{
public void actionPerformed(ActionEvent e){
try{
String s=name.getText()+":"+jtf.getText();  
toServer.writeUTF(s);
toServer.flush();
}
catch(IOException ex){
System.out.println(ex);
}

}
}


}


服务器端:

import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.util.Vector;
public class Exercise30_13Server extends JFrame{
private JTextArea jta=new JTextArea();
Vector <Socket> clients = new Vector<Socket>();
public static void main(String[] args) {
// TODO Auto-generated method stub
new Exercise30_13Server();
}

public Exercise30_13Server(){
setLayout(new BorderLayout());
add(new JScrollPane(jta),BorderLayout.CENTER);

setTitle("Exercise30_13Server");
setSize(500,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);

try{
ServerSocket serverSocket=new ServerSocket(8000);
jta.append("MultiThreadServer started at "+new Date()+'\n');
int clientNo=1;
while(true){

Socket socket=serverSocket.accept();
InetAddress inetAddress1=socket.getInetAddress();
jta.append("Client "+clientNo+"'s host name is "+inetAddress1.getHostName()+"  ");
jta.append("Client "+clientNo+"'s IP Address is "+inetAddress1.getHostAddress()+"\n");
new DataOutputStream(socket.getOutputStream());

HandleAClient task=new HandleAClient(socket);
clients.add(socket);
new Thread(task).start();
clientNo++;  
          
}
}
catch(IOException ex){
System.out.println(ex);
}
}

class HandleAClient implements Runnable{
private Socket socket;
private DataInputStream fromClient;
private DataOutputStream toClient;
public HandleAClient(Socket socket){
this.socket=socket;
}


public void run(){
try{
fromClient=new DataInputStream(socket.getInputStream());
while(true){
String buffer=fromClient.readUTF();
jta.append(buffer+'\n');

for(int i=0;i<clients.size();i++){
Socket t=(Socket)clients.get(i);
toClient= new DataOutputStream(t.getOutputStream());
toClient.writeUTF(buffer);
}
}
}
catch(IOException ex){
System.out.println(ex);
}
}
}
}


运行结果如下:





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值