zoukankan      html  css  js  c++  java
  • Android 网络编程 Socket

     1.服务端开发

    创建一个Java程序

    public class MyServer {
    
    	// 定义保存所有的Socket,与客户端建立连接得到一个Socket
    	public static List<Socket> socketList = new ArrayList<Socket>();
    
    	public static void main(String[] args) throws IOException {
    
    		ServerSocket server = new ServerSocket(8888);
    
    		while (true) {
    			System.out.println("start listening port 8888");
    			Socket socket = server.accept();
    			System.out.println("connect succeed.");
    			socketList.add(socket);
    			//每当客户端连接之后启动一条ServerThread线程为该客户端服务    
    			 new Thread(new MyServerRunnable(socket)).start();   
    
    
    		}
    	}
    
    	public static class MyServerRunnable implements Runnable {
    		// 定义当前线程处理的Socket
    		Socket socket = null;
    		// 该线程所处理的Socket所对应的输入流
    		BufferedReader bufferedReader = null;
    
    		public MyServerRunnable(Socket socket) {
    			this.socket = socket;
    			try {
    				// 将服务器端的输入流的数据放入读Buffer中
    				bufferedReader = new BufferedReader(new InputStreamReader(
    						socket.getInputStream()));
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    
    		}
    
    		@Override
    		public void run() {
    			String content = null;
    			// 采用循环不断的从Socket中读取客户端发送过来的数据
    			while ((content = readFromClient()) != null) {
    				// 遍历socketList中的每一个Socket,将读取的内容向每个Socket发送一次
    				for (Socket socket : MyServer.socketList) {
    					OutputStream outputStream;
    					try {
    						outputStream = socket.getOutputStream();
    						outputStream.write(("Server: " + content + "
    ").getBytes("utf-8"));
    					} catch (IOException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    
    		}
    
    		// 定义读取客户端的信息
    		public String readFromClient() {
    			try {
    				return bufferedReader.readLine();
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    			return null;
    		}
    
    	}
    
    }
    

     2. 创建一个Android程序

    1) Layout

    <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:gravity="center"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <TextView
            android:id="@+id/show"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="显示接收到服务器端数据" />
    
        <Button
            android:id="@+id/send"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="发送数据到服务器端" />
    
    </LinearLayout>
    

     2)ClientThread类

    package com.example.testclient;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.InetSocketAddress;
    import java.net.Socket;
    import java.net.SocketTimeoutException;
    
    import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;
    import android.util.Log;
    
    public class ClientThread implements Runnable {
    	private Socket s;
    	// 定义向UI线程发送消息的Handler对象
    	Handler handler;
    	// 定义接收UI线程的Handler对象
    	Handler revHandler;
    	// 该线程处理Socket所对用的输入输出流
    	BufferedReader br = null;
    	OutputStream os = null;
    
    	public ClientThread(Handler handler) {
    		this.handler = handler;
    	}
    
    	@Override
    	public void run() {
    		s = new Socket();
    		Log.d("111111111111", "@@@@@@@@@@@@@@@@@@@@");
    		try {
                  //192.168.0.26 为PC IP地址。

    s.connect(new InetSocketAddress("192.168.0.26", 8888), 5000); Log.d("111111111111", "$$"); br = new BufferedReader(new InputStreamReader(s.getInputStream())); os = s.getOutputStream(); // 启动一条子线程来读取服务器相应的数据 new Thread() { @Override public void run() { String content = null; // 不断的读取Socket输入流的内容 try { while ((content = br.readLine()) != null) { // 每当读取到来自服务器的数据之后,发送的消息通知程序 // 界面显示该数据 Message msg = new Message(); msg.what = 0x123; msg.obj = content; handler.sendMessage(msg); Log.d("111111111111", content); } } catch (IOException io) { io.printStackTrace(); } } }.start(); // 为当前线程初始化Looper Looper.prepare(); // 创建revHandler对象 revHandler = new Handler() { @Override public void handleMessage(Message msg) { // 接收到UI线程的中用户输入的数据 if (msg.what == 0x345) { // 将用户在文本框输入的内容写入网络 try { os.write(("Client" + msg.obj.toString() + " ") .getBytes("utf-8")); } catch (Exception e) { e.printStackTrace(); } } } }; // 启动Looper Looper.loop(); } catch (SocketTimeoutException e) { Message msg = new Message(); msg.what = 0x123; msg.obj = "网络连接超时!"; handler.sendMessage(msg); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

     3. MainActivity

    public class MainActivity extends Activity {
    
    	Handler handler;
    	// 定义与服务器通信的子线程
    	ClientThread clientThread;
    	TextView show;
    	Button send;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		show = (TextView) this.findViewById(R.id.show);
    		send = (Button) this.findViewById(R.id.send);
    
    		send.setOnClickListener(new View.OnClickListener() {
    
    			@Override
    			public void onClick(View arg0) {
    				// TODO Auto-generated method stub
    				try {
    					// 当用户按下按钮之后,将用户输入的数据封装成Message
    					// 然后发送给子线程Handler
    					Message msg = new Message();
    					msg.what = 0x345;
    					msg.obj = "Android 网络编程--Socket通信编程";
    					clientThread.revHandler.sendMessage(msg);
    
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    		handler = new Handler() {
    			@Override
    			public void handleMessage(Message msg) {
    				// 如果消息来自子线程
    				if (msg.what == 0x123) {
    					// 将读取的内容追加显示在文本框中
    					show.append("
    " + msg.obj.toString());
    					show.setTextSize(50);
    				}
    			}
    		};
    		clientThread = new ClientThread(handler);
    		// 客户端启动ClientThread线程创建网络连接、读取来自服务器的数据
    		new Thread(clientThread).start();
    
    	}
    
    
    }
    

     参考:http://blog.csdn.net/thanksgining/article/details/43561053

  • 相关阅读:
    快速整理sql表结构到wiki
    mac subline批量处理行
    iphone7忘记手机屏幕密码
    docker 常用命令
    初窥响应式布局
    用jquery写的一个图片轮播插件
    javascript中的对象和创建对象的主要模式
    用户注册界面(带js特效)
    用javascript实现简易留言板
    用javascript实现的购物车实例
  • 原文地址:https://www.cnblogs.com/linlf03/p/5124061.html
Copyright © 2011-2022 走看看