Android 简单UDP发送接收

摘要:
“);}catch(异常){updatetrack(”客户端:错误!“);{}}publicclassServer实现可运行的{@Overridepublicvoidrun(){while(true){try{InetAddressserverAddr=InetAddress。getByName(SERVERIP);updatetrack(“服务器:开始连接”);DatagramSocketsocket=newDatagram套接字(服务器端口,服务器地址);byte[]buf=newbyte[17];Datagram Packetpacket=newDatagramPacket(buf,buf.length);updatetrack(服务器:接收);socket.receive(数据包);updatatrack(“服务器:消息接收:”“+newString(packet.getData())+”“”“);updatetrack(“服务器:成功!”);}catch(异常){updatetrack(“服务器:错误!”);}}}}publicvoidupdatetrack(字符串){Messagemsg=newMessage();StringtextTochange=s;msg.obj=textTochange;Handler.sendMessage(msg);}@覆盖publicbooleanCreateOptionsMenu(菜单菜单){//充气菜单;这将站点添加到显示的反应区。getMenuInflator()。充气(R.menu.activity_main,菜单);returntrue;}@覆盖publicvoidonClick(Viewv){//TODOAuto-generatedmethodstudif(v.getId()==R.id.button1){Tools.Queue_Send.offer(input.getText().toString());Log.d(“条目数”,Tools.Queee_Send.size()+“”);}}布局代码:˂?xmlversion=“1.0”encoding=“utf-8”?

主代码:

packagecom.example.test;



importjava.net.DatagramPacket;
importjava.net.DatagramSocket;
importjava.net.InetAddress;

importandroid.os.Bundle;
importandroid.os.Message;
importandroid.app.Activity;
importandroid.util.Log;
importandroid.view.Menu;
importandroid.view.View;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.TextView;
importandroid.os.Handler;

public class MainActivity extends Activity implementsandroid.view.View.OnClickListener {
     public static final String SERVERIP = "127.0.0.1"; 
     public static final int SERVERPORT = 4444;
     publicTextView text1;
     publicEditText input;
     publicButton btn;
     publicHandler Handler;

     @Override
     protected voidonCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          text1 =(TextView) findViewById(R.id.textView1);
          input =(EditText) findViewById(R.id.editText1);
          btn =(Button) findViewById(R.id.button1);
          btn.setOnClickListener(this);
                    
          Handler = newHandler() {
               @Override
               public voidhandleMessage(Message msg) {
                    String text =(String) msg.obj;
                    text1.append(text);
               }
          };
          
          
          
          new Thread(newServer()).start();
          new Thread(newClient()).start();
     
     }

     public class Client implementsRunnable {
          
          privateDatagramPacket packet;
          privateDatagramSocket socket;
          publicClient()
          {
               
          }
          @Override
          public voidrun() {
               while(true)
               {
                    if(Tools.Queue_Send.size()>0)
                    {
                         Log.d("Client个数", Tools.Queue_Send.size()+"");
                         try{
                              InetAddress serverAddr =InetAddress.getByName(SERVERIP);
                              updatetrack("Client: Start connecting
");
                              socket = newDatagramSocket();
                                        
                              byte[] buf =Tools.Queue_Send.poll().toString().getBytes();
                                                         
                              packet = newDatagramPacket(buf, buf.length,
                                        serverAddr, SERVERPORT);
                              updatetrack("Client: Sending ‘" + new String(buf) + "’
");
                              socket.send(packet);
                              socket.close();
                              updatetrack("Client: Message sent
");
                              updatetrack("Client: Succeed!
");
                         } catch(Exception e) {
                              updatetrack("Client: Error!
");
                         }
                    }
                    
               }
          }
     }

     public class Server implementsRunnable {
          @Override
          public voidrun() {
               while (true) {
                    try{
                         InetAddress serverAddr =InetAddress.getByName(SERVERIP);
                         updatetrack("
Server: Start connecting
");
                         DatagramSocket socket = newDatagramSocket(SERVERPORT,
                                   serverAddr);
                         byte[] buf = new byte[17];
                         DatagramPacket packet = newDatagramPacket(buf, buf.length);
                         updatetrack("Server: Receiving
");
                         socket.receive(packet);
                         updatetrack("Server: Message received: ‘"
                                   + new String(packet.getData()) + "’
");
                         updatetrack("Server: Succeed!
");
                    } catch(Exception e) {
                         updatetrack("Server: Error!
");
                    }
                    
               }
               
          }
     }

     public voidupdatetrack(String s) {
          Message msg = newMessage();
          String textTochange =s;
          msg.obj =textTochange;
          Handler.sendMessage(msg);
     }

     @Override
     public booleanonCreateOptionsMenu(Menu menu) {
          //Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
          return true;
     }

     @Override
     public voidonClick(View v) {
          //TODO Auto-generated method stub
          if(v.getId()==R.id.button1)
          {
               Tools.Queue_Send.offer(input.getText().toString());
               Log.d("加入个数", Tools.Queue_Send.size()+"");
          }
               
               
     }
}
布局代码:
<?xml version= "1.0" encoding = "utf-8"?>
<LinearLayout xmlns:android ="http://schemas.android.com/apk/res/android"android:layout_width= "fill_parent"android:layout_height ="fill_parent"android:orientation ="vertical" >
       
<EditText
        android:id ="@+id/editText1"android:layout_width ="match_parent"android:layout_height ="wrap_content" >
 
    <requestFocus android:layout_width= "match_parent" />
 
</EditText>
 
<Button
        android:id ="@+id/button1"android:layout_width ="wrap_content"android:layout_height ="wrap_content"android:text = "Send" />
 
<ScrollView
    android:layout_width= "wrap_content"android:layout_height= "wrap_content" >
 
<TextView
    android:id= "@+id/textView1"android:layout_width= "wrap_content"android:layout_height= "wrap_content"android:scrollbars= "vertical"android:text= "Communication History:"android:textAppearance= "?android:attr/textAppearanceLarge" />
</ScrollView>
</LinearLayout>
Tools类:
packagecom.example.test;

importjava.util.ArrayList;
importjava.util.LinkedList;
importjava.util.Queue;

public classTools {
     /*** 发送队列
     * */
     public static Queue<String> Queue_Send = new LinkedList<String>(); 
}
可以实现发送接收。
在这之前,我一直想实现点击发送就可以收到。
我知道服务器端和客户端都是线程一直开着,问题是客户端线程已经开着我怎样才能把要发的数据加载进去。
开始我想着用Handle类,这样应该可以实现,但做了一下,有点麻烦。
后面就建了一个静态数据队列,保存要发送的数据,这样就很简单了。
自己菜可以原谅,如果不学习就不可原谅。

免责声明:文章转载自《Android 简单UDP发送接收》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中k8s-pod下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

CSS-顶部滚动进度条

Documentbody{background-image:linear-gradient(torighttop,#f0050%,#ece50%);background-repeat:no-repeat;height:300vh;position:relative;background-size:100%calc(100%-100vh+5px);}body:...

Practical Shader Development: Vertex and Fragment Shaders for Game Developers (Kyle Hallady 著)

这是我们描述形状的方法之一,它将使计算机变得有意义。要定义形状,我们需要存储关于三件事的信息:顶点、边和面。顶点是三维空间中的点。边是连接顶点的最内层。面是由三个或多个角度形成的二维形状。你不能把脸想象成只有在记忆中恢复的一个网格的垂直面之间的空间,而每一个共享的需要和脸都是由垂直面顺序简单定义的。因为很多名字都不会出现在网格的“背面”,所以正面的哪一面很重...

微信小程序中使用Vant Weapp的ActionSheet上拉菜单出现的样式问题

以下修改的源码均在action-sheet组件中。在index.wxss:2.下方的取消按钮不居中,通过审查元素发现它的宽带已经超出了手机屏幕的宽度,出现的滚动条导致的,具体什么原因导致暂时不知,解决方案是给.van-action-sheet__cancel添加样式box-sizing:border-box可解决。在index.wxss:.van-actio...

Docker Compose 版本过高(Docker版本不匹配),降低docker-compose版本

好了,开始降级docker-compose,先卸载:#pipuninstalldocker-compose再安装指定版本:#pipinstalldocker-compose==1.5.2至此,docker-compose降版本成功!...

SpringBoot工程通过Maven引入自定义Jar包

A工程为:common工程打成jar包:common-0.0.1-SNAPSHOT.jar注意:A工程打包时要使用maven的插件进行打包,不然会打成SpringBoot的Jar包,无法使用。--字符集编码--˃打包时跳过测试配置1.8˂!...

阿里巴巴开源性能监控神器Arthas初体验

今天跟大家介绍一款阿里巴巴开源的性能分析神器Arthas官方网站:https://alibaba.github.io/arthas/index.htmlArthas能为你做什么事情呢?接下来,我们找个项目实际体验一下Arthas。﹏﹏﹏﹏上述几个命令只是性能测工作中常用的一些操作,Arthas还有很多其他维度的监控数据,大家可以去官网看下用户手册学习更多操作...