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连接使用的是"请求-响应方式",即在请求时 ...
随机推荐
- EntityFramework之异步、事务及性能优化(九)
前言 本文开始前我将循序渐进先了解下实现EF中的异步,并将重点主要是放在EF中的事务以及性能优化上,希望通过此文能够帮助到你. 异步 既然是异步我们就得知道我们知道在什么情况下需要使用异步编程,当等待 ...
- Notes: select选择框
HTML选择框通过select标签创建,该元素是HTMLSelectElement的实例,拥有以下属性和方法: selectedIndex:选中项的索引 options:选择框的所有选项 add:向选 ...
- 【LeetCode】Increasing Triplet Subsequence(334)
1. Description Given an unsorted array return whether an increasing subsequence of length 3 exists o ...
- 3.Java网络编程之IP
前面两篇博文我们已经简单了解了IP.端口.协议以及两种参考模型,我们现在重新从程序角度来看下这个参考模型. 如果我们从事的是Web网站开发,那么我们应该知道HTML是一种超文本标记语言 (Hyper ...
- YAML 语法
YAML 语法 来源:yaml 这个页面提供一个正确的 YAML 语法的基本概述, 它被用来描述一个 playbooks(我们的配置管理语言). 我们使用 YAML 是因为它像 XML 或 JSON ...
- AngularJS----服务,表单,模块
AngularJS中的服务 服务是一个函数或对象,AngularJS中可以创建自己的服务或使用内建服务.$http是AngularJS中最常见的服务,服务向服务器发送请求,应用响应服务器传送过来的数据 ...
- .NET 扩展方法 (二)
上一篇随笔 .NET 扩展方法 (一) 已经对 扩展方法有了大致的介绍,这篇算是一个补充,让我们来看一下扩展方法的几个细节: 一.扩展方法具有继承性 当使用扩展方法扩展一个类型的时候,其也扩展了派生类 ...
- 好的Ui界面地址
http://121.40.148.178:8080/http://www.uimaker.com/http://www.uimaker.com/uimakerhtml/bshtml/124261.h ...
- Android Studio :enable vt-x in your bios security,已经打开还是报错的解决方法
quote: For Windows 10: First of all, install the intelhaxm-android.exe located in the folder SDK\ext ...
- laravel5 数据库配置(MySQL)
laravel5 数据库配置(MySQL) 首先有一个安装完成可以运行的laravel框架. 配置database.php 进入laravel根目录. 在config目录下找到database.php ...