zoukankan      html  css  js  c++  java
  • android:Socket编程 模拟骂街

      所谓"骂街",就两个人"A","B"对骂,A骂B的过程是这样的: A发出信息---B接收信息--B处理信息(理解A骂的话,想着怎么回应A)--B发送

    信息(反骂)--A接收信息--A处理信息(理解B骂的话,想着怎么回应B)。循环这个过程。

      客户端:

      1 package com.example.csserver;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.BufferedWriter;
      5 import java.io.IOException;
      6 import java.io.InputStreamReader;
      7 import java.io.OutputStreamWriter;
      8 import java.net.Socket;
      9 
     10 import java.util.Timer;
     11 import java.util.TimerTask;
     12 
     13 import android.app.Activity;
     14 import android.os.Bundle;
     15 import android.os.Handler;
     16 import android.os.Message;
     17 
     18 import android.view.View;
     19 import android.view.View.OnClickListener;
     20 import android.widget.Button;
     21 import android.widget.EditText;
     22 
     23 public class MainActivity extends Activity {
     24 
     25     public EditText et_client;
     26     private EditText et_ip;
     27     private EditText et_port;
     28     public EditText et_service;
     29     public Button bt_send;
     30     private Button bt_stop;
     31     public String clientText;
     32     private String host=null ;
     33     private int port=0 ;
     34     private BufferedReader br;
     35     private BufferedWriter bw;
     36     Timer timer=null;
     37 
     38     @Override
     39     public void onCreate(Bundle savedInstanceState) {
     40         super.onCreate(savedInstanceState);
     41         setContentView(R.layout.activity_main);
     42         et_ip=(EditText)findViewById(R.id.et_ip);
     43         et_port=(EditText)findViewById(R.id.et_port);
     44         bt_stop=(Button)findViewById(R.id.bt_stop);
     45         et_client = (EditText) findViewById(R.id.et_client);
     46         et_service = (EditText) findViewById(R.id.et_service);
     47         bt_send = (Button) findViewById(R.id.bt_send);
     48         
     49         bt_send.setOnClickListener(new OnClickListener() {
     50 
     51             @Override
     52             public void onClick(View v) {
     53                 host=et_ip.getText().toString().trim();
     54                 port=Integer.parseInt(et_port.getText().toString().trim());
     55                 clientText = et_client.getText().toString();
     56                 sendTimer();
     57 
     58             }
     59         });
     60         bt_stop.setOnClickListener(new OnClickListener() {
     61             
     62             @Override
     63             public void onClick(View v) {
     64                 
     65                      if (task != null) {
     66                          task.cancel();
     67                          task = null;
     68                      }
     69                      if (timer != null) {
     70                          timer.cancel();
     71                          timer.purge();
     72                          timer = null;
     73                      }
     74 
     75                 
     76             }
     77         });
     78         
     79     }
     80     
     81     /**
     82      * 接收服务器返回的数据
     83      * @param receiveSocket
     84      * @return
     85      * @throws IOException
     86      */
     87     private String receiveData(Socket receiveSocket) throws IOException {
     88          br = new BufferedReader(new InputStreamReader(
     89                 receiveSocket.getInputStream()));
     90         String receiveStr = br.readLine();
     91         br.close();
     92         return receiveStr;
     93 
     94     }
     95     /**
     96      * 向服务器发送数据
     97      * @param sendSocket
     98      * @param sendText
     99      */
    100     private void transData(Socket sendSocket, String sendText) {
    101         try {
    102              bw = new BufferedWriter(new OutputStreamWriter(
    103                     sendSocket.getOutputStream()));
    104             bw.write(sendText.replace("\n", " ") + "\n");
    105             bw.flush();
    106         
    107         } catch (IOException e) {
    108             // TODO 自动生成的 catch 块
    109             e.printStackTrace();
    110         }
    111     }
    112     /**
    113      * 创建客户端Socket
    114      * @param host
    115      * @param port
    116      * @return
    117      * @throws IOException
    118      * @throws IOException
    119      */
    120     private Socket requestSocket(String host, int port) throws IOException,
    121             IOException {
    122         Socket socket = new Socket(host, port);
    123         return socket;
    124     }
    125     /**    
    126      * 关闭Socket
    127      * 注意:"流可以关 但要等到服务器验证完毕后再关  尤其是你的输出流 "
    128      * @param socket
    129      * @throws IOException
    130      */
    131     private void closeSocket(Socket socket) throws IOException{
    132         br.close();
    133         bw.close();
    134         socket.close();
    135         
    136     }
    137     Handler timerHandler = new Handler() {
    138         public void handleMessage(Message msg) {
    139             Bundle bd = msg.getData();
    140             if (msg.what == 1) {
    141 
    142                 et_service.setText(bd.getString("data"));
    143 
    144             }
    145             super.handleMessage(msg);
    146         }
    147     };
    148 
    149     TimerTask task = new TimerTask() {
    150 
    151         public void run() {
    152             Message message = new Message();
    153             message.what = 1;
    154             try {
    155                 Socket socket = requestSocket(host, port);
    156                 transData(socket, clientText);
    157                 String showText = receiveData(socket);
    158                 closeSocket(socket);
    159                 Bundle bundle = new Bundle();
    160                 bundle.putString("data", showText);
    161                 message.setData(bundle);
    162                 timerHandler.sendMessage(message);
    163             } catch (IOException e) {
    164                 // TODO 自动生成的 catch 块
    165                 e.printStackTrace();
    166             }
    167 
    168         }
    169     };
    170     
    171     private void sendTimer() {
    172         timer=new Timer();
    173         timer.schedule(task, 1000, 400);
    174     }
    175 }
    176 
    177  

      服务端:

      1 package com.test;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.BufferedWriter;
      5 import java.io.IOException;
      6 import java.io.InputStreamReader;
      7 import java.io.OutputStreamWriter;
      8 import java.net.ServerSocket;
      9 import java.net.Socket;
     10 
     11 public class Test extends Thread {
     12     private  int i=0;
     13 
     14 private Test() throws IOException {
     15    CreateSocket();
     16    //创建Socket服务器
     17 } 
     18 
     19 public void run() { 
     20    Socket client;
     21    String txt;
     22    try { 
     23     while (true)
     24     //线程无限循环,实时监听socket端口
     25     {
     26      client=ResponseSocket();       
     27      //响应客户端链接请求。。
     28     
     29      while(true)
     30      {
     31       txt=ReceiveMsg(client);  
     32       System.out.println(txt);
     33       //链接获得客户端发来消息,并将其显示在Server端的屏幕上
     34    
     35       SendMsg(client,txt);
     36       //向客户端返回消息
     37 
     38       if(true)break;
     39       //中断,继续等待链接请求
     40      }
     41     
     42      CloseSocket(client);
     43      //关闭此次链接
     44     }   
     45    } 
     46    catch (IOException e) {
     47     System.out.println(e);
     48    }
     49 
     50 }
     51 
     52 private ServerSocket server = null;
     53 private static final int PORT = 2000;
     54 private BufferedWriter writer;
     55 private BufferedReader reader;
     56 
     57 private void CreateSocket() throws IOException
     58 {
     59    server = new ServerSocket(PORT, 100);
     60    System.out.println("Server starting..");  
     61 }
     62 
     63 private Socket ResponseSocket() throws IOException
     64 {
     65    Socket client = server.accept(); 
     66    System.out.println("client connected..");
     67   
     68    return client;
     69 }
     70 
     71 private void CloseSocket(Socket socket) throws IOException
     72 {
     73    reader.close();
     74    writer.close();
     75    socket.close();
     76    System.out.println("client closed..");
     77 }
     78 
     79 private void SendMsg(Socket socket,String Msg) throws IOException 
     80 {
     81    writer = new BufferedWriter(
     82       new OutputStreamWriter(socket.getOutputStream()));
     83    i++;
     84     writer.write(Msg+i+"\n");
     85     writer.flush();
     86    
     87 }
     88 
     89 private String ReceiveMsg(Socket socket) throws IOException
     90 {
     91    reader = new BufferedReader(
     92      new InputStreamReader(socket.getInputStream()));     
     93     System.out.println("server get input from client socket..");
     94     String txt="client send:"+reader.readLine();
     95    
     96     return txt;
     97 }
     98 
     99 public static void main(final String args[]) throws IOException {
    100     Test yaochatserver = new Test();
    101    if (yaochatserver != null) {
    102     yaochatserver.start();
    103    }
    104 }
    105 
    106 }

      布局文件:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent" >
     5 
     6     <EditText
     7         android:id="@+id/et_service"
     8         android:layout_width="fill_parent"
     9         android:layout_height="50dp"
    10         android:layout_alignParentBottom="true"
    11         android:layout_alignParentLeft="true"
    12         android:layout_marginTop="109dp"
    13         android:text="准备接受信息" />
    14 
    15     <Button
    16         android:id="@+id/bt_stop"
    17         android:layout_width="wrap_content"
    18         android:layout_height="wrap_content"
    19         android:layout_alignParentLeft="true"
    20         android:layout_centerVertical="true"
    21         android:text="停止发送" />
    22 
    23     <Button
    24         android:id="@+id/bt_send"
    25         android:layout_width="wrap_content"
    26         android:layout_height="wrap_content"
    27         android:layout_alignBaseline="@+id/bt_stop"
    28         android:layout_alignBottom="@+id/bt_stop"
    29         android:layout_alignParentRight="true"
    30         android:text="发送信息" />
    31 
    32     <TextView
    33         android:id="@+id/textView1"
    34         android:layout_width="wrap_content"
    35         android:layout_height="wrap_content"
    36         android:layout_alignParentLeft="true"
    37         android:layout_alignParentTop="true"
    38         android:text="配置服务器地址:"
    39         android:textSize="23dp" />
    40 
    41     <EditText
    42         android:id="@+id/et_ip"
    43         android:layout_width="wrap_content"
    44         android:layout_height="wrap_content"
    45         android:layout_alignParentRight="true"
    46         android:layout_alignParentTop="true"
    47         android:text="192.168.0.196" >
    48 
    49         
    50     </EditText>
    51 
    52     <EditText
    53         android:id="@+id/et_client"
    54         android:layout_width="fill_parent"
    55         android:layout_height="wrap_content"
    56         android:layout_above="@+id/bt_stop"
    57         android:layout_alignParentLeft="true"
    58         android:layout_marginBottom="46dp"
    59         android:hint="请输入发送的内容" />
    60 
    61     <TextView
    62         android:id="@+id/textView1"
    63         android:layout_width="wrap_content"
    64         android:layout_height="wrap_content"
    65         android:layout_alignParentLeft="true"
    66         android:layout_below="@+id/et_ip"
    67         android:text="配置服务器端口:"
    68         android:textSize="23dp" />
    69 
    70     <EditText
    71         android:id="@+id/et_port"
    72         android:layout_width="wrap_content"
    73         android:layout_height="wrap_content"
    74         android:layout_alignLeft="@+id/bt_send"
    75         android:layout_alignTop="@+id/textView1"
    76         android:text="2000" />
    77 
    78 </RelativeLayout>

      

      最开始编写时我遇到了一个稀奇古怪的问题,我的客户端在模拟器上时一切正常;当在真实的android客户端上时,服务器能收到客户端发送的信息,而客户端接收不到服务器返回的信息,我以为是防火墙或者局域网搞的怪,但跟为奇怪的是在调试模式下客户端还能收的服务器放回的信息,后来我更改了客户端发送和接收的处理流程问题得到了解决

  • 相关阅读:
    十三 web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息
    十二 web爬虫讲解2—Scrapy框架爬虫—Scrapy模拟浏览器登录—获取Scrapy框架Cookies
    十一 web爬虫讲解2—Scrapy框架爬虫—Scrapy使用
    十 web爬虫讲解2—Scrapy框架爬虫—Scrapy安装—Scrapy指令
    九 web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解
    八 web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用
    七 web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理
    六 web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求
    五 web爬虫,scrapy模块,解决重复ur——自动递归url
    四 web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签
  • 原文地址:https://www.cnblogs.com/sunfb/p/S_Fbuner.html
Copyright © 2011-2022 走看看