Android Socket之聊天室
来源:互联网 发布:js控制数据几个为一行 编辑:程序博客网 时间:2024/06/05 11:22
公司开发需要用到socket通信的一些应用,所以就大体了解了一些其中的原理,看了一些视频,模仿做了一个聊天室。
聊天室的开发需要在服务器端记录每一个连接的socket,并向各个客户端发送消息。
服务端代码如下:因为accept()是一个阻塞函数,所以应该放在一个线程中,并保持一直监听状态。
package com.jld.textmyserversocket.main;public class MyServerSocket {public static void main(String[] args) {new ServerListener().start();}}
package com.jld.textmyserversocket.main;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;import javax.swing.JOptionPane;public class ServerListener extends Thread {@Overridepublic void run() {//1-65535try {ServerSocket serverSocket = new ServerSocket(12345);while (true) {//blockSocket socket = serverSocket.accept();//建立连接JOptionPane.showMessageDialog(null, "有客户端链接到了本机的12345端口");//将socket传递给新的线程ChatSocket cs = new ChatSocket(socket);cs.start();ChatManager.getChatManager().add(cs);}} catch (IOException e) {e.printStackTrace();}}}
package com.jld.textmyserversocket.main;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.net.Socket;public class ChatSocket extends Thread {Socket socket;public ChatSocket(Socket s){this.socket = s;}public void out(String out) {try {socket.getOutputStream().write((out+"\n").getBytes("UTF-8"));} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void run() {out("@success");try {BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(),"UTF-8"));String line = null;while ((line = br.readLine()) != null) {System.out.println(line);ChatManager.getChatManager().publish(this, line);}br.close();} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
package com.jld.textmyserversocket.main;import java.util.Vector;public class ChatManager {private ChatManager(){}private static final ChatManager cm = new ChatManager();public static ChatManager getChatManager() {return cm;}Vector<ChatSocket> vector = new Vector<ChatSocket>();public void add(ChatSocket cs) {vector.add(cs);}public void publish(ChatSocket cs,String out) {for (int i = 0; i < vector.size(); i++) {ChatSocket csChatSocket = vector.get(i);if (!cs.equals(csChatSocket)) {csChatSocket.out(out);}}}}
客户端代码如下:
package com.example.laozhou.mysocketclient;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.app.ActionBar;import android.app.Fragment;import android.os.AsyncTask;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.ViewGroup;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import android.os.Build;public class MainActivity extends Activity { EditText ip; EditText editText; TextView text; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ip = (EditText) findViewById(R.id.edit1); editText = (EditText) findViewById(R.id.edit2); text = (TextView) findViewById(R.id.text); findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { connect(); } }); findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { send(); } }); } //------------------------------------- Socket socket = null; BufferedWriter writer = null; BufferedReader reader = null; public void connect() { AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() { @Override protected Void doInBackground(Void... arg0) { try { socket = new Socket(ip.getText().toString(), 12345); writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); publishProgress("@success"); } catch (UnknownHostException e1) { Toast.makeText(MainActivity.this, "无法建立链接", Toast.LENGTH_SHORT).show(); } catch (IOException e1) { Toast.makeText(MainActivity.this, "无法建立链接", Toast.LENGTH_SHORT).show(); } try { String line; while ((line = reader.readLine())!= null) { publishProgress(line); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(String... values) { if (values[0].equals("@success")) { Toast.makeText(MainActivity.this, "链接成功!", Toast.LENGTH_SHORT).show(); text.append(values[0]+"\n"); }else{ text.append("别人说:"+values[0]+"\n"); } super.onProgressUpdate(values); } }; read.execute(); } public void send() { try { text.append("我说:"+editText.getText().toString()+"\n"); writer.write(editText.getText().toString()+"\n"); writer.flush(); editText.setText(""); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
0 0
- Android Socket之聊天室
- android 4.0网络编程之socket聊天室
- Android Socket 聊天室
- Android socket聊天室
- Android网络编程之Socket通信实现简单聊天室
- Android 基于Socket的聊天室
- android 基于socket的聊天室
- Android 基于Socket的聊天室
- Android 基于Socket的聊天室
- Android 基于Socket的聊天室
- 基于Socket的Android聊天室
- Android开发之聊天室
- Unity3D网络之Socket聊天室初探
- java socket编程之聊天室(一)
- java socket编程之聊天室(二)
- java socket编程之聊天室(三)
- Android Socket通信与聊天室的实现
- 基于netty 的android Socket 聊天室客户端
- 构建亿级前端读服务
- samplerate
- 关于struts2中出现nosuchmethod的问题
- 泰勒教授《哈佛幸福课》提及46本书籍
- java--关于线程的记录
- Android Socket之聊天室
- 《跟我学Shiro》PDF完结版下载
- 双11或成制造业零售业供给侧改革契机
- 【教程】如何在2d-x中加载CocosStudio2.0版本生成的数据
- 怎么用MathType解决Word公式排版很乱的问题
- 分类(2):k-最近邻、贝叶斯分类器
- 语句——if语句中各种值和零值比较
- bat脚本
- AJAX 后台 传参