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,需要服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显 ...
随机推荐
- 使用log4javascript记录日志
1.定义log4js服务类,用于初始化log4javascript相关参数 log4jsService.js //启用javascript 日志功能 var logger = log4javascri ...
- 【CentOS】Eclipse中svn插件使用
目录: 1.安装 2.使用 3.错误 1.安装 svn插件地址: Subclipse 1.6.x Update Site - http://subclipse.tigris.org/update_1. ...
- Noip2015总结
Noip2015战役总结 [游记部分] Day0 考前说是可以放松一下,下午呢就在机房打了几盘杀,一起玩了玩狼人.不过晚上觉得还是要有点氛围了,于是稍稍打了几个模板,觉得正确率还不错,给自己一点自信的 ...
- 【BZOJ】【3007】拯救小云公主
思路题 我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解[走的方向任意]这句话…… 其实就是说想咋走咋走= =360°无死角乱走…… 所以其实是个平面上的问题…… 我们可以换个方 ...
- Linux命令 + Shell
1. 之前利用Ubuntu14.10的镜像安装了个虚拟机,本以为自己在windows上的就是管理员的权限,就理所当然的认为虚拟的Linux系统也是root权限.而且虽然@符号前的的标识不是root,但 ...
- 来自平时工作中的css知识的积累---持续补充中
① 现代浏览器中,<img>元素默认情况下底部会有空白,那么这个空白到底是从哪里来的? 解惑: method-one:猛戳 来自知乎的解答 method-two: 延伸阅读 what is ...
- JavaScript 文件上传类型判断
文件上传时用到一个功能,使用html元素的input标签实现, <input id="imageFile" name="imageFile1" accep ...
- Linuxshell脚本之if条件判断
IF条件判断 .基本语法: if [ command ]; then 符合该条件执行的语句 fi .扩展语法: if [ command ];then 符合该条件执行的语句 elif [ comman ...
- ZOJ3718 Diablo II(状态压缩dp)
题意:一个人物有K(K<=7)种技能,每种技能都有bi,ci,di值,表示该技能不能点超过bi次,每点一次加ci,点满bi次有一个附加得分di.然后还有N件武器,武器本身会有能力加成,然后每个武 ...
- 【mysql5.6】连接vs2010
参考这篇博客:http://www.tuicool.com/articles/mUZNne 配置:vs2010项目属性里面配置包含目录和库目录. 包含目录:C:\Program Files\MySQL ...