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