Android客户端与服务器端的Socket通讯:

socket通讯依赖IP地址和端口号,每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。

服务器端代码:

实例化主类,定义端口号的主方法:

package com.example.socketdemoclient;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Main {private static final int PORT = 9999;private List<Socket> mList = new ArrayList<Socket>();private ServerSocket server = null;private ExecutorService mExecutorService = null; //thread poolpublic static void main(String[] args) {new Main();}public Main() {try {//实例化一个Socket服务server = new ServerSocket(PORT);//启动一个线程池mExecutorService = Executors.newCachedThreadPool();  //create a thread poolSystem.out.println("服务器已启动...");Socket client = null;while(true) {client = server.accept();//把客户端放入客户端集合中mList.add(client);mExecutorService.execute(new Service(client)); //start a new thread to handle the connection}}catch (Exception e) {e.printStackTrace();}}class Service implements Runnable {private Socket socket;private BufferedReader in = null;private String msg = "";public Service(Socket socket) {this.socket = socket;try {in = new BufferedReader(new InputStreamReader(socket.getInputStream()));//客户端只要一连到服务器,便向客户端发送下面的信息。msg = "服务器地址:" +this.socket.getInetAddress() + "come toal:"+mList.size()+"(服务器发送)";this.sendmsg();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void run() {try {while(true) {if((msg = in.readLine())!= null) {//当客户端发送的信息为:exit时,关闭连接if(msg.equals("exit")) {System.out.println("ssssssss");mList.remove(socket);in.close();msg = "user:" + socket.getInetAddress()+ "exit total:" + mList.size();socket.close();this.sendmsg();break;//接收客户端发过来的信息msg,然后发送给客户端。} else {msg = socket.getInetAddress() + ":" + msg+"(服务器发送)";this.sendmsg();}}}} catch (Exception e) {e.printStackTrace();}}/*** 循环遍历客户端集合,给每个客户端都发送信息。*/public void sendmsg() {System.out.println(msg);int num =mList.size();for (int index = 0; index < num; index ++) {Socket mSocket = mList.get(index);PrintWriter pout = null;try {pout = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())),true);pout.println(msg);}catch (IOException e) {e.printStackTrace();}}}}
}

socket服务Server类:

package com.test.socket.message;import java.io.*;
import java.net.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.JOptionPane;public class Server {ServerSocket ss = null;private String getnameString=null;boolean started = false;List<Client> clients = new ArrayList<Client>();List<Info> infos = new ArrayList<Info>();public static void main(String[] args) {//弹出框,出入端口号String inputport = JOptionPane.showInputDialog("請輸入該服務器使用的端口:");int port = Integer.parseInt(inputport);new Server().start(port);}public void start(int port) {try {ss = new ServerSocket(port);System.out.println("服務器啟動");started = true;} catch (BindException e) {System.out.println(" 端口已经被占用");System.exit(0);}catch (IOException e) {e.printStackTrace();}try {while (started) {Socket s = ss.accept();Client c = new Client (s);System.out.println("a client is connected");new Thread(c).start();clients.add(c);}} catch (IOException e) {e.printStackTrace();}finally {try {ss.close();} catch (IOException e) {e.printStackTrace();}}}public List<Client> getClient(){return clients;}class Client implements Runnable {private String chatKey="SLEEKNETGEOCK4stsjeS";private Socket s = null;private DataInputStream dis = null;private DataOutputStream dos = null;private boolean bConnected = false;private String sendmsg=null;Client (Socket s) {this.s = s;try {dis = new DataInputStream (s.getInputStream());dos = new DataOutputStream (s.getOutputStream());bConnected = true;} catch(IOException e) {e.printStackTrace();}}public void send (String str) {try {//System.out.println(s);dos.writeUTF(str+"");dos.flush();} catch(IOException e) {clients.remove(this);System.out.println("对方已经退出了");}}public void run() {try {while (bConnected) {String str = dis.readUTF();DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String date = "  ["+df.format(new Date())+"]";if(str.startsWith(chatKey+"online:")){Info info = new Info();getnameString = str.substring(27);info.setName(getnameString);infos.add(info);for (int i=0; i<clients.size(); i++) {Client c = clients.get(i);c.send(getnameString+" on line."+date);}System.out.println(getnameString+" on line."+date);}else if(str.startsWith(chatKey+"offline:")){getnameString = str.substring(28);clients.remove(this);for (int i=0; i<clients.size(); i++) {Client c = clients.get(i);c.send(getnameString+" off line."+date);}System.out.println(getnameString+" off line."+date);}else{int charend = str.indexOf("end;");String chatString = str.substring(charend+4);String chatName = str.substring(25, charend);sendmsg=chatName+date+"\n"+chatString; for (int i=0; i<clients.size(); i++) {Client c = clients.get(i);c.send(sendmsg);}System.out.println(sendmsg);}}} catch (SocketException e) {System.out.println("client is closed!");clients.remove(this);} catch (EOFException e) {System.out.println("client is closed!");clients.remove(this);}catch (IOException e) {e.printStackTrace();}finally {try {if (dis != null) dis.close();if (dos != null) dos.close();if (s != null) s.close();} catch (IOException e) {e.printStackTrace();}}}}class Info{private String info_name = null;public Info(){}public void setName(String name){info_name = name;}public String getName(){return info_name;}}
}

服务器端代码:

Android客户端:

package com.example.socketdemoclient;import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;public class MainActivity extends Activity implements Runnable {private TextView tv_msg = null;private EditText ed_msg = null;private Button btn_send = null;// private Button btn_login = null;private static final String HOST = "10.0.2.2";private static final int PORT = 9999;private Socket socket = null;private BufferedReader in = null;private PrintWriter out = null;private String content = "";// 接收线程发送过来信息,并用TextView显示public Handler mHandler = new Handler() {public void handleMessage(Message msg) {super.handleMessage(msg);tv_msg.setText(content);}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv_msg = (TextView) findViewById(R.id.TextView);ed_msg = (EditText) findViewById(R.id.EditText01);btn_send = (Button) findViewById(R.id.Button02);try {socket = new Socket(HOST, PORT);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);} catch (IOException ex) {ex.printStackTrace();ShowDialog("login exception" + ex.getMessage());}btn_send.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString msg = ed_msg.getText().toString();if (socket.isConnected()) {if (!socket.isOutputShutdown()) {out.println(msg);}}}});// 启动线程,接收服务器发送过来的数据new Thread(MainActivity.this).start();}/*** 如果连接出现异常,弹出AlertDialog!*/public void ShowDialog(String msg) {new AlertDialog.Builder(this).setTitle("notification").setMessage(msg).setPositiveButton("ok", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();}/*** 读取服务器发来的信息,并通过Handler发给UI线程*/public void run() {try {while (true) {if (!socket.isClosed()) {if (socket.isConnected()) {if (!socket.isInputShutdown()) {if ((content = in.readLine()) != null) {content += "\n";mHandler.sendMessage(mHandler.obtainMessage());} else {}}}}}} catch (Exception e) {e.printStackTrace();}}
}

权限:

<uses-permission android:name="android.permission.INTERNET" />

转载于:https://my.oschina.net/u/2326375/blog/751677

Android客户端与服务器端socket通讯相关推荐

  1. Android客户端请求服务器端的详细解释(附源代码)

    Android客户端请求服务器端的详细解释 1. Android客户端与服务器端通信方式: Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和po ...

  2. 一个简单的Android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...

  3. Android 客户端与服务器端进行数据交互(一、登录服务器端)

    概要 安卓APP要实现很多功能(比如登录注册.发表评论等)时都必须要使用到网络数据交互.所以在学习了这部分内容后,就将其以最常见的登录过程为例整理出来,也方便跟我一样的新手能迅速学习上手. 预期效果图 ...

  4. Socket编程(Android客户端+PC服务器端)

    一个多月没有写东西了,感觉像过了一个暑假...废话不多说了,今天来记录一下这两天学习Socket的内容.按照我研究思路来进行一步步的深入Socket. 一.什么是Socket 网络上的两个程序通过一个 ...

  5. android okhttpclient设置编码,Android之okhttp实现socket通讯(非原创)

    文章大纲 一.okhttp基础介绍二.socket通讯代码实战三.项目源码下载四.参考文章 一.okhttp基础介绍 二.socket通讯代码实战 1. 添加依赖和权限 app的build.gradl ...

  6. android客户端从服务器端获取json数据并解析的实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 代码如下: /** * 从指定的URL中获取 ...

  7. android端与服务端差别,Android客户端和服务器端编程

    我正在尝试运行我在网上找到的服务器端和客户端示例. 这是服务器: public class ServerActivity extends Activity { private TextView ser ...

  8. Android实现远程控制PC(Android[客户端]+Qt[服务器端])

    由于本人没有无线路由器,因此用Win7自带的虚拟wifi让手机上网:Win7虚拟wifi 但是,电脑不在我的房间,因此每天晚上在床上玩完手机还要下床去关电脑,让很懒很懒的本人很不爽,因此自己尝试着做了 ...

  9. Android客户端与服务器端交互,如何保持session回话

    前言 最近在开发项目的过程中,遇到Android与web服务器要在同一session下通信的问题. 一.Session与Cookie的共性与区别: ①.共性 Cookie和Session都为了用来保存 ...

最新文章

  1. ios 代码设置控件宽高比_用宽高比调整UIImage的大小?
  2. 关于java文件扩展名认识
  3. 跨境电商Crazysales的高稳定性架构实践
  4. android通话记录列表apk,android打电话,发短信,获取通讯录、通话记录、短信记录...
  5. 力扣刷题常用数据结构和方法(java版本)
  6. 三周第三次课 3.7 su命令 3.8 sudo命令 3.9 限制root远程登录
  7. java android rsa加密解密_Android RSA数据加密与Java服务端RSA私钥解密出错问题
  8. 想要接触人工智能吗?先要学会如何阅读论文
  9. u8显示云服务器已离线_u8登录不知道这样的主机
  10. Java并发包实际应用_Java并发包之核心AQS
  11. 电脑装机人员、管理软件安装实施人员必备工具包使用教程汇总值得收藏
  12. Unicode 字符集
  13. 数据科学风云之互联网金融
  14. 【计算机网络】网络层 : 无分类编址 CIDR ( 编址发展 | CIDR 优点 | CIDR 相关计算 | 构成超网 | 最长前缀匹配 | 计算示例 )★
  15. 高中数学竞赛和信息学竞赛_将数学竞赛变成编码竞赛
  16. 带图片指示器的进度条
  17. Java对接谷歌身份验证器
  18. Exchange 2007 被攻击
  19. np.clip的使用方法
  20. 数据传输速率度量单位指标-比特、波特率和码元的关系

热门文章

  1. IOS 个人证书的申请
  2. mysql中查找出生日期_如何在MySQL中根据出生日期记录显示日期名称?
  3. linux iptables mac,mac下的iptables---pfctl
  4. 微型计算机与显示器的线怎么,显示器与主机的连接线_显示器与主机怎么连接...
  5. es 聚合查询 java api_javaAPI操作ES分组聚合
  6. Ubuntu系统软链接的建立与删除
  7. 佳能r3和佳能r5哪个好
  8. BNUZ-ACM 2018国庆新生欢乐赛部分题解+思路(已解出答案部分)
  9. U盘EFI分区删不掉怎么办
  10. PDF在线编辑器的实现