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. iOS 使用xib后获取view的frame出错的问题

    如果控制器使用xib做的,在viewDidLoad方法中获取的view.frame是不正确的 这根xib的加载有关, 可以把需要做的事情写在viewWillAppear中就能解决

  2. 探秘Tomcat——连接篇

    前两篇我们分别粗线条和细粒度的讲解了tomcat的服务是如何启动以及连接器Connector和容器Container又分别是如何被启动的. 本篇我们主要侧重tomcat中server.service以 ...

  3. 奇妙的NULL值,你知道多少

    <NULL值的多义性分析> 谈到NULL值,很多人都是很熟悉,但是深入了解后,又感觉到陌生,对其含义和用法,都无法很准确的理解.NULL在数据库和编程语言中,存在的意义和附带的含义不同. ...

  4. WebSocket 学习(三)--用nodejs搭建服务器

    前面已经学习了WebSocket API,包括事件.方法和属性.详情:WebSocket(二)--API  WebSocket是基于事件驱动,支持全双工通信.下面通过三个简单例子体验一下. 简单开始 ...

  5. maven pom中 设置远程仓库url

    <repositories> <!--<repository>--> <!--<id>spring-snapshots</id>--& ...

  6. maven全局配置文件settings.xml详解

    概要 settings.xml有什么用? 如果在Eclipse中使用过Maven插件,想必会有这个经验:配置settings.xml文件的路径. settings.xml文件是干什么的,为什么要配置它 ...

  7. mybatis入门基础(八)-----查询缓存

    一.什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 1.1. 一级缓存是sqlSession级别的缓存.在操作数据库时需要构造 ...

  8. mybatis入门基础(六)----高级映射(一对一,一对多,多对多)

    一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: CREATE TABLE items ( id INT NOT NULL AUTO_INCREMENT, itemsname ) NOT ...

  9. [Web API] Web API 2 深入系列(2) 消息管道

    目录 HttpMessageHandler Web Host模式处理过程 Self Host模式处理过程 HttpMessageHandler Web API处理管道由一系列HttpMessageHa ...

  10. let与const的区别

    let与const都是只在声明所在的块级作用域内有效. let声明的变量可以改变,值和类型都可以改变,没有限制. const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不 ...