Android客户端与Eclipse服务器端的Socket通信
Server端代码
用来实现客户端socket的监听
package MyServer; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector; import javax.swing.JOptionPane; public class MyServerSocket
{
private Vector<ChatSocket> vector=new Vector<ChatSocket>();//存放所有的客户端socket
public MyServerSocket()
{
try
{
ServerSocket serverSocket=new ServerSocket(13345);//服务端开启对端口13345的监听
while(true)
{
Socket socket=serverSocket.accept();//服务器端提供与客户端相对应的socket
JOptionPane.showMessageDialog(null, "已经有客户端连入");
ChatSocket cs=new ChatSocket(socket,vector);//对每一个客户端都提供一个ChatSocket类来进行信息的交互
add(cs);
cs.start();
}
} catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public void add(ChatSocket csSocket)//服务器端添加每一个客户端socket
{
vector.add(csSocket);
}
public static void main(String[]args)
{
new MyServerSocket();
}
}
ChatSocket类,继承Thread线程类,进行与每个客户端进行信息交互的任务
package MyServer; import java.io.BufferedOutputStream;
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.io.UnsupportedEncodingException;
import java.net.Socket;
import java.nio.Buffer;
import java.util.Vector; import javax.swing.text.AbstractDocument.BranchElement;
/**
*
* @author hcc
*客户端与服务端进行信息交互的Chat类
*/
public class ChatSocket extends Thread
{
Socket socket;
Vector<ChatSocket>vector;
public ChatSocket(Socket s,Vector<ChatSocket>vector)
{
this.socket=s;
this.vector = vector;
}
public void out(String out)//服务器发送消息给客户端
{
try
{
BufferedWriter bfWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
bfWriter.write(out+"\n");
bfWriter.flush();//清空缓冲区,避免消息延迟显示
} catch (UnsupportedEncodingException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
} catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
@Override
public void run()
{
try
{
BufferedReader bufferedReader=new BufferedReader(
new InputStreamReader(
socket.getInputStream()));
String line = null;
while((line=bufferedReader.readLine())!=null)//服务端接收客户端的消息
{
sendMessage(this, line);//转发给其他客户端
System.out.println(line);
}
bufferedReader.close();
} catch (IOException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
public void sendMessage(ChatSocket cs,String out)
{
for(int i=0;i<vector.size();i++)
{
ChatSocket csChatSocket=vector.get(i);
if(!cs.equals(csChatSocket))//将发送该消息的客户端除外
{
csChatSocket.out(out);
}
}
} }
android端的客户端代码
package com.hcc.mysocketclient; import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast; import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.logging.SocketHandler; public class MainActivity extends AppCompatActivity {
Button conBtn;
EditText ipText;
Button sendBtn;
EditText sendText;
TextView textView;
Socket clientSocket;
BufferedReader bfReader;
BufferedWriter bfWriter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViews();
conBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
connect();
}
});
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
send();
}
});
}
private void findViews(){
conBtn = (Button)findViewById(R.id.con_btn);
sendBtn = (Button)findViewById(R.id.send_btn);
ipText = (EditText)findViewById(R.id.ip_text);
sendText = (EditText)findViewById(R.id.send_text);
textView = (TextView)findViewById(R.id.content_text);
}
private void connect(){
AsyncTask<Void,String,Void> reader = new AsyncTask<Void, String, Void>() {
@Override
protected Void doInBackground(Void... params) {
try {
clientSocket = new Socket("10.62.37.152",13345);
//客户端建立与服务端socket的连接,"10.62.37.152"为我的局域网ip地址,读者按照自己的ip地址进行相应修改
bfWriter = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
bfReader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
}
try {
String line = "hello";
while((line = bfReader.readLine())!=null){
publishProgress(line);//接收从服务端转发来的消息
}
} catch (IOException e) {
Toast.makeText(getApplicationContext(),"读取消息失败",Toast.LENGTH_LONG).show();
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
textView.append("别人说:" + values[0] + "\n");
super.onProgressUpdate(values);
}
};
reader.execute();
}
//发送消息给服务端
private void send(){
try {
textView.append("我说"+sendText.getText().toString()+"\n");
bfWriter.write(sendText.getText().toString() + "\n");
bfWriter.flush();
} catch (IOException e) {
Toast.makeText(getApplicationContext(),"无法建立连接",Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
}
xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/ip_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/con_btn"
android:text="Connect"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="match_parent"
android:layout_height="280dp"
android:id="@+id/content_text"/>
<EditText
android:id="@+id/send_text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:text="send"
android:id="@+id/send_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
最后的效果图

客户端可开启两个及以上的虚拟机进行客户端的聊天
Android客户端与Eclipse服务器端的Socket通信的更多相关文章
- Android客户端与Python服务器端的简单通信
最近在做一个APP,需要与服务器通信,一点一点的尝试,记录一下. 本文使用了OkHttp和Flask框架. 参考博文:https://ai-exception.com/2018/06/13/%E4%B ...
- Android客户端与Python服务器端通信之上传图片
继上篇成功的与服务器端通信上之后,我现在需要将安卓本地的图片上传到服务端.服务端接收图片存下来. 参考:https://blog.csdn.net/qq_26906345/article/detail ...
- android 客户端支付宝 php服务器端编写
生成私钥 输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原 ...
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
- Android之Socket通信、List加载更多、Spinner下拉列表
Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...
- Android开发--Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
- Android 之 Socket 通信
Android 之 Socket 通信 联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket Server ...
- 基于android的Socket通信
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...
- Android中Socket通信之TCP与UDP传输原理
一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...
随机推荐
- Web前端上万字的知识总结
下面是自己学HTML+DIV+CSS+JS时的学习笔记,给大家分享以下,相互学习.大二时候寒假在家无聊的时候想做点事,总结了一下web前端基础的东西,下面的每个字都是自己手敲的. 1.<html ...
- IDDD 实现领域驱动设计-CQRS(命令查询职责分离)和 EDA(事件驱动架构)
上一篇:<IDDD 实现领域驱动设计-SOA.REST 和六边形架构> 阅读目录: CQRS-命令查询职责分离 EDA-事件驱动架构 Domin Event-领域事件 Long-Runni ...
- 微信小程序小技巧系列《一》幻灯片,tab导航切换
作者:gou-tian 来自:github 幻灯片 使用微信小程序原生组件swiper实现. <swiper indicator-dots="{{indicatorDots}}&quo ...
- WebGIS中兴趣点简单查询、基于Lucene分词查询的设计和实现
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 兴趣点查询是指:输入框中输入地名.人名等查询信息后,地图上可 ...
- APP接口自动化测试JAVA+TestNG(三)之HTTP接口测试实例
前言 前两篇普及相关基础知识后,本篇主要对举例对国家气象局接口自动化测试进行讲解(Get请求及结果断言),以达到自动化测试入门目的,除了前两篇的一些了解外,需要有一定的JAVA知识(HTTP相 ...
- jQuery-1.9.1源码分析系列(一)整体架构续
这一节主要是jQuery中最基础的几个东东 2. jQuery的几个基础属性和函数 a. jQuery.noConflict函数详解 在jQuery初始化的时候保存了外部的$和jQuery _j ...
- 基于MVC4+EasyUI的Web开发框架经验总结(16)--使用云打印控件C-Lodop打印页面或套打报关运单信息
在最新的MVC4+EasyUI的Web开发框架里面,我整合了关于网购运单处理的一个模块,其中整合了客户导单.运单合并.到货扫描.扣仓.出仓.查询等各个模块的操作,里面涉及到一些运单套打的操作,不过由于 ...
- Repeater 控件
Repeater 控件是一个容器控件,可用于从网页的任何可用数据中创建自定义列表.Repeater 控件没有自己内置的呈现功能,这意味着用户必须通过创建模板来提供 Repeater 控件的布局.当网页 ...
- 第 31 章 项目实战-PC端固定布局[2]
学习要点: 1.大纲算法 2.section和div 3.结构分析 主讲教师:李炎恢 本章主要开始使用学习用HTML5和CSS3来构建Web页面,第一个项目采用PC端 固定布局来实现. 一.大纲算法 ...
- ASP.NET MVC搭建项目后台UI框架—6、客户管理(添加、修改、查询、分页)
目录 ASP.NET MVC搭建项目后台UI框架—1.后台主框架 ASP.NET MVC搭建项目后台UI框架—2.菜单特效 ASP.NET MVC搭建项目后台UI框架—3.面板折叠和展开 ASP.NE ...