今天终于调试通了Socket一对一的聊天,每次发送连接请求后,将用户名发送到Socket中去,然后将用户名和新建的socket存到map中,然后根据用户名来确定接收方是谁,以实现一对一的聊天功能。

  上图是我看博客的时候截下来的图,这就是大概思路了。具体今天的实现,我写了一个界面,上边有服务器ip地址,用来连接服务器。

  以及发送方,接收方,消息内容。发送的时候,将这三条数据连接起来,末尾加"\n",以便readLine()函数读取内容。然后发送消息。三个按钮的单击事件如下所示,界面在后边会贴出来。

     //*****************************主要工作********************************
Socket socket = null;
BufferedReader br = null;
BufferedWriter bw = null;
protected void connect() { AsyncTask<Void, String, Void> reader = new AsyncTask<Void, String, Void>(){ @Override
protected Void doInBackground(Void... arg0) {
try {
socket = new Socket(editIp.getText().toString(), 12345);
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
publishProgress("@success");
} catch (UnknownHostException e1) {
Toast.makeText(MainActivity.this, "无法建立连接", Toast.LENGTH_SHORT).show();
} catch (IOException e1) {
Toast.makeText(MainActivity.this, "无法建立连接", Toast.LENGTH_SHORT).show();
}
try {
String line = "";
while((line = br.readLine()) != null){
publishProgress(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} @Override
protected void onProgressUpdate(String... values) {
// TODO Auto-generated method stub
if (values[0].equals("@success")) {
Toast.makeText(MainActivity.this, "连接成功", Toast.LENGTH_SHORT).show();
}
tvNeirong.append("对方说:"+values[0]+"\n");
super.onProgressUpdate(values);
}
};
reader.execute(); }
protected void login() {
// TODO Auto-generated method stub
try {
bw.write(editUsername.getText().toString()+"\n");
bw.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
protected void send() {
// TODO Auto-generated method stub
try {
tvNeirong.append("我说:"+editContent.getText().toString()+"\n");
//将消息内容连接为一个字符串,格式为FromID \n Content \n ToID \n
//因为将来读取时候用的是readLine()函数,所以必须加\n
String str = editUsername.getText().toString()+"\n"
+editContent.getText().toString()+"\n"
+editToID.getText().toString()+"\n";
bw.write(str);
bw.flush();
editContent.setText("");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

  然后我开了三个安卓模拟器,两个Eclipse,电脑内存飙到了百分之八十多,测试完成后赶紧关了,一顿卡,大概如下所示,三个用户为10001,10002,10003,我让10001->10002,10002->10003,10003->10001,这样互相发送消息,实现的效果如下图所示:

  然后贴出我的ServerSocket中的logcat内容,这些消息是封装成了Json字符串来发送的。

  

  消息的格式为FromID+"\n"+Content+"\n"+ToID+"\n",这样就组成了一个完整的字符串,readLine()函数遇到"\n"就会停止,每次将对应的变量解析出来,然后服务端再去发送消息就可以了。

  好了,有什么问题还会来这里补充,(仅供自己学习参考0.0)

一对一Socket简单聊天的实现的更多相关文章

  1. Python Socket 简单聊天室2

    上篇文章写了一个简单的单线程的一问一答的简单聊天室.这次我们使用SocketServer模块搭建一个多线程异步的聊天室. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

  2. Python Socket 简单聊天室1

    这是第一版,最简单的,仅仅实现了通信,你收我发,我收你发而已.下篇将介绍,基于异步多线程的聊天室: 客户端: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  3. Socket.IO聊天室~简单实用

    小编心语:大家过完圣诞准备迎元旦吧~小编在这里预祝大家元旦快乐!!这一次要分享的东西小编也不是很懂啊,总之小编把它拿出来是觉地比较稀奇,而且程序也没有那么难,是一个比较简单的程序,大家可以多多试试~ ...

  4. 利用socket.io+nodejs打造简单聊天室

    代码地址如下:http://www.demodashi.com/demo/11579.html 界面展示: 首先展示demo的结果界面,只是简单消息的发送和接收,包括发送文字和发送图片. ws说明: ...

  5. Android 基于Socket的聊天应用(二)

    很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...

  6. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

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

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

  8. 【WebSocket No.2】WebSocket和Socket实现聊天群发

    介绍: 前面写过一篇简单的websocke实现服务端.这一篇就不在说什么基础的东西主要是来用实例说话,主要是讲一下实现单聊和群组聊天和所有群发的思路设计. 直接不懂的可以看一下上一篇简单版本再来看也行 ...

  9. socket实现聊天功能(二)

    socket实现聊天功能(二) WebSocket协议是建立在HTTP协议之上,因此创建websocket服务时需要调用http模块的createServer方法.将生成的server作为参数传入so ...

随机推荐

  1. 学习c++需要知道

    1.c++投入和经济产出比目前较低,c++很复杂,学习难度高.周期长.而且开发效率低. 2.但是c++趋紧于完美语言,它囊括了多种编程范型.它运行效率高,对计算机有着极致的控制能力.适用于低层. 3. ...

  2. 关于自定义脚本rc.local里开机不启动的问题--以tomcat和perl相关的脚本为例

    本文将自己遇到的一些自定义脚本加入开机启动项却不成功的问题加以说明,花费了我很长时间才得以解决,当然也多谢了自己朋友的帮忙,正是因为他们的提醒,最后才找到了解决的办法,谢谢他们!!!! 系统是cent ...

  3. AngularJS 指令中的 replace:true

    默认值是fasle,模板会被当作子元素插入到调用此指令的元素内部. <my-directive></my-directive> myModule.directive(" ...

  4. AngularJS ngTemplate寄宿方式 模板缓存 $templateCache

    AngularJS的指令中经常定义模板(template或templateUrl),可以选择将Html模板直接寄宿在WEB容器中,如Tomcat.IIS.Nginx.NodeJs Express,也可 ...

  5. AngularJS 承诺 Promise

    一.概念解释 全称是未来与承诺,Futures and promises,是一种编程模式,不是AngularJS首创.javascript里有个流行库Q,而AngularJS是$q,其就是从Q引入的: ...

  6. MCU_存储器

    MCU的存储器用途: RAM:数据存储器,和计算机的内存差不多,主要是用来存放程序运行产生的过程数据,掉电后会丢失数据,因此程序在上电后需要进行初始化.程序中的全局变量占据着RAM中的固定空间,局部变 ...

  7. Oracle EBS主界面的Top Ten List

    http://blog.csdn.net/pan_tian/article/details/7749128 Top Ten List的数据保存在表FND_USER_DESKTOP_OBJECTS中,登 ...

  8. SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

    五.锁与事务隔离级别 事务隔离级别简单的说,就是当激活事务时,控制事务内因SQL语句产生的锁定需要保留多入,影响范围多大,以防止多人访问时,在事务内发生数据查询的错误.设置事务隔离级别将影响整条连接. ...

  9. 如何获取SQL中Print语句输出内容

    SqlConnection cn = new SqlConnection("server=my\\my2005;database=rdwhdata2005;user id=zjh;passw ...

  10. Java获取http和https网址对应html数据实例

    由于之前在公司一直用的C#做的软件开发,近些天有同学需要用Java做一个从指定网址获取信息的Java程序.正好不是很难,顺便复习了一下Java的知识. 要求如下,在https://www.marine ...