[网络编程]——TCP_Socket通信_聊天室_客户端多线程.初步形成

/**
 * 创建服务器,加入多线程
 * 写出数据:输出流
 * 读取数据:输入流
 * @author Administrator
 *
 */
/**
 * 创建服务器
 * 写出数据:输出流
 * 读取数据:输入流
 * @author Administrator
 *<pre name="code" class="java">//数据的发送 线程
public class send implements Runnable{
	private BufferedReader console;//控制台输入流
	private DataOutputStream dos;//管道的输出流
	private boolean isRunning=true;//控制线程的标识
	private String name;//名称
	public send() {
		console=new BufferedReader(new InputStreamReader(System.in));
	}
	
	public send(Socket client,String name){
		this();
		try {
			dos=new DataOutputStream(client.getOutputStream());
			this.name=name;
			send(this.name);
		} catch (IOException e) {
			isRunning=false;
			CloseUtil.closeAll(dos,console);
		}//如果出现异常,关闭
	}
	//1、从控制台接收数据 
	public String getMsgFromConsole(){
		try {
			return console.readLine();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return "";
	}
	// 2、发送数据
	public void send(String msg){
		if (null!=msg&&!msg.equals("")) {
			try {
				dos.writeUTF(msg);
				dos.flush();//强制刷新
			} catch (IOException e) {
				//e.printStackTrace();
				isRunning=false;
				CloseUtil.closeAll(dos,console);
			}
		}
	}
	@Override//线程体
	public void run() {
		while(isRunning){
			send(getMsgFromConsole());
		}
	}
}

*/public class Sever {private List<MyChannel> all = new ArrayList<MyChannel>();/** * @param args * @throws IOException */public static void main(String[] args) throws IOException {new Sever().start();}public void start() throws IOException{ServerSocket server =new ServerSocket(7897);while(true){Socket client =server.accept();MyChannel channel = new MyChannel(client);//有新的客户端创建,就会创建一个MyChannel对象all.add(channel);//统一管理new Thread(channel).start(); //一条道路}}/** * 一个客户端 一条道路 * 1、输入流 * 2、输出流 * 3、接收数据 * 4、发送数据 * @author Administrator * */private class MyChannel implements Runnable{private DataInputStream dis ;private DataOutputStream dos ;private boolean isRunning =true;private String name; public MyChannel(Socket client ) {try {dis = new DataInputStream(client.getInputStream());dos = new DataOutputStream(client.getOutputStream());this.name =dis.readUTF();this.send("欢迎您进入聊天室");sendOthers(this.name+"进入了聊天室",true);} catch (IOException e) {//e.printStackTrace();CloseUtil.closeAll(dis,dos);isRunning =false;}}/** * 读取数据 * @return */private String receive(){String msg ="";try {msg=dis.readUTF();} catch (IOException e) {//e.printStackTrace();CloseUtil.closeAll(dis);isRunning =false;all.remove(this); //移除自身}return msg;}/** * 发送数据 */private void send(String msg){if(null==msg ||msg.equals("")){return ;}try {dos.writeUTF(msg);dos.flush();} catch (IOException e) {//e.printStackTrace();CloseUtil.closeAll(dos);isRunning =false;all.remove(this); //移除自身}}/** * 发送给其他客户端 */private void sendOthers(String msg,boolean sys){//是否为私聊 约定if(msg.startsWith("@")&& msg.indexOf(":")>-1 ){ //私聊//获取nameString name =msg.substring(1,msg.indexOf(":"));String content = msg.substring(msg.indexOf(":")+1);for(MyChannel other:all){if(other.name.equals(name)){other.send(this.name+"对您悄悄地说:"+content);}}}else{//遍历容器for(MyChannel other:all){if(other ==this){continue;}if(sys){ //系统信息other.send("系统信息:"+msg);}else{//发送其他客户端other.send(this.name+"对所有人说:"+msg);}}}}@Overridepublic void run() {while(isRunning){sendOthers(receive(),false);}}}}
 

/**
 * 创建客户端:发送数据+接收数据
 * 写出数据:输出流
 * 读取数据:输入流
 * 			输入流和输出流在同一个线程楼内,应该彼此独立
 * 	加入名称
 * @author Administrator
 *
 */
public class Client {
	public static void main(String[] args) throws UnknownHostException, IOException {
		System.out.println("请输入名称:   ");
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		String name=br.readLine();
		if (name.equals("")) {
			return;
		}
		Socket client=new Socket("Hello_World", 7897);//服务器的端口和地址
		//控制台输入流
		new Thread(new send(client,name)).start();//一条路径************修改构造器
		new Thread(new Receive(client)).start();
	}
}

public class CloseUtil {//关闭流工具类
	public static void closeAll(Closeable...io){
		for(Closeable temp:io){
			if (temp!=null) {
				try {
					temp.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}
}

public class Receive implements Runnable{//接收线程
	private DataInputStream dis;//输入流
	private boolean isRunning=true;//线程标识
	public Receive() {
		
	}
	public Receive(Socket client) {
		try {
			dis=new DataInputStream(client.getInputStream());
		} catch (IOException e) {
			isRunning=false;
			CloseUtil.closeAll(dis);
		}
	}
	public String Receive(){//接收数据
		String msg="";
		try {
			msg=dis.readUTF();
		} catch (IOException e) {
			//e.printStackTrace();
			isRunning=false;
			CloseUtil.closeAll(dis);
		}
		return msg;
	}
	@Override
	public void run() {//线程体
		while(isRunning){
			System.out.println(Receive());
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值