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,需要服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显 ...
随机推荐
- 【HDOJ】【3530】Subsequence
DP/单调队列优化 题解:http://www.cnblogs.com/yymore/archive/2011/06/22/2087553.html 引用: 首先我们要明确几件事情 1.假设我们现在知 ...
- 【BZOJ】【1096】【ZJOI2007】仓库建设
DP/斜率优化 Orz Hzwer 八中好像挂了……明天再提交吧…… UPD:2015-03-12 17:24:43 算了,毕竟是第一道题,还是仔细写一下斜率优化的过程吧.(部分引自Hzwer的题解) ...
- 【bzoj1008】[HNOI2008]越狱
1008: [HNOI2008]越狱 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 7692 Solved: 3296[Submit][Status] ...
- delete错误
今天找了半天delete错误,后来才知道是MTd和MDd模式的问题,MTd的内存申请和释放必须在同一个模块里面,接口上面不能使用stl等,MDd可以使用.改成MDd就可以了
- Request/Server的相关topic
Request---------Server模式 HTTP 协议--------->这个可能返回json, 也可能是HTML HTML页面处理的流程以及资源文件的加载 浏览器最大连接数 js资源 ...
- mysql关联修改SQL及long与datetime类型相互转换
1.关联修改 #解决思路 UPDATE tb1,tb2 SET tb1.address=tb2.address WHERE tb1.name=tb2.name UPDATE car c,tmpcolo ...
- MYSQL注入天书之后记
后记 对于工具的看法: 我之所以在每个例子中只写了几个示例,是因为我希望你能通过这一两个示例举一反三将其他的列出来.如果让我来完成每一次完整的注入,应该在知道原理的情况下,必然使用工具或者自己写代码实 ...
- chrome 网络面板
Chrome Timeline的指标说明:Blocked.Connect.Send.Wait.Receive Blocked time includes any pre-processing time ...
- UVA 624 CD(01背包+输出方案)
01背包,由于要输出方案,所以还要在dp的同时,保存一下路径. #include <iostream> #include <stdio.h> #include <stri ...
- HTML5 webSQL
https://www.ibm.com/developerworks/cn/web/1108_zhaifeng_websqldb/ <!DOCTYPE HTML> <html&g ...