android socket通信

终于把socket通信调通了


1. 【客户端】

package com.example.ioclient;  
  
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.net.Socket;  
import android.os.Bundle;  
import android.app.Activity;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.TextView;  
  
public class Client extends Activity {  
    private Button send;  
    private TextView text;  
  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
    //设置布局文件  
        setContentView(R.layout.client_activity);  
    //设置按钮和文本id  
        send = (Button) findViewById(R.id.send);  
        text = (TextView) findViewById(R.id.text);  
    //设置按钮字符串     
        send.setText(R.string.send);  
    //设置监听器  
        send.setOnClickListener(new ClientListener());  
    }  
  
    class ClientListener implements OnClickListener {  
        private Socket socket;  
        private DataInputStream in;  
        private DataOutputStream out;  
  
        public void onClick(View v) {  
    //在监听器里面把连接服务器代码写在一个新建一个线程里,主线程里面不能用  
            Thread thread = new Thread() {  
                public void run() {  
                    try {  
                        System.out.println("msg");  
    //socket设置服务器ip地址和端口号  
                        socket = new Socket("10.47.31.21", 10001);  
    //取得数据输入输出流,getOutputStream字节流,DataOutputStream字节流以各种数据类型输入数据  
                        out = new DataOutputStream(socket.getOutputStream());  
                        in = new DataInputStream(socket.getInputStream());  
    //以UTF形式输入流中  
                        out.writeUTF("输入数据。。。");  
    //刷新输入到流中  
                        out.flush();  
                        final String msg;  
                        if ((msg = in.readUTF()) != null) {  
    //新建一个线程实现ui更新  
                            runOnUiThread(new Runnable() {  
                                public void run() {  
                                    text.setText(msg);  
                                }  
                            });  
                            System.out.println("msg1" + msg);  
                        }  
                    } catch (Exception e) {  
                        e.printStackTrace();  
                    }  
                }  
            };  
    //开始线程  
            thread.start();  
        }  
    }  
}  


2. 【服务端】

package www;  
  
import java.io.DataInputStream;  
import java.io.DataOutputStream;  
import java.io.IOException;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
public class Server {  
    private ServerSocket serversocket;  
    private Socket socket;  
    private DataInputStream in;  
    private DataOutputStream out;  
      
    public static void main(String [] agrs) {  
        new Server();  
    }  
      
    public Server() {  
    //开始线程  
        new ServerThread().start();  
    }  
      
    class ServerThread extends Thread {  
        public void run() {  
            try {  
    //设置服务器端口号  
                serversocket = new ServerSocket(10001);  
                System.out.println("服务器启动");  
                while (true) {  
    //接收客户端发送请求  
                    socket = serversocket.accept();  
                    System.out.println("有客户端连接到服务器");  
    //取得socket输入输出字节流  
                    in = new DataInputStream(socket.getInputStream());  
                    out = new DataOutputStream(socket.getOutputStream());  
                    String msg;  
    //读取从客户端发送的数据  
                    if ((msg = in.readUTF()) != null) {  
                        System.out.println(msg);  
                    }  
    //把输出数据返回给客户端  
                    out.writeUTF("连接服务器成功");  
    //刷新输出流  
                    out.flush();  
                }  
            } catch (IOException e) {  
                e.printStackTrace();  
            } finally {  
                try {  
                    in.close();  
                    out.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
    }  
}  


3. 在manifest文件中注册网络权限

<uses-permission android:name="android.permission.INTERNET"/>  
  
<?xml version="1.0" encoding="utf-8"?>  
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
    package="com.example.ioclient"  
    android:versionCode="1"  
    android:versionName="1.0" >  
  
    <uses-sdk  
        android:minSdkVersion="8"  
        android:targetSdkVersion="17" />  
    <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="com.example.ioclient.Client"  
            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>  
  
  
  
<?xml version="1.0" encoding="utf-8"?>  
<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:id="@+id/text"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"/>  
    <Button  
        android:id="@+id/send"  
        android:layout_width="fill_parent"  
        android:layout_height="wrap_content"/>  
      
</LinearLayout>  
  
<?xml version="1.0" encoding="utf-8"?>  
<resources>  
  
    <string name="app_name">IOClient</string>  
    <string name="hello_world">Hello world!</string>  
    <string name="menu_settings">Settings</string>  
    <string name="send">连接服务器</string>  
</resources>  


4. 运行结果







5. 总结

1>   在UI编程中,执行网络程序的时候, 最好是开启一个单独的网络线程, 这样才不会导致UI主线程被阻塞住的情况。

2>   模拟器总是启动慢,老出现一些怪异的现象。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值