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 聊天室示例的更多相关文章

  1. Java Socket聊天室编程(一)之利用socket实现聊天之消息推送

    这篇文章主要介绍了Java Socket聊天室编程(一)之利用socket实现聊天之消息推送的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 网上已经有很多利用socket实现聊天的例子了 ...

  2. Java Socket聊天室编程(二)之利用socket实现单聊聊天室

    这篇文章主要介绍了Java Socket聊天室编程(二)之利用socket实现单聊聊天室的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下 在上篇文章Java Socket聊天室编程(一)之 ...

  3. h2engine游戏服务器设计之聊天室示例

    游戏服务器设计之聊天室示例 简介 h2engine引擎建群以后,有热心网友向我反馈,想尝试h2engine但是没有服务器开发经验觉得无从入手,希望我能提供一个简单明了的示例.由于前一段时间工作实在忙碌 ...

  4. swoole webSocket 聊天室示例

    swoole1.7.9增加了内置的WebSocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的WebSocket服务器. 基于swoole websocket的用户上下线通知,在线 ...

  5. python socket 聊天室

    socket 发送的时候,使用的是全双工的形式,不是半双工的形式.全双工就是类似于电话,可以一直通信.并且,在发送后,如果又接受数据,那么在这个接受到数据之前,整个过程是不会停止的.会进行堵塞,堵塞就 ...

  6. TCP/IP以及Socket聊天室带类库源码分享

    TCP/IP以及Socket聊天室带类库源码分享 最近遇到个设备,需要去和客户的软件做一个网络通信交互,一般的我们的上位机都是作为客户端来和设备通信的,这次要作为服务端来监听客户端,在这个背景下,我查 ...

  7. 以C#编写的Socket服务器的Android手机聊天室Demo

    内容摘要 1.程序架构 2.通信协议 3.服务器源代码 4.客户端源代码 5.运行效果 一.程序架构 在开发一个聊天室程序时,我们可以使用Socket.Remoting.WCF这些具有双向通信的协议或 ...

  8. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  9. Android之聊天室设计与开发

    我们要设计和实现一个有聊天室功能的APP,需要服务器不断读取来自客户端的信息,并即时地将信息发送给每个连接到本服务器上的客户端,每个客户端可以向服务器发送消息,并不断地接收来自服务器的消息,并将消息显 ...

随机推荐

  1. 使用log4javascript记录日志

    1.定义log4js服务类,用于初始化log4javascript相关参数 log4jsService.js //启用javascript 日志功能 var logger = log4javascri ...

  2. 【CentOS】Eclipse中svn插件使用

    目录: 1.安装 2.使用 3.错误 1.安装 svn插件地址: Subclipse 1.6.x Update Site - http://subclipse.tigris.org/update_1. ...

  3. Noip2015总结

    Noip2015战役总结 [游记部分] Day0 考前说是可以放松一下,下午呢就在机房打了几盘杀,一起玩了玩狼人.不过晚上觉得还是要有点氛围了,于是稍稍打了几个模板,觉得正确率还不错,给自己一点自信的 ...

  4. 【BZOJ】【3007】拯救小云公主

    思路题 我的naive的做法是二分答案+判定是否有路径可走……但是没有正确理解[走的方向任意]这句话…… 其实就是说想咋走咋走= =360°无死角乱走…… 所以其实是个平面上的问题…… 我们可以换个方 ...

  5. Linux命令 + Shell

    1. 之前利用Ubuntu14.10的镜像安装了个虚拟机,本以为自己在windows上的就是管理员的权限,就理所当然的认为虚拟的Linux系统也是root权限.而且虽然@符号前的的标识不是root,但 ...

  6. 来自平时工作中的css知识的积累---持续补充中

    ① 现代浏览器中,<img>元素默认情况下底部会有空白,那么这个空白到底是从哪里来的? 解惑: method-one:猛戳 来自知乎的解答 method-two: 延伸阅读 what is ...

  7. JavaScript 文件上传类型判断

    文件上传时用到一个功能,使用html元素的input标签实现, <input id="imageFile" name="imageFile1" accep ...

  8. Linuxshell脚本之if条件判断

    IF条件判断 .基本语法: if [ command ]; then 符合该条件执行的语句 fi .扩展语法: if [ command ];then 符合该条件执行的语句 elif [ comman ...

  9. ZOJ3718 Diablo II(状态压缩dp)

    题意:一个人物有K(K<=7)种技能,每种技能都有bi,ci,di值,表示该技能不能点超过bi次,每点一次加ci,点满bi次有一个附加得分di.然后还有N件武器,武器本身会有能力加成,然后每个武 ...

  10. 【mysql5.6】连接vs2010

    参考这篇博客:http://www.tuicool.com/articles/mUZNne 配置:vs2010项目属性里面配置包含目录和库目录. 包含目录:C:\Program Files\MySQL ...