android Socket实现简单聊天小程序

android Socket实现简单聊天小程序,供大家参考,具体内容如下

服务器端:

package org.hwq.echo; 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; 

public class TalkServer {
  public static void main(String[] args) throws IOException{
    ServerSocket server = null;
    Socket client = null;
    BufferedReader in = null;
    PrintWriter out = null;
    try{
      server = new ServerSocket(4700);
      client = server.accept();
      out = new PrintWriter(client.getOutputStream());
      in = new BufferedReader(new InputStreamReader(client.getInputStream()));
      String line = in.readLine();
      while(!"bye".equals(line)){
        System.out.println("client:"+line);
        out.println("echo:"+line);
        out.flush();
        line = in.readLine();
      }
    }catch (Exception e) {
      e.printStackTrace();
      if(client !=null)
        client.close();
      if(server != null)
        server.close();
    }
  }
} 

手机端:

package org.hwq.cho; 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; 

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; 

public class EchoActivity extends Activity implements OnClickListener {
  EditText show,msg;
  Button send;
  Handler handler;
  Socket client;
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    handler = new MyHandler();
    show = (EditText) findViewById(R.id.show);
    msg = (EditText) findViewById(R.id.msg);
    send = (Button) findViewById(R.id.send);
    send.setOnClickListener(this);
  }
  @Override
  public void onClick(View arg0) {
    String message = msg.getText().toString();
//   System.out.println("msg:"+message);
    new EchoThread(EchoActivity.this,message).start();
  }
  public class MyHandler extends Handler{
    @Override
    public void handleMessage(Message msg) {
      switch(msg.what){
      case 1:
        Toast.makeText(EchoActivity.this, "建立连接失败", 0).show();
        break;
      case 2:
        String message = (String) msg.obj;
        System.out.println("Handler:"+message);
        show.append("\n"+message);
        break;
      }
    }
  }
  private class EchoThread extends Thread{
    private Context context;
    private String msg;
    EchoThread(Context context,String msg){
      this.context = context;
      this.msg = msg;
    }
    public void run(){
      if(client == null){
        try {
          client = new Socket("192.168.1.102",4700);
        } catch (IOException e) {
          Message message = new Message();
          message.what = 1;
          handler.sendMessage(message);
        }
      }
      System.out.println("建立连接");
      try{
        BufferedReader in;
        BufferedReader input;
        PrintWriter out;
        in = new BufferedReader(new InputStreamReader(client.getInputStream()));
        out = new PrintWriter(client.getOutputStream());
        String line = msg;
        if(!"bye".equals(line)){
          System.out.println("line:"+line);
          out.println(line);
          out.flush();
          String echo = in.readLine();
          System.out.println("server:"+echo);
          Message message = new Message();
          message.obj = echo;
          message.what = 2;
          handler.sendMessage(message);
        }
      }catch (Exception e) { 

      }
    }
  }
} 

注意几点:

1、添加网络权限

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

如果没添加,无法使用socket连接网络。
2、在新启线程中不要使用android系统UI界面
在EchoThrad的run()方法里面,有下面代码:

if(client == null){
        try {
          client = new Socket("192.168.1.102",4700);
        } catch (IOException e) {
          Message message = new Message();
          message.what = 1;
          handler.sendMessage(message);
        }
      }

这里的handler.sendMessage(message);是发送一个消息给handler,然后handler根据消息弹出一个Toast显示连接失败。如果这里直接使用

Toast.makeText(EchoActivity.this, "建立连接失败", 0).show();

会报如下错:

Can't create handler inside thread that has not called Looper.prepare()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2017-06-11

微信小程序使用Socket的实例

微信小程序使用Socket的实例 首先,一个小程序同时只能有一个WebSocket连接,如果当前已经存在一个WebSocket连接,会关闭当前连接,并重新建立一个连接. 其次,如果使用了appID,协议必须是 wss://... 最近团队用小程序做行情,在连接socket的时候,发现在还没有进行subscribe的情况下,就直接进行了广播,并且自动关闭了socket连接, 时间紧迫,抓耳挠腮,遂引用了socket-io(基于小程序的websocket仿写的socket-io,并非官方的socke

微信小程序 websocket 实现SpringMVC+Spring+Mybatis

微信小程序实现websocket步骤: 后台: 1. 添加maven依赖 2. 创建握手 3. 创建处理器 4. spring配置(xml配置或javabean方式配置任选一种) 微信小程序: 1. 书写连接 java后台 1.添加maven依赖 <!-- websocket --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket&l

微信小程序 WebSocket详解及应用

微信小程序 WebSocket 实例效果: 今天主要说一下微信的WebSocket接口以及在小程序中的使用. WebSocket是什么(简述) 微信的WebSocket接口和HTML5的WebSocket基本一样,是HTTP协议升级来的,做为一个新的Socket在B/S上使用,它实现了浏览器与服务器全双工通信. 因为这里是做小程序,所以就不对WebSocket的底层和协议做过多的说明了,只是稍微介绍一下.想了解详细的WebSocket可以参考如下:WebSocket 协议 WebSocket与A

微信小程序 网络API Websocket详解

微信小程序 网络API: 微信小程序 网络API发起请求 微信小程序 网络API 上传.下载 微信小程序 网络API Websocket wx.connectSocket(OBJECT) ​ 创建一个 WebSocket 连接:一个微信小程序同时只能有一个WebSocket连接,如果当前已存在一个WebSocket连接,会自动关闭该连接,并重新创建一个WebSocket连接. OBJECT参数说明: 参数 类型 必填 说明 url String 是 开发者服务器接口地址,必须是HTTPS协议,且

微信小程序 SocketIO 实例讲解

微信小程序 ScoketIO 简单实例: 现在好的人在搞微信小程序,ScoketIO 是微信的网络通信,它的重要性不言而喻,这里给大家讲讲如何使用以及注意事项! 微信小程序 的SocketIO 实现,基于CFETram 的实现基础上完善 const emitter = require('./emitter.js'); /** socket.io 协议常量 */ var packets = { open: 0 // non-ws , close: 1 // non-ws , ping: 2 , p

微信小程序 navbar实例详解

微信小程序 navbar实例详解 实现效果图: data typeList: [ { name: "日报", id: "1" }, { name: "周报", id: "2" }, { name: "月报", id: "3" }, { name: "目录", id: "4" }] js that.setData({ dateValue: util.

微信小程序 参数传递实例代码

微信小程序 参数传递实例代码 1.通过事件传递参数 实例代码: <view data-id="103" bindtap="evenName"></view> Page({ evenName: function(e) { //获得点击事件传递的id console.log(e.target.dataset.id); })  2.通过页面跳转传递参数 页面1: wx.navigateTo({ url: '/pages/scan-order/sca

微信小程序开发实例详解

"小程序"破解IDE + Demo:https://github.com/gavinkwoe/weapp-ide-crack.git 资源汇总:https://github.com/Aufree/awesome-wechat-weapp 官方简易教程·MINA:http://wxopen.notedown.cn/ Hello小程序 - 非官方:http://www.helloxcx.com 微信应用号开发教程:https://my.oschina.net/wwnick/blog/750

微信小程序 实战实例开发流程详细介绍

前言:         微信小程序最近要发布了,抽空学习下如何开发,在网上找到的实例,觉得不错,给大家分享, 前后两天花了大约四五个小时制作完了自己第一个小程序,当然是没法发布的,小程序的发布要求还是挺严格的:企业资质.HTTPS.审核. 先大概介绍下自己,我9年前和很多网友一样开始自学编程,这些年来什么语言都学过.什么平台都接触过,自己也做过十来个产品,所以编程基础不是很稳固但是各方面都相对比较熟悉,因此在接触小程序的时候上手比较快. 至于为什么现在选择开发小程序,原因很简单,尝尝鲜! 学习

微信小程序 九宫格实例代码

微信小程序 九宫格 实现效果图: 小程序是长在微信上的,是移动端的界面,为了能够更方便的使用,我们常常希望使用九宫格界面的方式作为导航,那要如何实现呢? 基于一个简单的思考,九宫格就是三行三列,如果把行作为一个单位,再将每一行分成三列,那是不是就可以了?我们实践一下. 首先来考虑九宫格数据的生成,每一个格子需要有一个图标.一个标题.一个便于跳转的路由,那天现在我们有九个页面,所以定义一个一维数组即可.为了更好的进行后续的配置,我们将这个数组独立到一个文件中routes.js,然后将其在index

微信小程序 登录实例详解

微信小程序登录 一. 小程序不支持cookie会话 1. 通过传递与检验3rd_session来保持会话 2. 3rd_session可以执行'`head -n 80 /dev/urandom | tr -dc A-Za-z0-9 | head -c 168`该命令生成 3. 使用Redis或者数据库存储session 4. 生成的3rd_session发送给客户端,写入storage 5. 客户端的每次请求必须带上3rd_session 二.加密数据解码 1. $iv,$code是被加密过的数

微信小程序 石头剪刀布实例代码

微信小程序 石头剪刀布 昨天看有个石头剪刀布的练习,就拿出来做了一下,布局的代码浪费了很多时间,果然CSS这块的还不是很熟练,下面直接上图上代码了. .js: var numAi = 0 var timer Page({ data:{ //控制按钮是否可点击 btnState:false, //记录获胜次数 winNum:0, //中间的话"Ho~ You Win" gameOfPlay:'', //用户选择的图片 imageUserScr:'/pages/image/wenhao.p

微信小程序 简单实例(阅读器)的实例开发

今天和朋友聊天说到小程序,然后看在看书,然后我们就弄了个小读书的demo,然后现在分享一下. 一.先来上图: 二.然后下面是详细的说明   首先先说下边的tabBar,项目采用json格式的数据配置,不得不说,现在这个是趋势,.net core的配置也是这种方式了(暴露我是.net 阵营了).   在这里好多同学会发现好多颜色的配置都不管用,是的,现在有效的颜色是有限制的,具体的大家可以进入官方文档去查看.需要几个tabBar,就在list里面写几个,本篇问是三个,所以,你看了三个.上面的ico

微信小程序上传图片实例

在网上看了好多小程序上传图片,java后端接收的示例,但是不管在哪个网站看的,代码基本是一样的,都是代码特别多. 所以就自己写一个比较简单的.  一 小程序端 user.wxml <view class='user_head'> <view> <image src='{{ptuser.avatarUrl}}' bindtap='updateHead'></image> </view> <text>点击选择头像</text>