java实现qq聊天室功能
2015-06-09 22:15
381 查看
一下是服务器端源码,供大家参考
下面是main.java
下面是ManagerChatThread.java
下满贴上Android客户端的代码
简单的布局就不贴了,上面是android客户端的实现比java更简单,也可用纯java来实现
下面贴上java客户端的实现,以供大家参考
两个不同包的Test类
以上有注释以供大家参考,多学习,共勉
下面是main.java
package com; public class Main { public static void main(String args[]) { new ServerListener().start(); } }下面是ServerListener,java
package com; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JOptionPane; public class ServerListener extends Thread { int count; @Override public void run() { // TODO Auto-generated method stub super.run(); System.out.println("监听是否有客户端连接"); try { ServerSocket serverSocket = new ServerSocket(12345); while (true) { count++; Socket socket = serverSocket.accept(); JOptionPane.showMessageDialog(null, "有客户端连接当前服务器"); // 一旦有客户端连接到服务器,开一个独立的线程 ChatThread chat = new ChatThread(socket, count); chat.start(); ManagerChatThread.getInstance().add(chat); } } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }下面是ChatThread.java
package com; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.Socket; public class ChatThread extends Thread { int count; Socket socket; StringBuffer sb; public ChatThread(Socket socket, int count) { // TODO Auto-generated constructor stub this.socket = socket; this.count = count; } /** * 向客户端发送消息 * * @param msg */ public void out(String msg) { try { socket.getOutputStream().write((msg+"\n").getBytes("utf-8")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { // TODO Auto-generated method stub super.run(); // 读客户端的内容 BufferedReader br = null; try { br = new BufferedReader(new InputStreamReader( socket.getInputStream(), "utf-8")); String line = null; while ((line = br.readLine()) != null) { System.out.println("客户端说"+count+":" + line); // 向客户端发送信息 ManagerChatThread.getInstance().out(this, line); } } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
下面是ManagerChatThread.java
package com; import java.util.ArrayList; /** * @author Administrator 管理客户端线程对象 */ public class ManagerChatThread { private ArrayList<ChatThread> al = new ArrayList<ChatThread>(); public static ManagerChatThread instance = new ManagerChatThread(); private ManagerChatThread() { }; public static ManagerChatThread getInstance() { return instance; } public void add(ChatThread chat){ al.add(chat); } //向客户端发送信息 public void out(ChatThread chat, String line){ for (int i = 0; i < al.size(); i++) { if(!al.get(i).equals(chat)) { al.get(i).out(line); } } } }以上就是整个服务器端的代码了,支持多个客户端连接,服务器端循环接收来自客户端的请求
下满贴上Android客户端的代码
package com.exp.client; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.EditText; import android.widget.TextView; public class Android_ClientActivity extends Activity implements OnClickListener { EditText et; TextView tv; Socket socket; BufferedWriter bw; BufferedReader br; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); findViewById(R.id.button1).setOnClickListener(this); findViewById(R.id.button2).setOnClickListener(this); tv = (TextView) findViewById(R.id.textView1); et = (EditText) findViewById(R.id.editText1); et.setText(""); tv.setText(""); } @Override public void onClick(View v) { if (v.getId() == R.id.button1) { // TODO Auto-generated method stub new AsyncTask<String, String, Void>() { @Override protected Void doInBackground(String... params) { // TODO Auto-generated method stub try { socket = new Socket(params[0], 12345); bw = new BufferedWriter(new OutputStreamWriter( socket.getOutputStream(), "utf-8")); // 读服务器消息 br = new BufferedReader(new InputStreamReader( socket.getInputStream())); publishProgress("@sucess"); String my = null; while ((my = br.readLine()) != null) { publishProgress(my); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(String... values) { // TODO Auto-generated method stub super.onProgressUpdate(values); if(values[0].equals("@sucess")){ tv.append("ok\n"); return; } tv.append("别人说:" + values[0]+"\n"); } }.execute("10.0.2.2"); } else if (v.getId() == R.id.button2) { // 将EidtText中的内容发送给服务器 String msg = et.getText().toString() + "\n"; try { bw.write(msg); bw.flush(); tv.append("自己说:" + msg); et.setText(""); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
简单的布局就不贴了,上面是android客户端的实现比java更简单,也可用纯java来实现
下面贴上java客户端的实现,以供大家参考
两个不同包的Test类
package exp; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanner = new Scanner(System.in); try { Socket socket = new Socket("192.168.0.112", 6000); while(true){ //阻塞方法,等待键盘输入 String value = scanner.next(); OutputStream os = socket.getOutputStream(); OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8"); BufferedWriter bw = new BufferedWriter(osw); bw.write(value+"\n"); bw.flush(); } } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package com; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class Test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { Socket socket = new Socket("192.168.0.112", 5000); //客户端向服务器发送数据 OutputStream os = socket.getOutputStream(); String value = "abcabc"; //字符串转化为字节数组 byte c[] = value.getBytes(); os.write(c); //客户端接受服务器数据 InputStream is = socket.getInputStream(); byte b[] = new byte[1024]; int len = is.read(b); String s = new String(b, 0, len); System.out.println(s); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
以上有注释以供大家参考,多学习,共勉
相关文章推荐
- Java初级笔记_4_数组
- java 之字符集的种种 unicode gbk utf8 utf-16
- Java知多少(87)选择框和单选按钮(转)
- Java面向对象 构造代码块
- JAVA实战3——五子棋游戏设计
- javac: 无效的标记: Files\Java\jdk1
- Spring <context:annotation-config/> 解说
- Struts2学习笔记(2)——Struts2体系结构
- 文件上传与下载(二)smartupload
- Eclipse里面找不到DatabaseExplorer,怎么办?
- Spring中引入properties文件
- Java虚拟机ClassLoader知识详解(2)
- Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file
- Struts2学习笔记(1)——Struts2的基本介绍
- OSGI学习之路-苦咲
- Ubuntu下用Myeclipse创建Java Web项目
- java之静态代码块、构造块、构造方法的简单例子
- 解决MyEclipse当确认所有配置都配好后还是无法达到目的的问题
- java设计模式 ----工厂模式
- java的四大特征