今天终于调试通了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)

最新文章

  1. localForage——轻松实现 Web 离线存储(转)
  2. 可用的rtmp互联网地址
  3. JBOSS只能本机localhost和127.0.0.1能访问的解决
  4. mac os安装基本的install环境,命令行安装软件
  5. UICollectionView使用以及与UITableView的区别
  6. 在windows下用cygwin和eclipse搭建cocos2dx(2.1.4)的android开发环
  7. WPF DataGrid 自动生成行号的方法(通过修改RowHeaderTemplate的方式)
  8. css hack 大全
  9. jQuery easyUI框架中经常出现的问题
  10. Linux软件
  11. 项目mysql数据导入数据的Java程序
  12. WCF技术剖析之九:服务代理不能得到及时关闭会有什么后果?
  13. jmeter3 测试soap协议-webservice接口
  14. 使用js编写一个简单的运动框架
  15. Codeforces Round #271 (Div. 2) F题 Ant colony(线段树)
  16. 为clang添加中文关键字
  17. IDEA的Maven依赖如何引入到External Libraries中
  18. Luogu P1257 平面上的最接近点对_暴力
  19. Unity编译时找不到AndroidSDK的问题 | Unable to list target platforms(转载)
  20. 【转】说说MySQL中的Redo log Undo log都在干啥

热门文章

  1. centos7,系统目录结构
  2. BT656与BT1120的区别
  3. 重建控制文件ORA-12720
  4. 用Dagger2在Android中实现依赖注入
  5. eclipse查看方法被那些代码调用open call hierarchy
  6. 2-Sat小结
  7. Anroid 手机助手 详细解析 概述(二)
  8. spring boot mybatis sql打印到控制台
  9. 由异常掉电问题---谈xfs文件系统
  10. spring mvc 的请求流程