MOOC华东师范大学 Java核心技术(进阶)第六章作业 编写一个群聊的程序,包括服务端程序和客户端程序

 服务端 

import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
/**
 * 请编写一个群聊的程序,包括服务端程序和客户端程序。 
 * 服务端功能:收到某客户端的信息,将消息在控制台输出,然后,发给其他另外的客户端。
 * 客户端功能:每隔5秒发送一条信息给服务端。然后接收服务器转发过来的消息,并在控制台输出。
 * @author MSS
 *
 */
public class ChatRoom {
   public static void main(String[] args) {
	   //线程池
	   ThreadPoolExecutor executor=(ThreadPoolExecutor)Executors.newFixedThreadPool(4);
	   List<Socket> slist=new ArrayList<Socket>();
	   int num=0;
	   try { 
		   ServerSocket ss=new ServerSocket(8001);
		   while(true) {
			   Socket s=ss.accept();
			   slist.add(s);
			   System.out.println("来了一个Client");
			   executor.execute(new Worker(s,slist,num));
			   num++;
		   }
	   }catch(Exception e) {
		   e.printStackTrace();
	   }
   }
}

当有客户端接入时启动线程类 

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.List;

class Worker implements Runnable{
    Socket s;
    List<Socket> slist;
    int num;
    
    public Worker(Socket s,List<Socket> slist,int num) {
    	this.s=s;
    	this.slist=slist;
        this.num=num;    	
    }
	@Override
	public void run() {
		try {
			System.out.println("服务人员已经启动");
			InputStream ips=s.getInputStream();
			BufferedReader br=new BufferedReader(new InputStreamReader(ips));
			
			
			while(true) {
				String strWord=br.readLine();
				System.out.println("No."+num+" client said:"+strWord+":"+strWord.length());
				if(strWord.equals("quit")) {
					break;
				}
				if(strWord!=null) {
				for(int i=0;i<slist.size();i++) {
					Socket sc=slist.get(i);
					OutputStream ops=sc.getOutputStream();
					DataOutputStream dos=new DataOutputStream(ops);
					dos.writeBytes("No."+num+" client said"+strWord+"---->"+System.getProperty("line.separator"));//向所有客户端发送消息
				}
				}	
			}
			br.close();
			//关闭包装类,会自动关闭包装类的底层类。所以不用调用ips.close()
			
			s.close();
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}
    
}

客户端 

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;

public class Client {

	public static void main(String[] args) {
		try {
			Socket s=new Socket(InetAddress.getByName("127.0.0.1"),8001);//需要服务端先开启
			
			//同一个通道,服务端的输出流就是客户端的输入流,服务端的输入流就是客户端的输出流
			
			InputStream ips=s.getInputStream(); //开启通道的输入流
			BufferedReader brNet=new BufferedReader(new InputStreamReader(ips));
			
			OutputStream ops=s.getOutputStream();//开启通道的输入流
			
			DataOutputStream dos=new DataOutputStream(ops);
			
			String msg="6666";
			while(true) {
				Thread.sleep(10000);
			
				dos.writeBytes(msg+System.getProperty("line.separator"));
				System.out.println("Server said:"+brNet.readLine());
			}

		}catch(Exception e) {
			e.printStackTrace();
		}

	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值