Android上JAVA Socket通信解析(一)初识socket通信
来源:互联网 发布:淘宝可以上闲鱼吗 编辑:程序博客网 时间:2024/06/05 11:21
1.简介
TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP通信协议在通信的两端各建立一个Socket,从而在通信的两端之间形成虚拟链路,一旦建立了虚拟链路,两端的程序就能够通过虚拟链路进行通信。
Java语言对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信接口,并通过Socket产生IO流来进行网络通信,输入流:InputStream读取数据,输出流:OutputStream写入数据;
Java语言对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信接口,并通过Socket产生IO流来进行网络通信,输入流:InputStream读取数据,输出流:OutputStream写入数据;
Socket通信的模型示意图;
下面就将进行进行socket通信的实战演示;
代码如下:
2 . 简单的客户端/服务器端socket通信
Java中使用ServerSocket来监听客户端Socket的连接,如果没有连接,则一直处于等待状态;本例子演示的是在同一个主机上,故服务器使用的笔记本,服务器地址使用的本机IP;代码如下:
public static void main(String[] args) { // TODO Auto-generated method stub try { ServerSocket ss = new ServerSocket(3000); while (true) { Socket s = ss.accept();// InputStream in = s.getInputStream(); String msg = "你好,收到服务器的祝福:"+Math.random()*10; OutputStream os = s.getOutputStream(); os.write(msg.getBytes("utf-8")); os.close(); s.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
3. 客户端请求数据
客户端比较简单,使用Android的一个普通acitivity中,点击button开启一个线程连接服务器端,读取服务器的数据,获取到数据后,弹出一个toast并显示;其中Android中的AndroidManifest.xml中需要申请网络访问权限:
<uses-permission android:name="android.permission.INTERNET"/>
AndroidManifest.xml文件如下:
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.anana.sockettest"> <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application></manifest>
4,xml布局文件内容
代码如下:
<?xml version="1.0" encoding="utf-8"?><LinearLayout 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" android:orientation="vertical" tools:context="com.anana.sockettest.MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <Button android:id="@+id/request" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="请求服务器" /> </LinearLayout></LinearLayout>
5.activity代码内容
activity中代码,监听button按钮的click事件,响应事件后,开启一个线程,向服务器请求数据,并弹toast显示获取的内容;
代码如下:
public class MainActivity extends AppCompatActivity{ private static final String TAG = "socket"; Button request; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); request = (Button) findViewById(R.id.request); request.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Log.e(TAG, "start request"); startRequest(); } }); } //本机ip地址,麻烦修改为自己的ip private static final String SERVER_IP = "192.168.23.104"; private static final int PORT = 3000; private void startRequest() { new Thread(new Runnable() { @Override public void run() { try { //两种建立socket的方式,一种使用connect,一种指定访问端口 Socket s = new Socket(); //指定访问ip和端口// Socket s = new Socket(SERVER_IP, PORT); s.connect(new InetSocketAddress(SERVER_IP, PORT), 5000); s.setSoTimeout(5000); //读取数据的方式,一种使用BufferedReader,一种使用Scanner// BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream// ())); Scanner scan = new Scanner(s.getInputStream()); final String line = scan.nextLine(); runOnUiThread(new Runnable() { @Override public void run() { Log.e(TAG, "s request result"); Toast.makeText(MainActivity.this, line, Toast.LENGTH_SHORT).show(); } }); scan.close(); s.close(); } catch (ConnectException e) { tiemout(e); } catch (SocketTimeoutException e) { tiemout(e); } catch (IOException e) { e.printStackTrace(); } } }).start(); }}
关于服务器和客户端的多线程通信的例子可以参考文章:Android上JAVA Socket通信解析(二)多线程通信
阅读全文
0 0
- Android上JAVA Socket通信解析(一)初识socket通信
- Android上JAVA Socket通信解析(二)多线程通信
- android socket通信(上)
- android socket通信(上)
- android socket通信(上)
- Java Socket应用(一)--Socket通信
- Android通信一:Socket通信
- Java Socket 通信 (一)
- java Socket通信(一)
- java Socket通信(一)
- java Socket通信(一)
- java Socket通信(一)
- java Socket通信(一)
- java Socket通信(一)
- java Socket 通信一
- Socket通信,Android,java
- socket通信(一)
- Tcp/Ip Socket通信一之初识
- 无法打开**,因为此版本的应用程序不支持其项目类型(.vcproj)
- RunLoop使用
- TensorFlow中关于pad函数的详细理解
- C++定义理解
- linux+vsCode+makefile -- 调试C
- Android上JAVA Socket通信解析(一)初识socket通信
- 不要小看Word中的这4个小技巧,全会的是大神!
- windows git 提示 warning: LF will be replaced by CRLF 的解决方法
- 如何负责一个项目的质量保证工作?
- Java多线程编程核心技术学习(二)
- CodeForces
- 附加4个行业的对比表格
- 2017年9月小记
- React简单使用(二)