android关于socket编程,以聊天为例【转】http://hi.baidu.com/yaoyuanhuajx/item/9b93d7565f315ba9acc857d7

一步一步android(15):关于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;

    }    
}

原文地址:https://www.cnblogs.com/songtzu/p/2883622.html