zoukankan      html  css  js  c++  java
  • 使用Socket沟通

       当两台电脑TCP/IP协议进行通讯。平时Socket对象来表示该通信接口的两端,并通过Socket生产I/O流进行网络通信。

    其中ServerSocket对象可以接收从连接的其他通信实体的请求。这个目的是用于侦听client的Socket连接。假设没有连接,它将一直处于等待状态。

    在本文中将创建一个server端的ServerSocket 和 手机client的Socket . 使它们建立连接。产生I/O流,在手机上显示获取的数据。

    终于得到的结果例如以下图所看到的。


    首先建一个Java项目。用来创建ServerSocket. 代码例如以下

    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    public class SimpleServer {
    
    	public static void main(String[] args) throws IOException {
    		//创建一个ServerSocket,用于监听clientSocket的连接请求
    		ServerSocket ss = new ServerSocket(30000);
    		System.out.println("server端已准备接受请求");
    		//使用循环不断接收来自client的请求
    		while(true){
    			//每当接收到一个clientSocket的请求。server端也会相应产生一个Socket对象
    			Socket s = ss.accept();
    			OutputStream os = s.getOutputStream();
    			//输出字符串。并强行使用UTF-8字符集进行编码
    			os.write("您好。您收到了server的新年祝福!

    ".getBytes("utf-8")); //关闭输出流,关闭Socket os.close(); s.close(); } } }


    然后建立一个Android项目,activity_main.xml 代码 例如以下

    <RelativeLayout 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"
        tools:context="${packageName}.${activityClass}" >
    
        <EditText
            android:id="@+id/show"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />
    
    </RelativeLayout>
    


    MainActivity.java 代码 例如以下

    package com.wyb.simpleclient;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.EditText;
    
    public class MainActivity extends Activity {
    
    	private EditText show;
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		
    		show =  (EditText)findViewById(R.id.show);
    		///创建一个新线程来进行网络操作
    		new Thread(){
    
    			@Override
    			public void run() {
    				
    				try {
    					//建立连接到远程server的Socket 
    					Socket socket = new Socket("192.168.0.104",30000);
    					//将Socket相应的输入流包装成BufferedReader
    					BufferedReader br = new BufferedReader(
    							new InputStreamReader(socket.getInputStream()));
    					//进行普通的I/O操作
    					String line = br.readLine();
    					//在该线程中控制UI中的EditText控件显示内容
    					show.setText("来自server的数据: "+ line);
    					//关闭流、socket
    					br.close();
    					socket.close();
    				} catch (UnknownHostException e) {
    					e.printStackTrace();
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    			}
    			
    		}.start();
    	}
    }
    

    代码其中192.168.0.104 为本机的IP地址 查询本机IP地址能够通过在開始中输入 cmd 进入控制台界面,然后输入 IPconfig  按回车 就可以得到相关信息。

    因为在本项目其中使用到了网络通信。因此一定要再AndroidManifest.xml其中配置訪问互联网的权限。

    <uses-permission android:name="android.permission.INTERNET"/>

    从Android2.3以后的版本号中。Android平台不同意直接在UI线程建立网络连接。访问网络资源。

    因此,有必要在新的线程与网络相关的操作。用在本项目上的使用

    new Thread() 要创建一个新的线程。 控制新的线程UI该 EditText 控制显示得到的内容。

    但是,一般情况下。UI 在其他线程的控制是不可操作。除ProgressBar 和EditText 外(现在我知道) 

  • 相关阅读:
    307.区域与检索--数组可修改
    202.快乐数
    263.丑数
    205.同构字符串
    204.计数质数
    40.组合总和Ⅱ
    811.子域名访问计数
    39.组合总和
    udp与tcp
    SQL复习
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4600210.html
Copyright © 2011-2022 走看看