Android Socket 聊天室示例
1.服务端
package com.test.chatServer; import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket; import javax.swing.JOptionPane; public class ChatServer extends Thread {
@Override
public void run() {
try {
ServerSocket svSocket = new ServerSocket();
while(true){
Socket socket = svSocket.accept();//accept会阻塞当前线程,最好把这独立在线程中,然后等待客户socket连接
JOptionPane.showMessageDialog(null, "已经有客户socket连接到servSocket");
ChatClient c = new ChatClient(socket);
ChatManager.getChatManager().add(c);
c.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.test.chatServer; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Socket; public class ChatClient extends Thread {
Socket socket; void output(String out) {
try {
socket.getOutputStream().write(out.getBytes("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
}
} void receiveMsg() {
try {
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
line += "\n";//手动增加的\n,是由于命令行只有\r没有\n,正常客户端发送的要有10
ChatManager.getChatManager().sendToEveryone(this, line);
}
br.close();
isr.close();
is.close(); } catch (IOException e) {
e.printStackTrace();
}
} void sendMsg() {
int count = ;
while (true) {
count++;
output("\n loop : " + count + "\n");
try {
sleep();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} @Override
public void run() {
receiveMsg();
} public ChatClient(Socket socket) {
this.socket = socket;
} }
package com.test.chatServer;
import java.util.Vector;
public class ChatManager {
private static final ChatManager cm = new ChatManager();
private Vector<ChatClient> vector = new Vector<>();
public void add(ChatClient cc){
vector.add(cc);
}
public void sendToEveryone(ChatClient cc,String msg){
for (int i = ; i < vector.size(); i++) {
ChatClient client = vector.get(i);
if (!cc.equals(client)) {
client.output(msg);
}
}
}
private ChatManager(){
}
public static ChatManager getChatManager(){
return cm;
}
}
2.android客户端
package com.example.socketsample; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException; import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends Activity { private static final String IP = "192.168.1.100";
private static final int PORT = ;
private static final int TIME_OUT = ; private EditText ip,input;
private TextView msgList; private Socket socket; private BufferedReader reader;
private BufferedWriter writer; void connect(){ AsyncTask<Void, String, String> listnerThread = new AsyncTask<Void, String, String>(){
@Override
protected String doInBackground(Void... params) {
try {
//1,连接 socket
//socket不能在main线程中构造。
socket = new Socket();
//设置ip,端口,超时时间
socket.connect(new InetSocketAddress(ip.getText().toString(), PORT), TIME_OUT); //2,初始化 in流,out流
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
publishProgress("@success"); //3,从socket中读取内容
String line;
while ((line = reader.readLine())!= null) {
publishProgress(line);
}
}catch(UnknownHostException uhe) {
return "无法建立链接,主机名错误";
}catch(SocketTimeoutException ste){
return "连接 超时";
}catch(IOException ioe) {
return "IO异常" + ioe.getMessage();
}
return "执行完毕";
}
@Override
protected void onProgressUpdate(String... values) {
if (values[].equals("@success")) {
msgList.append("链接成功!");
}
msgList.append("其它人说:" + values[] + "\n");
}
@Override
protected void onPostExecute(String result) {
msgList.setText(result);
}
};
listnerThread.execute(); }
void send(){
try {
if (writer != null) {
msgList.append("你对其它人说:" + input.getText().toString() + "\n");
writer.write(input.getText().toString() + "\n");
writer.flush();
input.setText("");
}else{
msgList.setText("还没有连接");
}
} catch (IOException e) {
e.printStackTrace();
msgList.setText("写入数据异常");
}
} //------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); ip = (EditText) findViewById(R.id.edt_ip);
input = (EditText) findViewById(R.id.edt_input);
msgList = (TextView) findViewById(R.id.tv_msg_list); findViewById(R.id.btn_connect).setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
connect();
}
});
findViewById(R.id.btn_send).setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
send();
}
});
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/Linear_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" > <LinearLayout
android:id="@+id/Linear_top"
android:layout_width="match_parent"
android:layout_height="wrap_content" > <EditText
android:id="@+id/edt_ip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1.10"
android:ems="10"
android:text="192.168.1.100" /> <Button
android:id="@+id/btn_connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="connect" />
</LinearLayout> <TextView
android:id="@+id/tv_msg_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="msg list" /> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" > <EditText
android:id="@+id/edt_input"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="input your msg" > <requestFocus />
</EditText> <Button
android:id="@+id/btn_send"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="send" /> </LinearLayout> </LinearLayout>
Android Socket 聊天室示例的更多相关文章
- Java Socket聊天室编程(一)之利用socket实现聊天之消息推送
这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...
- Java Socket聊天室编程(二)之利用socket实现单聊聊天室
这篇文章主要介绍了Java Socket聊天室编程(二)之利用socket实现单聊聊天室的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在上篇文章Java Socket聊天室编程(一)之 ...
- h2engine游戏服务器设计之聊天室示例
游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...
- swoole webSocket 聊天室示例
swoole1.7.9增加了内置的WebSocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的WebSocket服务器. 基于swoole websocket的用户上下线通知,在线 ...
- python socket 聊天室
socket 发送的时候,使用的是全双工的形式,不是半双工的形式.全双工就是类似于电话,可以一直通信.并且,在发送后,如果又接受数据,那么在这个接受到数据之前,整个过程是不会停止的.会进行堵塞,堵塞就 ...
- TCP/IP以及Socket聊天室带类库源码分享
TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ...
- 以C#编写的Socket服务器的Android手机聊天室Demo
内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...
- Python Socket 编程——聊天室示例程序
上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...
- Android之聊天室设计与开发
我们要设计和实现一个有聊天室功能的APP,需要服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显 ...
随机推荐
- 【POJ】【2699】The Maximum Number of Strong Kings
网络流/最大流/二分or贪心 题目大意:有n个队伍,两两之间有一场比赛,胜者得分+1,负者得分+0,问最多有几只队伍打败了所有得分比他高的队伍? 可以想到如果存在这样的“strong king”那么一 ...
- 2010 Asia Fuzhou Regional Contest
A hard Aoshu Problem http://acm.hdu.edu.cn/showproblem.php?pid=3699 用深搜写排列,除法要注意,还有不能有前导零.当然可以5个for, ...
- Sprite Kit 入门教程
Sprite Kit 入门教程 Ray Wenderlich on September 30, 2013 Tweet 这篇文章还可以在这里找到 英语, 日语 If you're new here, ...
- 亚马逊 在线测试题目 amazon (变种的)三叉树的最近公共祖先问题
题目意思就是找一棵按上面链接所示的树对应的上面的两个点的最小公共祖先(LCP,Least Common Father),按照比较大小来依次返回自己的父亲节点就行了.具体看代码:getfather(a) ...
- Javascript引擎单线程机制及setTimeout执行原理说明
setTimeout用法在实际项目中还是会时常遇到.比如浏览器会聪明的等到一个函数堆栈结束后才改变DOM,如果再这个函数堆栈中把页面背景先从白色设为红色,再设回白色,那么浏览器会认为DOM没有发生任何 ...
- Windows Server
1. Windows Server 在试用license过期后会出现2小时一次的关机.如果暂时无法注册或者激活,下面的方法可以试试 taskkill /f /im wlms.exe ping -n 1 ...
- 动态修改 NodeJS 程序中的变量值
如果一个 NodeJS 进程正在运行,有办法修改程序中的变量值么?答案是:通过 V8 的 Debugger 接口可以!本文将详细介绍实现步骤. 启动一个 HTTP Server 用简单的 Hello ...
- 图解JavaScript执行环境结构
JavaScript引擎在开始编译代码的时候,会对JavaScript代码进行一次预编译,生成一个执行环境,比如如下代码: window.onload=function(){ function sub ...
- VS2010 Notes
1.fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 VS2010在经历一些更新后,建立Win32 Console Project时会出“error LNK112 ...
- eclipse加速
eclipse老是building workspace及自动更新问题,eclipse加速 最近用Eclipse开发oPhone的一个项目,每次打开Eclipse的时候,总是在build workspa ...