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通信的更多相关文章

  1. Android客户端与Python服务器端的简单通信

    最近在做一个APP,需要与服务器通信,一点一点的尝试,记录一下. 本文使用了OkHttp和Flask框架. 参考博文:https://ai-exception.com/2018/06/13/%E4%B ...

  2. Android客户端与Python服务器端通信之上传图片

    继上篇成功的与服务器端通信上之后,我现在需要将安卓本地的图片上传到服务端.服务端接收图片存下来. 参考:https://blog.csdn.net/qq_26906345/article/detail ...

  3. android 客户端支付宝 php服务器端编写

    生成私钥 输入“genrsa -out rsa_private_key.pem 1024”命令,回车后,在当前 bin 文件目 录中会新增一个 rsa_private_key.pem 文件,其文件为原 ...

  4. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

  5. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  6. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  7. Android 之 Socket 通信

    Android 之 Socket 通信 联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket Server ...

  8. 基于android的Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...

  9. Android中Socket通信之TCP与UDP传输原理

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

随机推荐

  1. Java 8新特性-2 接口定义增强

    为了解决当原有的接口中方法不足时,向原有的接口中添加新的方法,该接口下的N多实现类也需要重写该方法的问题!Java8引入了接口定义增强概念! Java8 打破了原有的接口的方法定义: 公共的.抽象的  ...

  2. mysql表名查询sql

    select table_schema,table_name,engine from information_schema.tables where table_schema not in('info ...

  3. 在Excel表里面插入背景图

    工作中我们会经常用到MS Excel,通常我们打开MS Excel,里面的工作表都是空白单调的背景.当然了,MS Excel可以在工作簿里面插入背景图片.那么问题来了,如果你没有安装Microsoft ...

  4. 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

    (转载声明出处:http://www.cnblogs.com/linguanh/) 简介:      该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...

  5. 关于opencv中人脸识别主函数的部分注释详解。

    近段时间在搞opencv的视频人脸识别,无奈自带的分类器的准确度,实在是不怎么样,但又能怎样呢?自己又研究不清楚各大类检测算法. 正所谓,功能是由函数完成的,于是自己便看cvHaarDetectObj ...

  6. PHP中的魔术方法(2)

    1.__get.__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get( $property ) 当调用一个未定义的属性时访问此方法__set( $property, $value ...

  7. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

  8. 让 select 的 option 标签支持事件监听(如复制操作)

    这标题,让option支持事件监听,应该不难的呀,有什么好讲的? 其实还是有的,默认在浏览器代码是无法直接对option标签进行操作的,不仅包括JS事件监听,还是CSS样式设置 查了一些资料,姑且认为 ...

  9. iOS 视图控制器 (内容根据iOS编程编写)

    视图控制器是  UIViewController 类或其子类对象.每个视图控制器都负责管理一个视图层次结构,包括创建视图层级结构中的视图并处理相关用户事件,以及将整个视图层次结构添加到应用窗口. 创建 ...

  10. 迷惑很久,仅以个人想法谈谈MVC架构,希望大家多给点意见

    博主是非科班出身,所以和大部分新手有着一样的困惑,究竟什么才能算是MVC框架,总是在谈Model,View,Controller分离,可是究竟什么才能算是分离,而他们又是负责什么样的分工呢. 大二的时 ...