山寨QQ

    最近模仿了QQ写了一个简单的QQ通信程序,下面讲讲思路和一些相关代码。

    思路:首先要创建一个服务器和客户端,客服端将信息和接收对象发送给服务器端。服务器然后通过接收对象找到相对应的另外一个客户端,并将相应的信息发送到该客户端。主要用到的知识是socket编程,数据库,io流等。

  一.创建一个服务器,接收请求链接的客户端,当接收到一个客户端后就启动一个聊天线程。

public void creatServer(int port) {
	// 创建服务器
	ServerSocket sever;
	try {
	       sever = new ServerSocket(port);
	      System.out.println("服务器已启动,等待客户端。。。");
	     while (true) {
		// 监听获取客户端对象
		Socket client = sever.accept();
		new ChatThread(client).start();
		System.out.println("进入客户端:" + client.getPort());
		 }
	} catch (IOException e) {
		e.printStackTrace();
	}
         }

 二.创建一个客户端,并请求链接服务器

public void connetServer() {
		boolean bool = false;
		try {
		   Socket client = new Socket("localhost", 4040);
		   // 获取输入输出流对象
		  InputStream in = client.getInputStream();
		   br = new BufferedReader(new InputStreamReader(in));
		   out = client.getOutputStream();
		   sendMsgToServer(name);// 发送用户名
		  sendMsgToServer(pwd);// 发送密码
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 三.聊天线程的创建

public class ChatThread extends Thread {
	private Socket client;
	OutputStream out;
	InputStream in;
	String username, password, username2;

	public void run() {
		try {
			chat();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 构造方法
	public ChatThread(Socket client) {
		this.client = client;
			}

	// 获取线程对应的客户名
	public String getUsername() {
		return username;
	}

	// 发送信息的方法
	public void sendMsg(String message) {
		try {
			out.write((message + "\r\n").getBytes());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	// 聊天方法
	public void chat() throws Exception {
		// 获取客户端输入输出流
		in = client.getInputStream();
		out = client.getOutputStream();
		BufferedReader br = new BufferedReader(new InputStreamReader(in));
		
		username = br.readLine();
		username2 = br.readLine();
		System.out.println(username + "-----" + password);
		
		ChatTool.addUser(this);
		String msg = br.readLine();
                       //当客户端没有说bye并且msg不为空时继续聊
		while (!"bye".equalsIgnoreCase(msg) && msg != null) {
			System.out.println(msg);
			ChatTool.sendMsgToOne(username, username2, msg);
			msg = br.readLine();
		}
		if (msg == null) {
			ChatTool.moveUser(username);
		}
		// 关闭客户端
		client.close();
	}
}

 四.聊天处理方法

public class ChatTool {
              public static List<ChatThread> userlist = new ArrayList<ChatThread>();
	// 添加客户线程对象到队列
	public static void addUser(ChatThread ct) {
		userlist.add(ct);
	}

	// 从队列移除客户线程对象
	public static void moveUser(String username) {
		for (int i = 0; i < userlist.size(); i++) {
		      ChatThread ct = userlist.get(i);
		     if (ct.getUsername().equals(username))
		       userlist.remove(i);
		   }
	}

	// 群发信息
	public static void sendMsgToAll(String username, String msg) {
		for (int i = 0; i < userlist.size(); i++) {
		   ChatThread ct = userlist.get(i);
		   ct.sendMsg(username + "说:" + "\r\n" + msg);
		}
	}

	// 单聊
	public static void sendMsgToOne(String username, String username2,
			String msg) {
		for (int i = 0; i < userlist.size(); i++) {
			ChatThread ct = userlist.get(i);
			if (ct.getUsername().equals(username2))
				ct.sendMsg(msg);
		}
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值