一个androidsocket的例子(转)

~小小鸟~ ~小小鸟~     2022-07-28     419

关键词:

1.开篇简介

  Socket本质上就是Java封装了传输层上的TCP协议(注:UDP用的是DatagramSocket类)。要实现Socket的传输,需要构建客户端和服务器端。另外,传输的数据可以是字符串和字节。字符串传输主要用于简单的应用,比较复杂的应用(比如Java和C++进行通信),往往需要构建自己的应用层规则(类似于应用层协议),并用字节来传输。

2.基于字符串传输的Socket案例

  1)服务器端代码(基于控制台的应用程序,模拟)

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 pool
    
    public static void main(String[] args) {
        new Main();
    }
    public Main() {
        try {
            server = new ServerSocket(PORT);
            mExecutorService = Executors.newCachedThreadPool();  //create a thread pool
            System.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();
                }
                
            }

            @Override
            public 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();
                   }
               }
           }
        }    
}

2)Android客户端代码

package com.amaker.socket;

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 SocketDemo 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);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.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() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String msg = ed_msg.getText().toString();
                if (socket.isConnected()) {
                    if (!socket.isOutputShutdown()) {
                        out.println(msg);
                    }
                }
            }
        });
        //启动线程,接收服务器发送过来的数据
        new Thread(SocketDemo.this).start();
    }
    /**
     * 如果连接出现异常,弹出AlertDialog!
     */
    public void ShowDialog(String msg) {
        new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)
                .setPositiveButton("ok", new DialogInterface.OnClickListener() {

                    @Override
                    public 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();
        }
    }
}

   解析:除了isClose方法,Socket类还有一个isConnected方法来判断Socket对象是否连接成功。  看到这个名字,也许读者会产生误解。  其实isConnected方法所判断的并不是Socket对象的当前连接状态,  而是Socket对象是否曾经连接成功过,如果成功连接过,即使现在isClose返回true, isConnected仍然返回true。因此,要判断当前的Socket对象是否处于连接状态, 必须同时使用isClose和isConnected方法, 即只有当isClose返回false,isConnected返回true的时候Socket对象才处于连接状态。 虽然在大多数的时候可以直接使用Socket类或输入输出流的close方法关闭网络连接,但有时我们只希望关闭OutputStream或InputStream,而在关闭输入输出流的同时,并不关闭网络连接。这就需要用到Socket类的另外两个方法:shutdownInput和shutdownOutput,这两个方法只关闭相应的输入、输出流,而它们并没有同时关闭网络连接的功能。和isClosed、isConnected方法一样,Socket类也提供了两个方法来判断Socket对象的输入、输出流是否被关闭,这两个方法是isInputShutdown()和isOutputShutdown()。 shutdownInput和shutdownOutput并不影响Socket对象的状态。

 

2.基于字节的传输

  基于字节传输的时候,只需要把相应的字符串和整数等类型转换为对应的网络字节进行传输即可。具体关于如何把其转换为网络字节,请参《网路搜集:java整型数与网络字节序的 byte[] 数组转换关系》。

 

PS:欢迎有志之士加入Android之家群:272022717. 这里是技术交流、技术支持、思想汇聚、项目交流之地。

 

原文转自 http://www.cnblogs.com/devinzhang/archive/2012/10/04/2711763.html

system.stackoverflowexception的一个例子(转)

今天按着书上的例子写呀写,写了一下午终于做出了一个三层模式的通讯录(当然很简单),但是,弄了最后却碰到个运行时的异常,弄得我这个asp.net菜鸟郁闷了再郁闷.异常如下:发生类型为System.StackOverflowException的异常。看了网上的资... 查看详情

androidsocket连接,使用socket进行通信(android)(代码片段)

一。服务器程序服务器程序需要在PC上运行,该程序比较的简单,因此不需要建立Android项目,直接定义一个JAVA类,并且运行该类即可。它仅仅建立ServerSocket监听,并使用Socket获取输入输出流。SimpleServerimportjava... 查看详情

androidsocket通讯(代码片段)

Socket通讯前言正文一、创建项目二、构建主页面布局三、服务端四、客户端五、业务交互①接口回调②服务端和客户端切换③服务开启和关闭④服务连接和断开⑤发送消息⑥显示消息内容六、UI优化①列表适配器②修改页面逻辑... 查看详情

androidsocket通讯(代码片段)

Socket通讯前言正文一、创建项目二、构建主页面布局三、服务端四、客户端五、业务交互①接口回调②服务端和客户端切换③服务开启和关闭④服务连接和断开⑤发送消息⑥显示消息内容六、UI优化①列表适配器②修改页面逻辑... 查看详情

androidsocket通信能发数据但不能接收到数据?

android做客户端,PC做服务端(C#编写),android发数据PC端可以收到,但PC端返回的数据android却接收不到,(android端为真机,非模拟器)奇怪的是,完全相同的javasocket通信代码,放在android下收不到数据,但建一个pc的java工程,还... 查看详情

转:一个经典例子让你彻彻底底理解java回调机制

一个经典例子让你彻彻底底理解java回调机制转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17483273),请尊重他人的辛勤劳动成果,谢谢以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里... 查看详情

androidsocket编程

android作为服务器端,接收pc端发来的文件,pc端是用c写的:doreadlen=fread(buf,sizeof(char),MAX_LEN,fp_in);if(readlen>0)count+=readlen;nSend=send(nSocket,buf,readlen,0);//正式传输循环把文件上传while(count<File_length);//循环读取文件pc端把文件发送完以... 查看详情

androidsocket通讯之心跳消息(代码片段)

心跳消息前言正文一、状态判断二、心跳消息发送三、心跳消息回复四、源码前言  不知道大家国庆节过的咋样,有没有学习呢?我是闲着没事就写点东西,本文篇幅较短,只是实现了心跳消息的处理,下... 查看详情

androidsocket通讯之心跳消息(代码片段)

心跳消息前言正文一、状态判断二、心跳消息发送三、心跳消息回复四、源码前言  不知道大家国庆节过的咋样,有没有学习呢?我是闲着没事就写点东西,本文篇幅较短,只是实现了心跳消息的处理,下... 查看详情

贝塔分布例子(转)

...此。 比如,写上几句基础的数学概念,天上就能掉下一个工作来……这是真事。 学概率的时候,我们会反复来理解什么是正态分布,什么是均匀分布,什么是二项分布,什么是贝塔分布……不知在座的各位是否还能记起... 查看详情

androidsocket通讯(代码片段)

Socket通讯前言正文一、创建项目二、构建主页面布局三、服务端四、客户端五、业务交互①接口回调②服务端和客户端切换③服务开启和关闭④服务连接和断开⑤发送消息⑥显示消息内容六、UI优化①列表适配器②修改页面逻辑... 查看详情

Android Socket + ObjectOutputStream 无法正常工作

】AndroidSocket+ObjectOutputStream无法正常工作【英文标题】:AndroidSocket+ObjectOutputStreamnotworkingcorrectly【发布时间】:2011-04-2706:07:04【问题描述】:我正在开发一个客户端是安卓设备的客户端/服务器程序。服务器有一个从输入流中读取... 查看详情

androidsocket通讯分离服务端和客户端发送表情消息(代码片段)

分离服务端和客户端、发送表情消息前言正文一、页面优化①分包②创建ServerActivity③创建ClientActivity④选择类型二、表情消息①依赖Emoji2库②初始化Emoji2库③加载Emoji列表④修改UI⑤表情适配器⑥表情弹窗⑦页面使用三、源码前... 查看详情

androidsocket通讯之表情列表优化业务逻辑优化(代码片段)

表情列表优化、业务逻辑优化前言正文一、增加线程池①增加服务端线程池②增加客户端线程池二、修改表情出现布局①BottomSheet使用②CoordinatorLayout使用③Activity中修改三、业务层优化①创建基类Activity②标题设置③开启服务和... 查看详情

php实现word转html文档的例子

php实现word转html文档的例子2015-10-1617:07 2751人阅读 评论(2) 收藏 举报word文档不适合放到网页上了,如果我们要放到网页中去是需要一个个复制了,如果你还在复制就out了,下文小编来为各位整理一篇php实现word转html... 查看详情

osglightpoint例子[转]

该例子演示了光点的效果,主要应用osgSim库中的LightPoint、LightPointNode、SequenceGroup、BlinkSequence,osgSim库属于仿真库,扩展库。应用osg核心库完成一些指定的效果。因此研究这个例子只需要指定以上这几个类的作用即可。LightPoint是... 查看详情

androidsocket学习unix_socket(代码片段)

查看socker命令netstat-an|grep"xx"unix_socket_service.c#include<stdlib.h>#include<stdio.h>#include<stddef.h>#include<sys/socket.h>#include<sys/un.h>#include<errno.h 查看详情

spring松耦合示例(转)

...非常难以管理和修改,而现在,你可以使用Spring框架扮演一个中间模块的角色,方便高效地管理其他组件依赖输出生成的例子看个例子,假设你的项目有一个方法可以输出内容到csv或者json格式,你可能 查看详情