android关于socket编程【以聊天为例】
Android手机的应用,除了它的手机功能之外,另外一个吸引人的地方在于它的开放性,这一点iphone无法比拟,至少iphone太多商业化气息。 如同当年windows95一样,android为我们开启另一扇交流之窗,而要实现交流,socket通信必不可少。 java在socket通信方面上已经有了很好的范例,我只是抛砖引玉,将其引入到android之中,疏漏之处在所难免,很多地方也值得深思与考量,高手不必拍砖,可跳过此文。 下面,用敲门的方式演示Android如何实现套接字的通信。 本例实现功能如下: Server端开启服务 Client端发起链接请求,并向Server端发送数据 Server端响应请求,并在Server显示,向Client端返回数据 Client端接收Server的数据并显示 本例效果如下: 终端1: ![]() ![]() 终端2: ![]() ![]() Server端: ![]() ![]() 本例源代码如下: Server端: package com.android.Yao; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class YaoChatServer extends Thread { private YaoChatServer() throws IOException { CreateSocket(); //创建Socket服务器 } public void run() { Socket client; String txt; try { while (true) //线程无限循环,实时监听socket端口 { client=ResponseSocket(); //响应客户端链接请求。。 while(true) { txt=ReceiveMsg(client); System.out.println(txt); //链接获得客户端发来消息,并将其显示在Server端的屏幕上 SendMsg(client,txt); //向客户端返回消息 if(true)break; //中断,继续等待链接请求 } CloseSocket(client); //关闭此次链接 } } catch (IOException e) { System.out.println(e); } } private ServerSocket server = null; private static final int PORT = 5000; private BufferedWriter writer; private BufferedReader reader; private void CreateSocket() throws IOException { server = new ServerSocket(PORT, 100); System.out.println("Server starting.."); } private Socket ResponseSocket() throws IOException { Socket client = server.accept(); System.out.println("client connected.."); return client; } private void CloseSocket(Socket socket) throws IOException { reader.close(); writer.close(); socket.close(); System.out.println("client closed.."); } private void SendMsg(Socket socket,String Msg) throws IOException { writer = new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())); writer.write(Msg+"/n"); writer.flush(); } private String ReceiveMsg(Socket socket) throws IOException { reader = new BufferedReader( new InputStreamReader(socket.getInputStream())); System.out.println("server get input from client socket.."); String txt="Sever send:"+reader.readLine(); return txt; } public static void main(final String args[]) throws IOException { YaoChatServer yaochatserver = new YaoChatServer(); if (yaochatserver != null) { yaochatserver.start(); } } } Client端: package com.android.Yao; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.net.UnknownHostException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.*; public class YaoChatRoomAndroid extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.chatroom); findviews(); setonclick(); } private EditText chattxt; private TextView chattxt2; private Button chatok; public void findviews() { chattxt = (EditText)this.findViewById(R.id.chattxt); chattxt2 = (TextView)this.findViewById(R.id.chattxt2); chatok = (Button)this.findViewById(R.id.chatOk); } private void setonclick() { chatok.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { connecttoserver(chattxt.getText().toString()); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } public void connecttoserver(String socketData) throws UnknownHostException, IOException { Socket socket=RequestSocket("192.168.0.107",5000); SendMsg(socket,socketData); String txt = ReceiveMsg(socket); this.chattxt2.setText(txt); } private Socket RequestSocket(String host,int port) throws UnknownHostException, IOException { Socket socket = new Socket(host, port); return socket; } private void SendMsg(Socket socket,String msg) throws IOException { BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); writer.write(msg.replace("/n", " ")+"/n"); writer.flush(); } private String ReceiveMsg(Socket socket) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String txt=reader.readLine(); return txt; } |