1.服务端开发

创建一个Java程序

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

<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类

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地址。 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

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

Android 网络编程 Socket的更多相关文章

  1. Android 网络编程 Socket Http

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  2. android 网络编程--socket tcp/ip udp http之间的关系

    网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络 ...

  3. Android网络编程Socket【实例解析】

    Socket 事实上和JavaWeb 里面的Socket一模一样 建立客服端,server端,server开一个port供客服端訪问 第一步创建server端:(这里把为了便于解说.把server端, ...

  4. android网络编程-socket基础

    转载http://www.eoeandroid.com/thread-61727-1-1.html 一.Socket通讯机制1. TCP连接: 面向连接的可靠传输协议,具有数据确认和数据重传机制,保证 ...

  5. Android网络编程系列 一 Socket抽象层

     在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽 ...

  6. Android网络编程只局域网传输文件

    Android网络编程之局域网传输文件: 首先创建一个socket管理类,该类是传输文件的核心类,主要用来发送文件和接收文件 具体代码如下: package com.jiao.filesend; im ...

  7. Android网络编程基础

    Android网络编程只TCP通信 TCP 服务器端工作的主要步骤如下.步骤1 调用ServerSocket(int port)创建一个ServerSocket,并绑定到指定端口上.步骤2 调用acc ...

  8. Android网络编程系列 一 TCP/IP协议族

    在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...

  9. Android网络编程概述

    Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包 ...

随机推荐

  1. qq红心头像[中国心]制作教程之Photoshop教程

    QQ红心头像[中国心]制作教程之Photoshop教程 中国最大的WEB开发资源网站及技术社区,阿里西西WEB开发 最近网络流传着很多qq红心头像,msn红心头像,中国心图标等等,最有些搞笑的是还有正 ...

  2. 转:DataTable.Compute()用法

    转自:http://www.cnblogs.com/fanyf/archive/2012/05/11/2495919.html一.DataTable.Compute()方法說明如下 作用: 计算用来传 ...

  3. 在用的vim插件

    The-NERD-tree  https://github.com/vim-scripts/The-NERD-tree 在vim中也可以有目录树的,如果要打开当前文件夹下的其他文件的话也可以很方便的进 ...

  4. JavaScript数据结构——树

    树:非顺序数据结构,对于存储需要快速查找的数据非常有用. 二叉树:二叉树中的节点最多只能有两个子节点(左侧子节点和右侧子节点).这些定义有助于我们写出更高效的向/从树中插入.查找和删除节点的算法. 二 ...

  5. node模拟http服务器session机制-我们到底能走多远系列(36)

    我们到底能走多远系列(36) 扯淡: 年关将至,总是会在一些时间节点上才感觉时光飞逝,在平时浑浑噩噩的岁月里都浪费掉了太多的宝贵.请珍惜! 主题:      我们在编写http请求处理和响应的代码的时 ...

  6. 时间作为横轴的图表(morris.js)超越昨天的自己系列(8)

    超越昨天的自己系列(8) morris.js的官网有详细的例子:http://www.oesmith.co.uk/morris.js/ 特别注意它的依赖: <link rel="sty ...

  7. eBay_Relist(退换刊登费)

    如果物品首次刊登结束时没有人中标,或是买家并没有付款完成交易,那么卖家以通过重新刊登的方法来再次销售.如果该物品在第二次刊登时成功售出,且满足eBay的重新刊登退费条件,那么eBay便会退还重新刊登的 ...

  8. HDU 1010 Tempter of the Bone --- DFS

    HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...

  9. 了解CentOS及周边

    CentOS相关介绍 CentOS是Community ENTerprise Operating System的简称RHEL的全称则是Red Hat Enterprise LinuxFedoro Co ...

  10. 继承:《原型和原型链(prototype 属性使您有能力向对象添加属性和方法。)》

    二. 原型对象   在JavaScript 中,每当定义一个对象(函数)时候,对象中都会包含一些预定义的属性.其中函数对象的一个属性就是原型对象 prototype.注:普通对象没有prototype ...