面试时写过,但是很乱,今天看到代码库里有一个,还是很规范的,贴出来。
主要用到俩类,一个是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(); } } }