Android 网络编程 Socket-阿里云开发者社区

开发者社区> zting科技> 正文

Android 网络编程 Socket

简介:
+关注继续查看

 1.服务端开发

创建一个Java程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
public class MyServer {
 
    // 定义保存所有的Socket,与客户端建立连接得到一个Socket
    public static List<Socket> socketList = new ArrayList<Socket>();
 
    public static void main(String[] args) throws IOException {
 
        ServerSocket server = new ServerSocket(8888);
 
        while (true) {
            System.out.println("start listening port 8888");
            Socket socket = server.accept();
            System.out.println("connect succeed.");
            socketList.add(socket);
            //每当客户端连接之后启动一条ServerThread线程为该客户端服务   
             new Thread(new MyServerRunnable(socket)).start();  
 
 
        }
    }
 
    public static class MyServerRunnable implements Runnable {
        // 定义当前线程处理的Socket
        Socket socket = null;
        // 该线程所处理的Socket所对应的输入流
        BufferedReader bufferedReader = null;
 
        public MyServerRunnable(Socket socket) {
            this.socket = socket;
            try {
                // 将服务器端的输入流的数据放入读Buffer中
                bufferedReader = new BufferedReader(new InputStreamReader(
                        socket.getInputStream()));
            catch (Exception e) {
                e.printStackTrace();
            }
 
        }
 
        @Override
        public void run() {
            String content = null;
            // 采用循环不断的从Socket中读取客户端发送过来的数据
            while ((content = readFromClient()) != null) {
                // 遍历socketList中的每一个Socket,将读取的内容向每个Socket发送一次
                for (Socket socket : MyServer.socketList) {
                    OutputStream outputStream;
                    try {
                        outputStream = socket.getOutputStream();
                        outputStream.write(("Server: " + content + "\n").getBytes("utf-8"));
                    catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
 
        }
 
        // 定义读取客户端的信息
        public String readFromClient() {
            try {
                return bufferedReader.readLine();
            catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }
 
    }
 
}

 2. 创建一个Android程序

1) Layout

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity" >
 
    <TextView
        android:id="@+id/show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="显示接收到服务器端数据" />
 
    <Button
        android:id="@+id/send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送数据到服务器端" />
 
</LinearLayout>

 2)ClientThread类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.example.testclient;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketTimeoutException;
 
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
 
public class ClientThread implements Runnable {
    private Socket s;
    // 定义向UI线程发送消息的Handler对象
    Handler handler;
    // 定义接收UI线程的Handler对象
    Handler revHandler;
    // 该线程处理Socket所对用的输入输出流
    BufferedReader br = null;
    OutputStream os = null;
 
    public ClientThread(Handler handler) {
        this.handler = handler;
    }
 
    @Override
    public void run() {
        s = new Socket();
        Log.d("111111111111""@@@@@@@@@@@@@@@@@@@@");
        try {
              //192.168.0.26 为PC IP地址。<br><br>          s.connect(new InetSocketAddress("192.168.0.26", 8888), 5000);
            Log.d("111111111111""$$");
            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);
                            Log.d("111111111111", content);
                        }
                    catch (IOException io) {
                        io.printStackTrace();
                    }
                }
 
            }.start();
            // 为当前线程初始化Looper
            Looper.prepare();
            // 创建revHandler对象
            revHandler = new Handler() {
 
                @Override
                public void handleMessage(Message msg) {
                    // 接收到UI线程的中用户输入的数据
                    if (msg.what == 0x345) {
                        // 将用户在文本框输入的内容写入网络
                        try {
                            os.write(("Client" + msg.obj.toString() + "\r\n")
                                    .getBytes("utf-8"));
                        catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
 
            };
            // 启动Looper
            Looper.loop();
 
        catch (SocketTimeoutException e) {
            Message msg = new Message();
            msg.what = 0x123;
            msg.obj = "网络连接超时!";
            handler.sendMessage(msg);
        }catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
 
    }
 
}

 3. MainActivity

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class MainActivity extends Activity {
 
    Handler handler;
    // 定义与服务器通信的子线程
    ClientThread clientThread;
    TextView show;
    Button send;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        show = (TextView) this.findViewById(R.id.show);
        send = (Button) this.findViewById(R.id.send);
 
        send.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                try {
                    // 当用户按下按钮之后,将用户输入的数据封装成Message
                    // 然后发送给子线程Handler
                    Message msg = new Message();
                    msg.what = 0x345;
                    msg.obj = "Android 网络编程--Socket通信编程";
                    clientThread.revHandler.sendMessage(msg);
 
                catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                // 如果消息来自子线程
                if (msg.what == 0x123) {
                    // 将读取的内容追加显示在文本框中
                    show.append("\n" + msg.obj.toString());
                    show.setTextSize(50);
                }
            }
        };
        clientThread = new ClientThread(handler);
        // 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
        new Thread(clientThread).start();
 
    }
 
 
}

 参考:http://blog.csdn.net/thanksgining/article/details/43561053


本文转自Work Hard Work Smart博客园博客,原文链接:http://www.cnblogs.com/linlf03/p/5124061.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
怎么设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程
7430 0
使用OpenApi弹性释放和设置云服务器ECS释放
云服务器ECS的一个重要特性就是按需创建资源。您可以在业务高峰期按需弹性的自定义规则进行资源创建,在完成业务计算的时候释放资源。本篇将提供几个Tips帮助您更加容易和自动化的完成云服务器的释放和弹性设置。
8268 0
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9513 0
阿里云服务器远程登录用户名和密码的查询方法
阿里云服务器远程连接登录用户名和密码在哪查看?阿里云服务器默认密码是什么?云服务器系统不同默认用户名不同
846 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3664 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
17375 0
+关注
3550
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载