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();
        }
    }

}
原文地址:https://www.cnblogs.com/yaxiaoke/p/5976907.html