Android 之 Socket 通信

联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket

Server 端编程

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket; /**
* 测试Android客户端与PC服务器通过socket进行交互
* 服务器端:接收客户端的信息并回送给客户
* @author Dream_Kidd
* @since 2015年06月16日11:39:14
*/
public class Server implements Runnable {
public static final int SERVERPORT = 51706;
private ServerSocket serverSocket; public void run() {
try {
System.out.println("S: Connecting..."); serverSocket = new ServerSocket(SERVERPORT);
while (true) {
// 等待接受客户端请求
Socket client = serverSocket.accept(); System.out.println("S: Receiving..."); try {
// 接受客户端信息
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream())); // 发送给客户端的消息
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())),true); System.out.println("S: receive a new message");
String str = in.readLine(); // 读取客户端的信息
System.out.println("S: read message over");
if (str != null ) {
// 设置返回信息,把从客户端接收的信息再返回给客户端
out.println("You sent to server message is:" + str);
out.flush();
System.out.println("S: Received: '" + str + "'");
} else {
System.out.println("Not receiver anything from client!");
}
} catch (Exception e) {
System.out.println("S: Error 1"+e.getMessage());
e.printStackTrace();
} finally {
client.close();
System.out.println("S: Done.");
}
}
} catch (Exception e) {
System.out.println("S: Error 2"+e.getMessage());
e.printStackTrace();
}
} public static void main(String [] args ) {
Thread desktopServerThread = new Thread(new Server());
desktopServerThread.start();
}
}

在此处基本没什么问题,直接运行即可等待客户端连接

Client编程

1.修改manifest,在里面加上''

2.编写 Client 代码

package com.example.dream_kidd.testsocket;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class MainActivity extends Activity { private Socket socket;
private Button bt;
private TextView tx;
private EditText et; private static final String host = "192.168.50.73";
private static final int port = 51706; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt= (Button) findViewById(R.id.but1);
tx= (TextView) findViewById(R.id.tx1);
et= (EditText) findViewById(R.id.et); bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setTitle("Test Socket");
try {
socket = new Socket(host, port);
Log.d("TCP","Client...Connecting");
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true); //接受服务器信息
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//得到服务器信息
String msg = in.readLine();
//在页面上进行显示
tx.setText(msg);
out.println(msg);
out.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
} }

3.直接在 IDE 中托拉拽,生成的布局xml

<AbsoluteLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
android:orientation="vertical"> <TextView
android:id="@+id/tx1"
android:layout_width="match_parent"
android:layout_height="89dp"
android:layout_x="2dp"
android:layout_y="87dp"
android:text=" receive:" /> <Button
android:id="@+id/but1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="sendmsg"
android:layout_x="277dp"
android:layout_y="11dp" /> <EditText
android:id="@+id/et"
android:layout_width="253dp"
android:layout_height="wrap_content"
android:text="请输入信息" /> </AbsoluteLayout>

然后兴冲冲的运行,结果……悲剧了

报错了,NetworkOnMainThreadException,google一下,发现这个是在安卓2.3之后,google 不允许在主线程中访问网络,

那就起一个线程,修改后代码如下

## Android 之 Socket 通信
联系一下 Socket 编程,之后需要将一个 JavaEE 项目移植到 Android,暂时现尝试写一个简单的 DEMO,理解一下 Socket
### Server 端编程

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileOutputStream;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.ServerSocket;

import java.net.Socket;

/**

  • 测试Android客户端与PC服务器通过socket进行交互

  • 服务器端:接收客户端的信息并回送给客户

  • @author Dream_Kidd

  • @since 2015年06月16日11:39:14

    */

    public class Server implements Runnable {

    public static final int SERVERPORT = 51706;

    private ServerSocket serverSocket;

    public void run() {

    try {

    System.out.println("S: Connecting...");

     	serverSocket = new ServerSocket(SERVERPORT);
    while (true) {
    // 等待接受客户端请求
    Socket client = serverSocket.accept(); System.out.println("S: Receiving..."); try {
    // 接受客户端信息
    BufferedReader in = new BufferedReader(
    new InputStreamReader(client.getInputStream())); // 发送给客户端的消息
    PrintWriter out = new PrintWriter(new BufferedWriter(
    new OutputStreamWriter(client.getOutputStream())),true); System.out.println("S: receive a new message");
    String str = in.readLine(); // 读取客户端的信息
    System.out.println("S: read message over");
    if (str != null ) {
    // 设置返回信息,把从客户端接收的信息再返回给客户端
    out.println("You sent to server message is:" + str);
    out.flush();
    System.out.println("S: Received: '" + str + "'");
    } else {
    System.out.println("Not receiver anything from client!");
    }
    } catch (Exception e) {
    System.out.println("S: Error 1"+e.getMessage());
    e.printStackTrace();
    } finally {
    client.close();
    System.out.println("S: Done.");
    }
    }
    } catch (Exception e) {
    System.out.println("S: Error 2"+e.getMessage());
    e.printStackTrace();
    }

    }

    public static void main(String [] args ) {

    Thread desktopServerThread = new Thread(new Server());

    desktopServerThread.start();

    }

    }


在此处基本没什么问题,直接运行即可等待客户端连接
### Client编程 1.修改manifest,在里面加上'<uses-permission android:name="android.permission.INTERNET"/>'
2.编写 Client 代码

package com.example.dream_kidd.testsocket;

import android.app.Activity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.TextView;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.io.PrintWriter;

import java.net.Socket;

import java.net.UnknownHostException;

public class MainActivity extends Activity {

private Socket socket;
private Button bt;
private TextView tx;
private EditText et; private static final String host = "192.168.50.73";
private static final int port = 51706; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt= (Button) findViewById(R.id.but1);
tx= (TextView) findViewById(R.id.tx1);
et= (EditText) findViewById(R.id.et); bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setTitle("Test Socket");
try {
socket = new Socket(host, port);
Log.d("TCP","Client...Connecting");
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true); //接受服务器信息
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//得到服务器信息
String msg = in.readLine();
//在页面上进行显示
tx.setText(msg);
out.println(msg);
out.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
});
}

}

3.直接在 IDE 中托拉拽,生成的布局xml
<TextView
android:id="@+id/tx1"
android:layout_width="match_parent"
android:layout_height="89dp"
android:layout_x="2dp"
android:layout_y="87dp"
android:text=" receive:" /> <Button
android:id="@+id/but1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="sendmsg"
android:layout_x="277dp"
android:layout_y="11dp" /> <EditText
android:id="@+id/et"
android:layout_width="253dp"
android:layout_height="wrap_content"
android:text="请输入信息" />

```
然后兴冲冲的运行,结果……悲剧了
报错了,`NetworkOnMainThreadException`,google一下,发现这个是在安卓2.3之后,google 不允许在主线程中访问网络,
那就起一个线程,修改后代码如下

package com.example.dream_kidd.testsocket;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException; public class MainActivity extends Activity { private Socket socket;
private Button bt;
private TextView tx;
private EditText et; private static final String host = "192.168.50.73";
private static final int port = 51706; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt= (Button) findViewById(R.id.but1);
tx= (TextView) findViewById(R.id.tx1);
et= (EditText) findViewById(R.id.et); final Thread t = new Thread(new Runnable() {
@Override
public void run() {
try { socket = new Socket(host, port);
Log.d("TCP","Client...Connecting");
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true); //接受服务器信息
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
//得到服务器信息
String msg = in.readLine();
//在页面上进行显示
tx.setText(msg);
out.println(msg);
out.flush();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}); bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setTitle("Test Socket");
t.start();
}
});
} }

这样即可与 Service 建立连接了,但是问题很多,也仅仅只能建立连接而已,需要修改

Android 之 Socket 通信的更多相关文章

  1. Android之Socket通信、List加载更多、Spinner下拉列表

    Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务 ...

  2. Android开发--Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  3. 基于android的Socket通信

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户 ...

  4. Android中Socket通信之TCP与UDP传输原理

    一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是"请求-响应方式",即在请求时 ...

  5. Android 蓝牙 socket通信

    Android中蓝牙模块的使用 使用蓝牙API,Android应用程序能够执行以下功能: 扫描其他蓝牙设备查询本地已经配对的蓝牙适配器建立RFCOMM通道通过服务发现来连接其他设备在设备间传输数据管理 ...

  6. android adb socket 通信

    今天遇到一个问题:pc客户端和android的App通信,心跳通道(心跳包27个字节,是一个业务空包)在部分pc上总是会超时(5秒超时),nagle算法也给禁用了,pc端时按按量发送心跳的,怀疑来怀疑 ...

  7. Android之Socket通信(一)

    一.服务器端,运行在PC机上 import java.io.*; import java.net.*; public class SimpleServer{     public static voi ...

  8. Android中Socket通信案例

    以下这个案例是基于TCP/UDP协议的. 服务端实现代码 基于TCP的服务端协议 // 声明一个ServerSocket对象 ServerSocket serverSocket = null; try ...

  9. Android笔记——Socket通信实现简单聊天室

    两部分,客户端和服务端 ---------------------------------------------------------------- 客户端  1.为防止ANR异常,互联网连接可用 ...

随机推荐

  1. WebTable 扩展

    # coding:utf-8 """ 页面 table处理 """ from selenium import webdriver from ...

  2. python 零散记录(四) 强调字典中的键值唯一性 字典的一些常用方法

    dict中键只有在值和类型完全相同的时候才视为一个键: mydict = {1:1,':1} #此时mydict[1] 与 mydict['1']是两个不同的键值 dict的一些常用方法: clear ...

  3. oracle全托管驱动Oracle.ManagedDataAccess

    oracle官方的托管驱动,发布只需一个6M多的dll,支持EF 支持分布式事务,使用步骤如下: 1,Download ODP.NET, Managed Driver .zip file to a d ...

  4. Qt学习之路(1)------Qt常用类用法说明

    Qt常用类 向控制台输出文本 第一个例子,我们采用STL的方式: console.cpp #include <iostream> int main() { std::cout <&l ...

  5. 是否存在两个树的和是固定数 hashmap使用 leecode

    two sum https://oj.leetcode.com/submissions/detail/8220548/ public class Solution { public int[] two ...

  6. Linux I2C设备驱动编写(一)

    在Linux驱动中I2C系统中主要包含以下几个成员: I2C adapter 即I2C适配器 I2C driver 某个I2C设备的设备驱动,可以以driver理解. I2C client 某个I2C ...

  7. The server does not support version 3.1 of the JEE Web module specification.

    使用MyEclipse2015打开MyEclipse2014编辑的项目,在服务器Tomcat 7部署时,提示"The server does not support version 3.1 ...

  8. JavaScript- 省市联动代码

    以下是JS省市联动菜单代码: 代码一: <html> <head> <title></title> <script language=" ...

  9. [Oracle] - 性能优化工具(1) - AWR

    AWR快照 默认情况下,Oracle每隔一小时会自己主动产生一个快照,保存近期8天的快照. 我们能够通过例如以下语句获得产生快照的时间间隔和保存的天数: SYS@orcl(lx15)> sele ...

  10. 统计功能和子对象的大小信息查询Bug

    I hava below two statement sql: 0. not in subquery select a.schemaname, pg_size_pretty(pg_total_rela ...