Android之socket服务端

首先在确保服务端与客户端是相通的,ping不通肯定连不上。

TCP服务端代码

package com.example.tcp_server;

import java.io.DataInputStream;
import java.io.IOException;
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;

import android.annotation.SuppressLint;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.util.Log;

@SuppressLint("NewApi")
public class tcpservice implements Runnable
{
    //服务器端口
    private static final int SERVERPORT = 2001;
    //存储所有客户端Socket连接对象
    private static List<Socket> mClientList = new ArrayList<Socket>();
    //线程池
    private ExecutorService mExecutorService;
    //ServerSocket对象
    private ServerSocket mServerSocket;
    private static PrintWriter mPrintWriter;
    private static String  mStrMSG;
    public tcpservice()
    {
        try
        {
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
            //设置服务器端口
            mServerSocket = new ServerSocket(SERVERPORT);
            //创建一个线程池
            mExecutorService = Executors.newCachedThreadPool();
            Log.e("tcpservice", "start...");
            //用来临时保存客户端连接的Socket对象
            new Thread(tcpservice.this).start();

        }
        catch (IOException e)
        {
            Log.e("tcpservice", e.toString());
            e.printStackTrace();
        }
    }
  //接收线程发送过来信息,并用TextView显示
    public static Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.e("服务器说:", mStrMSG);
            MainActivity.AppendText("服务器说:"+mStrMSG);
        }
    };
    //每个客户端单独开启一个线程
    static class ThreadServer implements Runnable
    {
        private Socket            mSocket;
        private DataInputStream dinput;
        public ThreadServer(Socket socket) throws IOException
        {
            this.mSocket = socket;
            dinput=new DataInputStream(socket.getInputStream());
            SendToClient("hello,tcp server...");
        }
        public void run()
        {
            try
            {
                byte[] bbuf = new byte[10000];
                while (true) {

                    if (!mSocket.isClosed()) {
                        if (mSocket.isConnected()) {
                            if (!mSocket.isInputShutdown()) {
                                int length = dinput.read(bbuf);
                                   mStrMSG = new String(bbuf, 0, length, "gb2312");
                                   mStrMSG += "\n";
                                   mHandler.sendMessage(mHandler.obtainMessage());
                            }
                        }
                    }
                }
            }
            catch (IOException e)
            {
                e.printStackTrace();
            }
        }
    }
    public static  void SendToClient(String msg){
        try{
            for (Socket client : mClientList)
            {
                mPrintWriter = new PrintWriter(client.getOutputStream(), true);
                mPrintWriter.println(msg);
            }
        }
        catch(Exception e){
            Log.e("向客户端发送消息败了", e.toString());
        }
    }
    public void run() {
        try{
            Socket client = null;
            while (true)
            {
                Log.e("tcpservice", "接收客户连接");
                //接收客户连接并添加到list中
                client = mServerSocket.accept();
                mClientList.add(client);
                //开启一个客户端线程
                mExecutorService.execute(new ThreadServer(client));
            }
        }
        catch(Exception e){
            Log.e("监听客户端", e.toString());
        }
    }
}

tcpservice

前端

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:orientation="vertical" >

     <EditText
 android:id="@+id/myinternet_tcpclient_EditText01"
         android:layout_width="fill_parent"
         android:layout_height="200px"
         android:text="聊天记录:\n" >
     </EditText>

     <EditText
 android:id="@+id/myinternet_tcpclient_EditText02"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:text="输入要发送的内容" >
     </EditText>

     <LinearLayout
 android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
         android:gravity="center" >

         <Button
 android:id="@+id/myinternet_tcpclient_BtnSend"
             android:layout_width="400px"
             android:layout_height="wrap_content"
             android:text="发送" />
     </LinearLayout>

 </LinearLayout>

后台

package com.example.tcp_server;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {

    // 声明对象
    private Button  mSendButton;
    private static EditText mEditText01;
    private static  EditText mEditText02;
    private static String TAG = "shit=";
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //启动服务器
        new  tcpservice();
        mSendButton = (Button) findViewById(R.id.myinternet_tcpclient_BtnSend);
        mEditText01 = (EditText) findViewById(R.id.myinternet_tcpclient_EditText01);
        mEditText02 = (EditText) findViewById(R.id.myinternet_tcpclient_EditText02);
        //发送按扭注册事件
        mSendButton.setOnClickListener(new OnClickListener()
        {
            public void onClick(View v)
            {
                try
                {
                    // 取得编辑框中我们输入的内容
                    String str = mEditText02.getText().toString() + "\n";
                    mEditText01.append("我说:"+str);
                    //向客户端发消息
                    tcpservice.SendToClient(str);

                } catch (Exception e)
                {
                    Log.e(TAG, e.toString());
                }
            }
        });
    }
    public static void AppendText(String msg){
        mEditText01.append(msg);
    }
}

MainActivity

时间: 2024-11-09 06:08:12

Android之socket服务端的相关文章

socket服务端和客户端

#!/usr/bin/env python#encoding: utf-8import socketdef handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, World") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREA

C# Socket服务端和客户端互相send和receive

服务端 1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Net.Sockets; 5 using System.Net; 6 using System.Threading; 7  8 namespace Controller 9 {10     public static class SocketServer11     {12         private stat

Android客户端与服务端(jsp)之间json的传输与解析【附效果图附源码】

最近有个项目需要用到json的传输,之前不是太了解,在网上找了些相关资料,写了一个小小的demo,可以实现基本功能:android客户端发送json到服务端,服务端使用jsp接收,解析后以json的形式返回给客户端,客户端接收打印,先看看运行的效果截图,源码会在文章的末尾给出. 1.服务端:接收到json后解析打印,然后发送json到客户端 2.客户端,收到服务端返回的json后打印 简单的介绍下源码: 服务端使用json.jsp来接收解析客户端传过来的json,json的解析需要使用lib目录

Java网络编程【Socket服务端和客户端】

Socket 编程大家都不陌生,Java 学习中必学的部分,也是 Java网络编程核心内容之一.Java 网络编程又包括 TCP.UDP,URL 等模块.TCP 对应 Socket模块,UDP 对应 DatagramPacket 模块.URL 对应 URL 模块.其中 TCP 和 UDP 是网络传输协议,TCP 是数据流传输协议,UDP 是数据包传输协议.两者之间的异同就不在这里说了,推荐一本入门书籍 <TCPIP入门经典>.我们开始 Socket 服务端和客户端编程吧. 一.Socket 服

Android客户端与服务端交互之登陆示例

今天了解了一下android客户端与服务端是怎样交互的,发现其实跟web有点类似吧,然后网上找了大神的登陆示例,是基于IntentService的 1.后台使用简单的servlet,支持GET或POST.这个servlet最终返回给前台一个字符串flag,值是true或false,表示登录是否成功. servlet使用之前需要配置,主义servlet的servlet-name要和servlet-mapping的servlet-name一致,否则找不到路径 我是在myEclipse上创建的一个we

Android 客户端与服务端JSP相互传递中文

为了兼容简体.繁体及其他语系,推荐使用UTF-8编码. 首选,我们看看Android端应该怎么做: 在发送前,应该对参数值要进行UTF-8编码,我写了一个static的 转换函数,在做发送动作前用它将参数值转换成utf8编码: public class NetUtil { static public String toUtf8Url(String value) { try { return java.net.URLEncoder.encode(value, "utf8"); } cat

socket服务端处理多个客户端的请求学习理解

socket服务端处理多个客户端的请求:while(true){Socket s=ss.accept();new WorkThread(s).start();}class WorkThread edtends Thread{private Socket s;public WorkThread(Socket s){this.s=s;}public void run(){s.getInput();s.getOutput();}}

Android版Ftp服务端软件

分享一款开发的Android版Ftp服务端软件,支持Android4.0及以上版本,可以实现局域网无线传输文件到手机,或者把手机上的多媒体文件分享到iPad等设备来扩展这些设备的存储空间,详情请见软件的使用帮助,截图如下: iPad等设备播放手机上的多媒体文件: 下载地址: http://pan.baidu.com/s/1sjlZBzR 提取码: khji

C#下用select方法实现socket服务端

select是一种比较古老但一直被证明性能很好的socket模式,它可以让你以消息驱动的模式书写socket程序.网上C++的例子很多,但C#的例子极少. 上代码: namespace Server { class Program { // Thread signal. public static ManualResetEvent allDone = new ManualResetEvent(false); private static Socket handler = null; privat