Android 使用Socket进行通信

作者 : 卿笃军

原文地址:http://blog.csdn.net/qingdujun/article/details/39274055

客户端通常可以使用Socket的构造器来链接到指定的服务器。

下面演示一下,Android端链接到服务器,同时,用服务器给Android发送一条消息:

1)服务器端

2)Android端

1)服务器端

编写过程中遇到的一个小问题:java.net.BindException: Address already in use: JVM_Bind,分析出现这个问题的原因,一般有如下几种:

①)原因:端口已被占用。

解决方案:换一个端口。

②)原因:变量定义位置问题(我不知道是不是这个问题,可能是,我开始出现这个问题的时候,换了几个端口还是没解决,后来我将变量定义在外面,就解决了)

解决方案:将变量定义在外部。

package dujun.king.javaee;

import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class CServer {
	public static void main(String[] args){
		//创建一个ServerSocket,用于监听客户端Socket的链接请求
		//本机IP: 169.254.49.31
		ServerSocket ss=null;
		Socket s = null;
		OutputStream os = null;
		//采用循环不断的接受来自客户端的请求
		while (true)
		{
			try {
				System.out.println("等待客户端的链接....");
				ss = new ServerSocket(9527);
				//每当接收到客户端Socket的请求,服务器也对应产生一个Socket
				s = ss.accept();
				System.out.println("客户端已链接....");
				os = s.getOutputStream();
				os.write("您好,收到一条信息!".getBytes("utf-8"));
				//关闭输出流,关闭Socket
				os.close();
				s.close();
				ss.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

2)Android端

编写过程中遇到的一个小问题,就是(我用真机)一直连接不上服务器,我当时以为不是ip地址的问题,我先后换了好几个都没用(包括我联网后的ip  113.132.174.158,没联网时的ip 169.254.49.31)。

解决方案:添加一个模拟器,不用真机模拟。(使用:169.254.49.31 测试成功,如下图)

a)  xml布局代码:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="client.dujun.king.tcp.MainActivity" >

    <EditText
        android:id="@+id/show"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="" />

</RelativeLayout>

b)MainActivity.java代码:

package client.dujun.king.tcp;

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

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;

public class MainActivity extends Activity {

	EditText show;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        show = (EditText)findViewById(R.id.show);
        new Thread()
        {
        	@Override
        	public void run()
        	{
        		try {
					//建立连接到远程服务器的Socket
        			Socket socket = new Socket("169.254.49.31",9527);
        			//将Socket对应的输入流包装成BufferedReader
        			BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        			//进行普通的I/O操作
        			String line = br.readLine();
        			show.setText("来自服务器的数据:"+line);
        			br.close();
        			socket.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
        	}
        }.start();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

c) AndroidMainiFest.xml 权限设置代码:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="client.dujun.king.tcp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="15" />
	<!-- 访问Internet权限 -->
	<uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

参考文献:疯狂Android讲义(第2版) 李刚 编著

原文地址:http://blog.csdn.net/qingdujun/article/details/39274055

时间: 2024-10-21 17:01:04

Android 使用Socket进行通信的相关文章

基于android的Socket通信

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock

android使用socket进行本地PC通信

一.编写思路 手机端为客户端,PC为服务端,手机访问PC通信,需建立一个虚拟的通信链路,客户端通过socket发送请求到服务端,服务端通过serversocket监听来自客户端的socket请求,并生成一个socket.这样就建立了一条虚拟通信网络,然后再通过相关方法进行通信.项目需在服务端建立一个java程序,客户端建立一个android程序. 二.代码编写 (一) PC端的代码编写--java程序 (1)相关方法 Socket accept() :如果接收到一个来自客户端的socket的连接

【android】Socket简单用法

原文地址:http://www.cnblogs.com/harrisonpc/archive/2011/03/31/2001565.html Socket通常也称做”套接字“,用于描述IP地址和端口,废话不多说,它就是网络通信过程中端点的抽象表示.值得一提的是,Java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端.这是两个封装得非常好的类,使用起来很方便! 下面将首先创建一个SocketServer的类作为服务端如下,该服务端实现

Android 使用Socket完成进程间通信

看一些Android应用,特别是涉及到底层的功能性的应用,比如游戏加速,修改内存,挂机脚本神马的,发现里面的通信机制无一例外的都是使用的socket,基本上已经成为这类应用的一种标配了. 因为这类应用有以下的几个共同点: 1 需要android 手机的root权限,毕竟要修改一些比较底层的东西,没有root权限有时候木有办法修改啊 2 有自己的so,同时比较重要的或者比较吃力的活都编译成一个可执行的elf文件,然后让apk应用给这个elf文件给启动起来.关于这个elf文件放置的位置也有几种选择.

使用Socket进行通信

客户端通常可使用Socket的构造器来连接到指定服务器,Socket通常可使用如下两个构造器. Socket(lnetAddress/String  remoteAddress , int  port):创建连接到指定远程主机.远程端口的Socket,该构造器没有指定本地地址.本地端口,默认使用本地主机的默认IP地址,默认使用系统动态指定的IP地址. Socket(lnetAddress/String  remoteAddress , int  port , lnetAddress  local

WIFI环境下Android手机和电脑通信

前面已经写过一篇java实现最基础的socket网络通信,这篇和之前那篇大同小异,只是将客户端代码移植到手机中,然后获取本机IP的方法略有不同. 先讲一下本篇中用到Android studio的使用吧 使用Android studio开发Android最基本的3个步骤: (1)新建工程 (2)在XML布局文件中定义应用程序的用户界面. 点击画圈中的Design和Text可以切换界面 (3)在java代码中编写业务实现. 这里面用来写java代码 另外这篇文章还需要添加用户权限 好了,可以上代码了

Android 之 IPC 进程通信全解析

Android 之 IPC 进程通信全解析 本篇博客的框架 什么是IPC IPC(Inter-Process Communication) 进程间通信,是指两个不同进程之间数据交换的过程. 在明确其之前,需要先搞懂几个概念: 线程:CPU可调度的最小单位,是程序执行流的最小单元:线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 进程: 一个执行单元,在PC 和移动设备上一

Android BLE与终端通信(三)——client与服务端通信过程以及实现数据通信

Android BLE与终端通信(三)--client与服务端通信过程以及实现数据通信 前面的终究仅仅是小知识点.上不了台面,也仅仅能算是起到一个科普的作用.而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主从关系的client和服务端了.本文相关链接须要去google的API上查看,须要FQ的 Bluetooth Low Energy:http://developer.android.com/guide/topics/connectivity/bluetooth-le.html 可是我们依旧

Android local socket学习总结

转载请注明出处: http://blog.csdn.net/xiexh0921/article/details/7513628 ############################################## 目的:实现本地 C程序与apk的socket通信. 原理:没有涉及到网络通信,所以使用Android封装的local socket要更简单 参考:系统源码RIL模块 整理:Andy.xie ############################################