Android 网络编程 Socket

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

时间: 2024-10-06 06:33:13

Android 网络编程 Socket的相关文章

Android 网络编程 Socket Http

在Android的网络通讯中,通常会使用Socket进行设备间数的数据通讯,使用Http来对网络数据进行请求. 1.Socket(套接字) 不管是有过Java开发经验还是.NET开发经验的同学都应该对Socket有或多或少的了解,常见的TCP或者UDP协议其实都是基于Socket来实现的. Socket是用于描述网络上的一个设备中的一个进程或者应用程序的,Socket由IP地址和端口号两部分组成.IP地址用来定位设备,端口号用来定位应用程序或者进程,比如我们常见的运行在80端口上的HTTP协议.

Android 网络编程——socket failed: EACES (Permission denied)

当Android网络socket编程时出现如下错误: "socket failed: EACES (Permission denied)" 是因为建立的套接字没有权限对外连接. 解决: 在AndroidManifest.xml文件中,加上这么一句,取得权限 即:<uses-permission android:name="android.permission.INTERNET"/>

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

Socket 其实和JavaWeb 里面的Socket一模一样 建立客服端,服务器端,服务器开一个端口供客服端访问 第一步创建服务器端:(这里把为了便于讲解,把服务器端,和客服端都放在手机上了) 创建Android工程 socketserver package com.example.socketserver; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import

Android网络编程Socket长连接

在实际的应用中客户端可能需要和服务器端保持长时间的通信,即服务器需要不断地读取客户端数据,并向客户端写入数据:客户端也需要不断地读取服务器数据,并向服务器写入数据. 简单实现代码如下: 1 public class MyServer { 2 //定义保存所有Socket的ArrayList 3 public staticArrayList socketList = newArrayList(); 4 5 public static voidmain(String[] args) throws I

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

网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络层.链路层通信协议概图.我们经常接触到的一般是: http协议:应用层协议,并且http协议是基于tcp连接的,主要解决的是如何包装协议的 tcp协议:运输层协议,通常也叫做tcp/ip协议,主要解决数据如何在网络中传输 udp协议:运输层协议,用户数据报协议,不可靠的协议,只负责把应用层的协议的数

Android网络编程(一)---Socket基础

Socket通常称为""套接字.Socket字面上的中文意思为"插座".一台服务器可能会提供很多服务,每种服务对应一个Socket,而客户的"插头"也是一个Socket.Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.Socket把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议.Socket用于描述IP地址和端口,是一个通信链的句柄.应

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

在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽象层.本篇文章将会让我们清楚的了解和学会使用Socket. 什么是Socket?它又是如何运作的?它的表现形式是什么?等等这些问题,本篇文章将逐步的揭晓. 一. 什么是Socket Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,你可以借助它建立TCP连接等等,而http是个应用层的

Android网络编程网上文章总结

关于网络编程,网上也有许多好的文章,这里我就选了几篇觉得不错的归纳到了一起,仅供参考 Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标准Java接口) java.net.*提供与联网有关的类,包括流.数据包套接字(socket).Internet协议.常见Http处理等.比如:创建URL,以及URLConnection/HttpURLConnection对象.设置链接参数.链接到服务器.向服务器写数据.从服务器读取数

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

在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必要进一步的了解,这就要我们了解网络通信层了,提到网络通信层不得不说起ISO-OSI的七层协议经典架构,如图所示: 上图的左边部分就是osi架构模型了, ISO/OSI模型,即开放式通信系统互联参考模型(Open System Interconnection Reference Model),是国际标