终于把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> 模拟器总是启动慢,老出现一些怪异的现象。


更多相关文章

  1. android 悬浮按钮
  2. android跳转权限设置页面
  3. Android多点触摸放大缩小图片
  4. Android(安卓)ThreadPoolUtils-线程池相关
  5. android 获取服务器json数据
  6. 欢迎页,引导页和主页
  7. CentOS 安装 Android
  8. 使用Android新式LruCache缓存图片,基于线程池异步加载图片
  9. android Handler and progress

随机推荐

  1. 添加一个新变量能使以前不显著的变量变得
  2. 线索二叉树(C语言)
  3. 谷歌、脸书、魔兽世界都在用!InnoDB是什么
  4. 从1997投稿到2021年被Top5刊接受, 从不惑
  5. 加入其他控制变量后, 估计系数的符号相反
  6. 封禁TikTok?这次美国政府恐怕不能再为所欲
  7. 估计工具变量回归时, 是否必须将所有外生
  8. 如何教AI吃鸡?
  9. 寻找真相, 中国的经济增长真的可以用晋升
  10. 什么是数字孪生体?来自西门子、PTC、北航