Android socket通信基础

服务端代码

package SimpleServer;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class MyServer {

//定义保存所有socket的ArrayList
public static ArrayList<Socket> socketlist = new ArrayList<Socket>();


public static void main(String[] args) throws IOException {

    ServerSocket socket = new ServerSocket(30000);

    while (true) {
        //此行代码会阻塞,将一直等待别人连接
        Socket acceptsocket = socket.accept();
        socketlist.add(acceptsocket);
        //没当客户端连接后启动一条ServerThread线程为该客户端服务
        new Thread(new ServerThread(acceptsocket)).start();
    }

}

}

package SimpleServer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class ServerThread implements Runnable {

// 定义当前线程所处理的socket
Socket acceptsocket = null;
// 该线程所处理的scoket对应的输入流
BufferedReader br = null;

public ServerThread(Socket acceptsocket) throws IOException {
    // TODO Auto-generated constructor stub
    this.acceptsocket = acceptsocket;
    // 初始化该socket对应的输入流
    br = new BufferedReader(new InputStreamReader(acceptsocket.getInputStream(),
            "utf-8"));

}

@Override
public void run() {
    // TODO Auto-generated method stub
    String content = null;
    // 采用循环不断从socket中读取客户端发送过来的数据
    while ((content = readFromClient())!= null) {
        //遍历socketlist中的每个socket
        //将读到的内容向每个socket发送一次
        for (Socket acceptsocket : MyServer.socketlist) {
            try {
                OutputStream os = acceptsocket.getOutputStream();
                os.write((content+"\n").getBytes("utf-8"));
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

// 定义读取客户端数据的方法
public String readFromClient() {

    try {
        return br.readLine();
        // 如果捕捉到异常,表明该socket对应的客户端已经关闭
    } catch (IOException e) {
        // TODO Auto-generated catch block

        // 删除该socket
        MyServer.socketlist.remove(acceptsocket);
    }
    return null;

}

}

Android 客户端

public class MyThreadClient extends Activity {
// 定义界面上的两个文本框
EditText input;
TextView show;
// 定义界面上的一个按钮
Button send;
Handler handler;
// 定义与服务器通信的子线程
ClientThread clientThread;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
input = (EditText) findViewById(R.id.input);
send = (Button) findViewById(R.id.send);
show = (TextView) findViewById(R.id.show);
handler = new Handler() //①
{
@Override
public void handleMessage(Message msg)
{
// 如果消息来自于子线程
if (msg.what == 0x123)
{
// 将读取的内容追加显示在文本框中
show.append(“\n” + msg.obj.toString());
}
}
};
clientThread = new ClientThread(handler);
// 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
new Thread(clientThread).start(); //①
send.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
try
{
// 当用户按下发送按钮后,将用户输入的数据封装成Message,
// 然后发送给子线程的Handler
Message msg = new Message();
msg.what = 0x345;
msg.obj = input.getText().toString();
clientThread.revHandler.sendMessage(msg);
// 清空input文本框
input.setText(“”);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
}
}

package com.example.multithreadclient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import android.os.Handler;
import android.os.Looper;
import android.os.Message;

public class ClientThread implements Runnable {

private Socket s;
// 定义向UI线程发送消息的Handler对象
private Handler handler;
// 定义接收UI线程的消息的Handler对象
public Handler revHandler;
// 该线程所处理的Socket所对应的输入流
BufferedReader br = null;
OutputStream os = null;

public ClientThread(Handler handler)
{
    this.handler = handler;
}

public void run()
{
    try
    {
        s = new Socket("192.168.1.23", 30000);
        br = new BufferedReader(new InputStreamReader(
            s.getInputStream()));
        os = s.getOutputStream();
        // 启动一条子线程来读取服务器响应的数据
        new Thread()
        {
            @Override
            public void run()
            {
                String content = null;
                // 不断读取Socket输入流中的内容。
                try
                {
                    while ((content = br.readLine()) != null)
                    {
                        // 每当读到来自服务器的数据之后,发送消息通知程序界面显示该数据
                        Message msg = new Message();
                        msg.what = 0x123;
                        msg.obj = content;
                        handler.sendMessage(msg);
                    }
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }.start();
        // 为当前线程初始化Looper
        Looper.prepare();
        // 创建revHandler对象
        revHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                // 接收到UI线程中用户输入的数据
                if (msg.what == 0x345)
                {
                    // 将用户在文本框内输入的内容写入网络
                    try
                    {
                        os.write((msg.obj.toString() + "\r\n")
                            .getBytes("utf-8"));
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }
        };
        // 启动Looper
        Looper.loop();
    }
    catch (SocketTimeoutException e1)
    {
        System.out.println("网络连接超时!!");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值