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,需要服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显 ...
随机推荐
- 使用XmlInclude解决WebService调用时无法识别子类的异常
一.定义抽象类及子类,WebMethod实际返回子类参数 //使用XmlInclude解决WebService调用时无法识别子类的异常 [System.Xml.Serialization.XmlInc ...
- Ionic 安装部署
Ionic 安装部署 准备工作 下载安装Node.js, JDK,Apache Ant,Android SDK:编辑器用WebStorm node jdk ant 均需要加进 环境变量path中 An ...
- 设计模式之策略模式(strategy)
策略模式原理:策略模式和简单工厂模式有点类似,只是简单工厂模式产生的是对象,策略模式产生的是根据对象产生的算法. 代码如下: #include <iostream> #include &l ...
- 【BZOJ】【1001】 【BJOI2006】狼抓兔子
平面图最小割->对偶图最短路 平面图最小割转对偶图最短路= = 想到了就比较好写了…… 可能是我对区域的标号方式比较奇特?反正我没有特判n==1||m==1也能过2333(机智吧-(滚开啦你个自 ...
- 手写PE文件(一)
DOS Header(IMAGE_DOS_HEADER)->64 Byte DOS头部 DOS Stub 112字节 "PE"00(Signature) 4个字节 IMAGE ...
- 偏序集的Dilworth定理
定理1 令(X,≤)是一个有限偏序集,并令r是其最大链的大小.则X可以被划分成r个但不能再少的反链.其对偶定理称为Dilworth定理:定理2 令(X,≤)是一个有限偏序集,并令m是反链的最大的大小. ...
- POJ 1700 Crossing River (贪心)
Crossing River Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9585 Accepted: 3622 Descri ...
- css 内联元素inline 行框全解
首先看一篇文章: CSS框模型:一切皆为框 — 从行框说起 一 行框 看图说话 上图代表了框模型中的行框.line-height 属性设置行间的距离(行高).该属性会影响行框的布局.在应用到一个块级元 ...
- APM终端用户体验监控分析(下)
一.前言 [APM 终端用户体验监控分析(上)][1]从 APM 终端用户产品特性.使用建议.以及从[真实用户体验][2]和[模拟性能监控][3]两方面入手给大家进行了简单的分享. 本文为下篇,将给大 ...
- Activity学习(四)——简单切换
理论学习Activity之后,我们就来具体的实战,Activity之间相互切换依靠的是“ 意图 ”(Intent),这个 Intent 包含了要跳转到的Activity的一些信息,因为Activity ...