zoukankan      html  css  js  c++  java
  • Socket实现粗略的Android聊天功能

    面试时写过,但是很乱,今天看到代码库里有一个,还是很规范的,贴出来。

    主要用到俩类,一个是ServerSocket.class 一个是Socket.class。

    记得要加权限:  <uses-permission android:name="android.permission.INTERNET"/>

    Server端SimpleServer:
    
    package com.socket.androidServer;
    
    
    import java.io.IOException;
    import java.io.OutputStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    import java.util.ArrayList;
    import java.util.Scanner;
    
    public class SimpleServer {
        public static ArrayList<Socket> socketList=new ArrayList<Socket>();
        
        public static void main(String[] args) throws IOException {
            Scanner sc = new Scanner(System.in);
            ServerSocket ss=new ServerSocket(30000);
            while (true) {
                Socket s=ss.accept();
                socketList.add(s);
                new Thread(new ServerTherad(s)).start();
            }
        }
    
    }
    
    Server端SimpleServer:
    
    package com.socket.androidServer;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.Socket;
    import java.util.Iterator;
    import java.util.Scanner;
    
    public class ServerTherad implements Runnable {
        private Socket s = null;
        private BufferedReader buRead = null;
        StringBuffer stb=new StringBuffer();
        public ServerTherad(Socket s) throws IOException {
            this.s = s;
            this.buRead = new BufferedReader(new InputStreamReader(
                    this.s.getInputStream(), "utf-8"));
        }
    
        @Override
        public void run() {
            String connet=null;
            try {
                while ((connet=readFromClient())!=null) {
                    //System.out.println("信息
    "+stb.append(connet));
                    System.out.println("客户端说:"+connet);
                    for (Socket ss:SimpleServer.socketList) {
                        OutputStream out=ss.getOutputStream();
                        out.write((connet+"
    ").getBytes("utf-8"));
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        private String readFromClient(){
            try {
                return buRead.readLine();
            } catch (Exception e) {
                //删除此Socket
                SimpleServer.socketList.remove(s);
            }
            return null;
        }
    
    }
    Client端MainActivity:
    
    package com.socket.androidClient;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.Socket;
    import java.net.UnknownHostException;
    
    import com.example.socketdemo.R;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        private TextView testview=null;
        private Button button=null;
        private EditText text=null;
        protected Handler handler=null;
        private OutputStream out=null;
        private Socket s = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            this.testview=(TextView)super.findViewById(R.id.test);
            this.button=(Button)super.findViewById(R.id.button);
            this.text=(EditText)super.findViewById(R.id.edit);
        
            this.handler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    if (msg.what==0x123) {
                        testview.append("客户端说:"+msg.obj.toString()+"
    ");
                    }
                }
            };
            //4.0之后访问网络不能在主程序中进行,要将代码放在线程中,不然会报错。
            new Thread(new Runnable() {
                
                @Override
                public void run() {
                    try {
                        s=new Socket("10.0.2.2", 30000);
                        new Thread(new ClientThread(s, handler)).start();
                        out=s.getOutputStream();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
            
            this.button.setOnClickListener(new OnClickListener() {
                
                @Override
                public void onClick(View v) {
                    try {
                        out.write((text.getText().toString()+"
    ").getBytes("utf-8"));
                        text.setText("");
                    }catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
    }
    
    
    Client端ClientThread:
    
    package com.socket.androidClient;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.Socket;
    
    import android.os.Handler;
    import android.os.Message;
    
    public class ClientThread implements Runnable {
        private Socket socket=null;
        private Handler handler=null;
        BufferedReader br=null;
        public ClientThread(Socket s,Handler handler) throws IOException {
            this.socket=s;
            this.handler=handler;
            br=new BufferedReader(new InputStreamReader(s.getInputStream()));
        }
        @Override
        public void run() {
            try {
                String connet=null;
                while ((connet=br.readLine())!=null) {
                    Message message=new Message();
                    message.what=0x123;
                    message.obj=connet;
                    handler.sendMessage(message);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
  • 相关阅读:
    C++日记 OPENGL错误及解决方案
    C++日记 VS编译问题
    OpenGL 自制API 4
    C++日记 宏定义函数
    OpenGL 自制API gluPerspective
    OpenGL 自制API 3
    OpenGL 自制API 2
    OpenGL 自制API 1
    OPENGL入门教程
    c++基础的记录(随笔记录一些基础的东西)
  • 原文地址:https://www.cnblogs.com/yaxiaoke/p/5976907.html
Copyright © 2011-2022 走看看