[置顶] Android手机通过socket与pc通信
2015-04-29 13:20
411 查看
在Android中可以直接利用java中的Socket与ServerSocket构建socket通信。
代码的运行环境:
pc端:普通pc,作为服务器,已经设置有域名(通过动态域名软件设置),在5648端口进行监听。
Android手机客户端:android2.3设备。
代码运行一切正常,客户端发送的文字将在服务器端接收并显示,服务器每接收到客户端的一行文字,就会返回一个从0开始递增的整数,此整数将在客户端显示出来。
pc端代码:
[java] view
plaincopy
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Test implements Runnable{
/**
* @param args
*/
int max=10; //最大开启线程数
int i=0; //回复数字
int temp;
ServerSocket serverSocket;
Socket socket[];
public Test(){
try {
serverSocket=new ServerSocket(5648); //在5648端口进行侦听
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("can't initate ServerSocket!");
return;
}
socket=new Socket[max];
System.out.println("waiting for connect");
try {
while((socket[i]=serverSocket.accept())!=null){
temp=i;
i++;
new Thread(this).start(); //每侦听到一个客户端的连接,就会开启一个工作线程
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new Test();
}
@Override
public void run() {
Socket sk=socket[temp];
System.out.println("accept:"+sk.getInetAddress().getHostAddress());
InputStream is=null;
OutputStream os=null;
BufferedReader br=null;
PrintWriter pw=null;
try {
is=sk.getInputStream();
os=sk.getOutputStream();
br=new BufferedReader(new InputStreamReader(is));
pw=new PrintWriter(os);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
sk.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return;
}
String str;
try {
int m=0;
while((str=br.readLine())!=null){
System.out.println(str);
pw.println(m);
pw.flush();
m++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
android设备客户端代码:
MainActivity.java代码:
[java] view
plaincopy
package com.tobacco.phonetest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener,Runnable{
private Button button;
private EditText editText;
private Socket socket;
private PrintWriter pw;
private BufferedReader br;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler=new Handler();
button=(Button)findViewById(R.id.button);
button.setOnClickListener(this);
editText=(EditText)findViewById(R.id.edittext);
try {
socket=new Socket("tobacco5648.xicp.net",5648); //连接到tobacco5648.xicp.net的5648端口
[java] view
plaincopy
<span style="white-space:pre"> </span>//tobacco5648.xicp.net是我申请的域名
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("socket","unknown host");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("socket","io execption");
}
if(socket==null){
Log.e("socket","null");
}
else
try {
pw=new PrintWriter(socket.getOutputStream());
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
if(pw!=null&&br!=null){
new Thread(this).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void onClick(View view) {
if(view==button){
String str;
str=editText.getText().toString();
pw.println(str);
pw.flush();
}
}
public void run() {
try {
String str;
while((str=br.readLine())!=null){
final String s=str;
handler.post(new Runnable(){
public void run() {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
}});
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
activity_main.xml代码:
[html] view
plaincopy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<EditText
android:id="@+id/edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/message" />
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
因为此客户端程序要用到网络,所以要在manifest文件中添加权限。
Manifest.xml代码:
[html] view
plaincopy
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tobacco.phonetest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
代码的运行环境:
pc端:普通pc,作为服务器,已经设置有域名(通过动态域名软件设置),在5648端口进行监听。
Android手机客户端:android2.3设备。
代码运行一切正常,客户端发送的文字将在服务器端接收并显示,服务器每接收到客户端的一行文字,就会返回一个从0开始递增的整数,此整数将在客户端显示出来。
pc端代码:
[java] view
plaincopy
package test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class Test implements Runnable{
/**
* @param args
*/
int max=10; //最大开启线程数
int i=0; //回复数字
int temp;
ServerSocket serverSocket;
Socket socket[];
public Test(){
try {
serverSocket=new ServerSocket(5648); //在5648端口进行侦听
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("can't initate ServerSocket!");
return;
}
socket=new Socket[max];
System.out.println("waiting for connect");
try {
while((socket[i]=serverSocket.accept())!=null){
temp=i;
i++;
new Thread(this).start(); //每侦听到一个客户端的连接,就会开启一个工作线程
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
new Test();
}
@Override
public void run() {
Socket sk=socket[temp];
System.out.println("accept:"+sk.getInetAddress().getHostAddress());
InputStream is=null;
OutputStream os=null;
BufferedReader br=null;
PrintWriter pw=null;
try {
is=sk.getInputStream();
os=sk.getOutputStream();
br=new BufferedReader(new InputStreamReader(is));
pw=new PrintWriter(os);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
try {
sk.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return;
}
String str;
try {
int m=0;
while((str=br.readLine())!=null){
System.out.println(str);
pw.println(m);
pw.flush();
m++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
android设备客户端代码:
MainActivity.java代码:
[java] view
plaincopy
package com.tobacco.phonetest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener,Runnable{
private Button button;
private EditText editText;
private Socket socket;
private PrintWriter pw;
private BufferedReader br;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler=new Handler();
button=(Button)findViewById(R.id.button);
button.setOnClickListener(this);
editText=(EditText)findViewById(R.id.edittext);
try {
socket=new Socket("tobacco5648.xicp.net",5648); //连接到tobacco5648.xicp.net的5648端口
[java] view
plaincopy
<span style="white-space:pre"> </span>//tobacco5648.xicp.net是我申请的域名
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("socket","unknown host");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e("socket","io execption");
}
if(socket==null){
Log.e("socket","null");
}
else
try {
pw=new PrintWriter(socket.getOutputStream());
br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
if(pw!=null&&br!=null){
new Thread(this).start();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void onClick(View view) {
if(view==button){
String str;
str=editText.getText().toString();
pw.println(str);
pw.flush();
}
}
public void run() {
try {
String str;
while((str=br.readLine())!=null){
final String s=str;
handler.post(new Runnable(){
public void run() {
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
}});
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
activity_main.xml代码:
[html] view
plaincopy
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<EditText
android:id="@+id/edittext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="@string/message" />
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
因为此客户端程序要用到网络,所以要在manifest文件中添加权限。
Manifest.xml代码:
[html] view
plaincopy
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tobacco.phonetest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
相关文章推荐
- Android手机通过socket与pc通信
- Android手机通过socket与pc通信
- [转]Android手机通过socket与pc通信
- android中利用Socket实现手机客户端与PC端进行通信
- Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯
- Uart2Socket:将PC的串口信息通过WiFi网络传输至安卓Android手机上
- 在pc上通过socket从android手机上接收屏幕截屏
- Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯
- Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯
- android实现PC到手机的SOCKET通信
- android端和pc端使用usb进行socket通信,其中android是服务器端,pc是客户端。如何实现安卓端输入的数据通过按钮发送到pc端?
- unity3d Android客户端与PC服务器实现Socket通信(wifi)
- 非堵塞socket实现android手机与PC的文件传输
- Android客户端通过socket与服务器通信
- Android自学笔记(二)基于Socket实现Android与PC通信
- Android手机通过socket与pc通信
- 关于安卓手机做客户端pc做服务器进行Socket通信出现问题的解决案方
- Android通过Socket(TCP/IP)与PC通讯
- Android通过Socket(TCP/IP)与PC通讯
- Android手机与PC端进行通信