1. 项目截图

  aaarticlea/png;base64,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RETFJNyIiIpJuBERFZNwIyIqJuFGRFRMwo2IqJiEGxFRMQk3IqJiEm5ERMUk3IiIikm4EREVk3AjIiom4UZEVEzCjYiomIQbEVExCTciomISbkRExSTciIiKSbgRERWTcCMiKibhRkRUTMKNiKiYhBsRUTEJNyKiYhJuRETFJNyIiIpJuBERFZNwIyIqJuFGRFRMwo2IqJiEGxFRMQk3IqJiEm5ERMUk3IiIikm4EREVk3AjIiom4UZEVEzCjYiomIQbEVExCTciomISbkRExSTciIiKSbgRERWTcCMiKibhRkRUTMKNiKiYhBsRUTEJNyKiYhJuRETFJNyIiIpJuBERFZNwIyIqJuFGRFRMwo2IqJiEGxFRMQk3IqJiEm5ERMUk3IiIikm4EREVk3AjIiom4UZEVEzCjYiomIQbEVExCTciomLOKNxfuu6hK3a/zH+rEBEX2NmE2z10O587onvozn2rEBEX2FmGW9M0wo2I+L0l3IiIikm4EREVk3AjIiom4UZEVEzCjYiomIQbEVExCTciomISbkRExSTciIiKSbgRERWTcCMiKibhRkRUTMKNiKiYk4XbPXStHav+vF5/Xrd3bVl629lz7F3b2XMINyJiBk4Q7ta71srPK1qM/I18+2O7cLugaVrjZYNwIyJm4LjhXvllJZfLaZq29Kslc9OsPa2V75dzP+ZWflm59tM1wo2ImJnjhnv518uapuVyOeeDE92587ljrBny/YQbETEbxwv3qi431p7WEvdvf2wTbkTELB0r3Nd+c01ubO+3E/d3D1zCjYiYpWOFO/djTtO03I+59P0JNyJixo4X7lxO5pCk70+4EREzdoJwG+tG+v6EGxExYycYKln5eSV9f8KNiJix4x2c/OmapmnaD1rncydxf8KNiJixY4V75Zf+CZO1Z8npgNaORbgREbN0shNwln+9bO1Y0Z3tXVtGUQg3ImJmjr1WyerpbO6Vn1eMdUPWLcnfzBNuRMQsnWCRqfbHdvFuUfuh/w1Lv1oq3y+39zlzEhExUydej7vzudN633I+OO6B242d8t7cbhJuRMQMvOiFFKw3/YOTrXctwo2ImIEThFt2seO6h66MceurOlfAQUTMxgnCvfLzSuF2ofGyYb+1W+9ajVeN6Mhk83WTcCMiZuMEs0qimX9xlpeXG68aXHMSETEzJxkqOXStN1bl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" alt="" />

2. 服务端源码

  

  1. package test;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.net.ServerSocket;
  7. import java.net.Socket;
  8.  
  9. public class MyServer {
  10.  
  11. // 服务器连接
  12. public static ServerSocket cServerSocket;
  13.  
  14. // 连接
  15. public static Socket cSocket;
  16.  
  17. // 端口
  18. public static final int PORT = 8888;
  19.  
  20. /**
  21. * 主方法
  22. *
  23. * @time 注释时间:2013-12-23 下午4:10:47
  24. * @param args
  25. */
  26. public static void main ( String [ ] args ) {
  27.  
  28. DataInputStream dis = null;
  29. DataOutputStream dos = null;
  30. try {
  31. cServerSocket = new ServerSocket (
  32. PORT );
  33. while ( true ) {
  34. System.out.println ( "正在等待客户连接..." );
  35. // 这里处于等待状态,如果没有客户端连接,程序不会向下执行
  36. cSocket = cServerSocket.accept ( );
  37. dis = new DataInputStream (
  38. cSocket.getInputStream ( ) );
  39. dos = new DataOutputStream (
  40. cSocket.getOutputStream ( ) );
  41. // 读取数据
  42. String clientStr = dis.readUTF ( );
  43.  
  44. // 写出数据
  45. dos.writeUTF ( "已收到信息:"
  46. + clientStr );
  47. System.out.println ( "---客户端已成功连接---" );
  48. // 得到客户端的IP
  49. System.out.println ( "客户端的IP="
  50. + cSocket.getInetAddress ( ) );
  51. // 得到客户端的端口号
  52. System.out.println ( "客户端的端口号="
  53. + cSocket.getPort ( ) );
  54. // 得到本地端口号
  55. System.out.println ( "本地服务器端口号="
  56. + cSocket.getLocalPort ( ) );
  57. System.out.println ( "客户端:"
  58. + clientStr );
  59. System.out.println ( "---------------------------------" );
  60.  
  61. }
  62. }
  63. catch ( IOException e ) {
  64. e.printStackTrace ( );
  65. }
  66. finally {
  67. try {
  68. if (dis != null) {
  69. dis.close ( );
  70. }
  71. if (dos != null) {
  72. dos.close ( );
  73. }
  74. }
  75. catch ( IOException e ) {
  76. e.printStackTrace ( );
  77. }
  78.  
  79. }
  80. }
  81. }

客户端源码

  1. package com.example.cf_mysocketclient;
  2.  
  3. import java.io.DataInputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.net.Socket;
  7. import java.net.UnknownHostException;
  8.  
  9. import android.app.Activity;
  10. import android.app.AlertDialog;
  11. import android.content.DialogInterface;
  12. import android.os.Bundle;
  13. import android.os.Handler;
  14. import android.os.Message;
  15. import android.view.Menu;
  16. import android.view.MenuItem;
  17. import android.view.View;
  18. import android.view.View.OnClickListener;
  19. import android.view.Window;
  20. import android.view.WindowManager;
  21. import android.widget.Button;
  22. import android.widget.EditText;
  23. import android.widget.TextView;
  24.  
  25. public class MainActivity extends Activity {
  26.  
  27. // 发送按钮
  28. private Button cButtonSend;
  29.  
  30. // 发送的内容
  31. private EditText cEditTextContent;
  32.  
  33. // 接收的内容
  34. private TextView cTextViewContent;
  35.  
  36. // Socket用于连接服务器获取输入输出流
  37. private Socket cSocket;
  38.  
  39. // 服务器server/IP地址(当前PC的IP地址)
  40. private final String ADDRESS = "10.0.2.2";
  41.  
  42. // 服务器端口
  43. private final int PORT = 8888;
  44.  
  45. // 消息处理的线程
  46. private Thread cThread;
  47.  
  48. // 消息的内容
  49. private String cContent;
  50.  
  51. // 处理消息机制
  52. Handler cHandler = new Handler ( ) {
  53.  
  54. @ Override
  55. public void handleMessage ( Message msg ) {
  56.  
  57. switch ( msg.what ) {
  58. case 0x01 :
  59. cThread = new Thread ( ) {
  60.  
  61. @ Override
  62. public void run ( ) {
  63.  
  64. super.run ( );
  65. DataInputStream dis = null;
  66. DataOutputStream dos = null;
  67. try {
  68. // 阻塞函数,正常连接后才会向下继续执行
  69. cSocket = new Socket (
  70. ADDRESS ,
  71. PORT );
  72. dis = new DataInputStream (
  73. cSocket.getInputStream ( ) );
  74. dos = new DataOutputStream (
  75. cSocket.getOutputStream ( ) );
  76. // 向服务器写数据
  77. dos.writeUTF ( cEditTextContent
  78. .getText ( )
  79. .toString ( ) );
  80. cContent = "I Say:";
  81. cContent += cEditTextContent.getText ( )
  82. .toString ( );
  83. cContent += "\n";
  84. cContent += "Server Say:";
  85. // 读取服务器发来的数据
  86. cContent += dis.readUTF ( );
  87. }
  88. catch ( UnknownHostException e ) {
  89. e.printStackTrace ( );
  90. }
  91. catch ( IOException e ) {
  92. e.printStackTrace ( );
  93. }
  94. finally {
  95. try {
  96. if (dis != null) {
  97. dis.close ( );
  98. }
  99. if (dos != null) {
  100. dos.close ( );
  101. }
  102. }
  103. catch ( IOException e ) {
  104. e.printStackTrace ( );
  105. }
  106. cHandler.sendEmptyMessage ( 0x02 );
  107. }
  108. }
  109.  
  110. };
  111. cThread.start ( );
  112. break;
  113. case 0x02 :
  114. cTextViewContent.setText ( cContent );
  115. break;
  116.  
  117. default :
  118. break;
  119. }
  120. }
  121.  
  122. };
  123.  
  124. @ Override
  125. protected void onCreate ( Bundle savedInstanceState ) {
  126.  
  127. super.onCreate ( savedInstanceState );
  128. this.getWindow ( )
  129. .setFlags ( WindowManager.LayoutParams.FLAG_FULLSCREEN ,
  130. WindowManager.LayoutParams.FLAG_FULLSCREEN );
  131. this.requestWindowFeature ( Window.FEATURE_NO_TITLE );
  132. setContentView ( R.layout.activity_main );
  133. init ( );
  134. }
  135.  
  136. /**
  137. * 初始化
  138. *
  139. */
  140. private void init ( ) {
  141.  
  142. cButtonSend = ( Button ) findViewById ( R.id.btn );
  143. cEditTextContent = ( EditText ) findViewById ( R.id.et );
  144. cTextViewContent = ( TextView ) findViewById ( R.id.tv );
  145. cButtonSend.setOnClickListener ( new OnClickListener ( ) {
  146.  
  147. @ Override
  148. public void onClick ( View v ) {
  149.  
  150. cHandler.sendEmptyMessage ( 0x01 );
  151. }
  152. } );
  153. }
  154.  
  155. }

布局文件

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:id="@+id/LinearLayout1"
  4. android:layout_width="match_parent"
  5. android:layout_height="match_parent"
  6. android:orientation="vertical" >
  7.  
  8. <Button
  9. android:id="@+id/btn"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:layout_gravity="center_horizontal"
  13. android:text="发送" />
  14.  
  15. <EditText
  16. android:id="@+id/et"
  17. android:layout_width="match_parent"
  18. android:layout_height="150dp"
  19. android:layout_marginTop="10dp"
  20. android:background="@drawable/et_shape" />
  21.  
  22. <TextView
  23. android:id="@+id/tv"
  24. android:layout_width="match_parent"
  25. android:layout_height="150dp"
  26. android:layout_marginTop="10dp"
  27. android:background="@drawable/tv_shape" />
  28.  
  29. </LinearLayout>

当用户在编辑框中输入内容,便可以在TextView中显示出来

温馨提示  :

   运行项目之前,一定要把服务端先启动 ,在运行客户端

  

android中利用Socket实现手机客户端与PC端进行通信的更多相关文章

  1. linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

    单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #inc ...

  2. Android中基于Socket的网络通信

    1. Socket介绍 2. ServerSocket的建立与使用 3. 使用ServerSocket建立聊天服务器-1 4. 使用ServerSocket建立聊天服务器-2 5. 在Android中 ...

  3. Android中利用Handler实现消息的分发机制(三)

    在第二篇文章<Android中利用Handler实现消息的分发机制(一)>中,我们讲到主线程的Looper是Android系统在启动App的时候,已经帮我们创建好了,而假设在子线程中须要去 ...

  4. Android中利用ant进行多渠道循环批量打包

    公司负责Android开发的小伙伴学习能力稍微偏弱,交代给他的自动化打包的任务,弄了好久依然没有成效.无奈只好亲自出手. 没有想到过程很顺利,我完全按照如下文章的步骤进行: 主要参考: Android ...

  5. 用PHP的socket实现客户端到服务端的通信

    服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'loca ...

  6. Windows中利用共享内存来实现不同进程间的通信

    Windows中利用共享内存来实现不同进程间的通信 一.msdn详细介绍 https://docs.microsoft.com/zh-cn/windows/win32/memory/sharing-f ...

  7. 手机控制台调试(需PC端协助)

    工具需求: 1.PC 2.手机(暂时只测试安卓,ios可能是在证书上有区别?) 3.以上两个工具在同一局域网下 步骤:  一 ,PC端登录nodejs官网,选择并下载安装 next,下一步下一步即可( ...

  8. EBS中利用Socket与外系统通信

    某银行要求做一个签到签退功能,日终EBS系统发送报文与核心系统对帐,规定利用Socket来做传送,记录下步骤: 1.编辑: $INST_TOP/ora/10.1.3/j2ee/oacore/appli ...

  9. 34、Android中基于Socket的网络通信(一)

    Socket又称”套接字”,应用程序通常通过”套接字”向网络发出请求或者应答网络请求. 在java中,Socket和ServerSocket类库位于java.net包中,ServerSocket用于服 ...

随机推荐

  1. IE文档版本和文档流模式

    使用X-UA-Compatible来设置IE浏览器兼容模式 文件兼容性用于定义让IE如何编译你的网页.此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式. < ...

  2. 【JAVA 文件概述】

    一.概述 使用此类的原因: 该类将文件或者文件夹封装成对象.方便对文件与文件夹的属性信息进行操作.File对象作为参数传递给流的构造函数.要求:使用File类的常用方法. windows平台下,目录分 ...

  3. SPOJ220 Relevant Phrases of Annihilation(后缀数组)

    引用罗穗骞论文中的话: 先将n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组.然后二分答案,再将后缀分组.判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并 ...

  4. PowerDesigner生成sql及HTML格式数据库文档

    一.PowerDesigner生成sql问题 生成sql的方法是 Database -->Generate Database (Ctrl + G ) 但是提示 Could not load VB ...

  5. window.location.href和window.location.replace的区别

    有3个html页面(.html, .html, .html). 进系统默认的是1.html ,当我进入2.html的时候, .html里面用window.location.replace(" ...

  6. WPF之MVVM(Step2)——自己实现DelegateCommand:ICommand

    在自己实现MVVM时,上一篇的实现方式基本是不用,因其对于命令的处理不够方便,没写一个命令都需要另加一个Command的类.此篇主要介绍DelegateCommand来解决上面所遇到的问题. 首先,我 ...

  7. Vs2010工具栏显示“开始执行“按钮

    转载来源:http://blog.csdn.net/fromhj/article/details/8795047 前言 在用visual studio 2010的时候,要运行程序,可以使用 1.菜单- ...

  8. Understanding Execution Governors and Limits

    在编写Salesforce后台代码的时候,如果数据量比较大,或者需要与数据库的交互比较频繁的话,那么会抛出一些限制的异常,来提示你让你做进一步的修改. 有这些限制实质上是跟Salesforce是一个云 ...

  9. 智能车学习(四)—— Cmp学习

    一.代码共享 1.cmp.h #ifndef HSCMP_H #define HSCMP_H //1 头文件 #include "common.h" //2 宏定义 //2.1比较 ...

  10. ie上如何兼容placeholder

    首先,判断浏览器是否支持placeholder属性: var input = document.createElement('input'); if("placeholder" i ...