android socket通信
16lz
2021-12-04
终于把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> 模拟器总是启动慢,老出现一些怪异的现象。
更多相关文章
- android 悬浮按钮
- android跳转权限设置页面
- Android多点触摸放大缩小图片
- Android(安卓)ThreadPoolUtils-线程池相关
- android 获取服务器json数据
- 欢迎页,引导页和主页
- CentOS 安装 Android
- 使用Android新式LruCache缓存图片,基于线程池异步加载图片
- android Handler and progress