使用Socket沟通

   当两台电脑TCP/IP协议进行通信。平时Socket对象来表示该通讯接口的两端,并经过Socket生产I/O流进行网络通讯。html

其中ServerSocket对象能够接收从链接的其余通讯实体的请求。这个目的是用于侦听client的Socket链接。假设没有链接,它将一直处于等待状态。java

在本文中将建立一个server端的ServerSocket 和 手机client的Socket . 使它们创建链接。产生I/O流,在手机上显示获取的数据。android

终于获得的结果例如如下图所看到的。网络


首先建一个Java项目。用来建立ServerSocket. 代码例如如下app

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


public class SimpleServer {

	public static void main(String[] args) throws IOException {
		//建立一个ServerSocket,用于监听clientSocket的链接请求
		ServerSocket ss = new ServerSocket(30000);
		System.out.println("server端已准备接受请求");
		//使用循环不断接收来自client的请求
		while(true){
			//每当接收到一个clientSocket的请求。server端也会相应产生一个Socket对象
			Socket s = ss.accept();
			OutputStream os = s.getOutputStream();
			//输出字符串。并强行使用UTF-8字符集进行编码
			os.write("您好。您收到了server的新年祝福!

\n".getBytes("utf-8")); //关闭输出流,关闭Socket os.close(); s.close(); } } } socket


而后创建一个Android项目,activity_main.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"
    tools:context="${packageName}.${activityClass}" >

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

</RelativeLayout>


MainActivity.java 代码 例如如下

package com.wyb.simpleclient;

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

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;

public class MainActivity extends Activity {

	private 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 {
					//创建链接到远程server的Socket 
					Socket socket = new Socket("192.168.0.104",30000);
					//将Socket相应的输入流包装成BufferedReader
					BufferedReader br = new BufferedReader(
							new InputStreamReader(socket.getInputStream()));
					//进行普通的I/O操做
					String line = br.readLine();
					//在该线程中控制UI中的EditText控件显示内容
					show.setText("来自server的数据: "+ line);
					//关闭流、socket
					br.close();
					socket.close();
				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			
		}.start();
	}
}

代码其中192.168.0.104 为本机的IP地址 查询本机IP地址可以经过在開始中输入 cmd 进入控制台界面,而后输入 IPconfig  按回车 就能够获得相关信息。

由于在本项目其中使用到了网络通讯。所以必定要再AndroidManifest.xml其中配置訪问互联网的权限。ide

<uses-permission android:name="android.permission.INTERNET"/>

从Android2.3之后的版本号中。Android平台不一样意直接在UI线程创建网络链接。访问网络资源。

所以,有必要在新的线程与网络相关的操做。用在本项目上的使用编码

new Thread() 要建立一个新的线程。 控制新的线程UI该 EditText 控制显示获得的内容。.net

可是,通常状况下。UI 在其余线程的控制是不可操做。除ProgressBar 和EditText 外(如今我知道) 线程

相关文章
相关标签/搜索