日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android socket 学习记录 之 执行new socket(ip, port)程序崩溃

發布時間:2024/9/5 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android socket 学习记录 之 执行new socket(ip, port)程序崩溃 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這段時間在學習Android的socket編程,我不是專做APP的,做的是bootloader、驅動、hal、framework這個線的,也就是系統搭建和功能優化設計。為了打通這整條線,為此學習了不少東西,今天把Android的socket學習記錄一下,以防止以后會出現這樣的低級錯誤。

?

我這里是在極客學院的源碼基礎上做的自己的一些添加和修改,學習開始不就是先會修改么,舉一反三,自然就很快學會了。由于看過視頻和資料后就迫不及待的按照自己的想法想做一個功能,但是遇到麻煩了,就是執行new socket(ip, port)程序崩潰的問題,怎么找都找不到,代碼也看不出問題,頭大了快一天,最終還是被解決了,O(∩_∩)O。不過也慶幸找遇到這樣的問題,以后就不會因為這個問題而傷腦筋了。

?

下面記錄一下源碼和相關說明。

主要使用了兩個java文件。

MainActivity.java:

?

<pre name="code" class="java">package com.jikexueyuan.mysocketclient;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.TextView; import android.widget.ToggleButton;public class MainActivity extends Activity {EditText ip;EditText port;EditText editText;TextView text;ToggleButton connect;Button send;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ip = (EditText) findViewById(R.id.ip);port = (EditText) findViewById(R.id.port);editText = (EditText) findViewById(R.id.edit);text = (TextView) findViewById(R.id.text);send = (Button) findViewById(R.id.send);connect = (ToggleButton) findViewById(R.id.connect);connect.setOnCheckedChangeListener(new ToggleButtonCheckedChangeEvent());send.setOnClickListener(new ButtonClickEvent());ConnectClass.datainit(ip, port, editText, text, send, connect);//傳遞布局數據給類ConnectClasssend.setEnabled(false);}// ----------------------------------------------------清除按鈕、發送按鈕class ButtonClickEvent implements View.OnClickListener {public void onClick(View v) {if (v == send) {ConnectClass.send();}}}class ToggleButtonCheckedChangeEvent implementsToggleButton.OnCheckedChangeListener {@Overridepublic void onCheckedChanged(CompoundButton buttonView,boolean isChecked) {if (buttonView == connect) {if (isChecked) {ConnectClass.connect(MainActivity.this);} else {ConnectClass.unconnect();}}}} }

?

?

這個主文件沒什么好說的,就是做一些初始化。相對于極客學院的code,我添加了ToggleButton按鈕,用于連接和斷開使用,另外還添加了一個端口設置窗口。布局文件也貼出來。

activity_main.xml:

?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/container"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><EditTextandroid:id="@+id/ip"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:hint="輸入服務器的IP地址"android:text="192.168.0.55" ></EditText><EditTextandroid:id="@+id/port"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="0.35"android:hint="輸入服務器的PORT"android:text="2030" ></EditText><ToggleButtonandroid:id="@+id/connect"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="連接"android:textOff="@string/connect"android:textOn="@string/unconnect" /></LinearLayout><ScrollViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_weight="0.86" ><TextViewandroid:id="@+id/text"android:layout_width="fill_parent"android:layout_height="fill_parent"android:text="Ready..." /></ScrollView><EditTextandroid:id="@+id/edit"android:layout_width="fill_parent"android:layout_height="wrap_content"android:hint="在這里輸入內容" /><Buttonandroid:id="@+id/send"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="發送" /></LinearLayout>


重點是ConnectClass.java這個類文件,源碼如下:

?

?

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="cpp">package com.jikexueyuan.mysocketclient;import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.Socket; import java.net.UnknownHostException; import android.content.Context; import android.os.AsyncTask; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import android.widget.ToggleButton;public class ConnectClass {static Socket socket = null;static BufferedWriter writer = null;static BufferedReader reader = null;static EditText ip;static EditText port;static EditText editText;static TextView text;static Button send;static ToggleButton connect;public static void datainit(final EditText tIp, final EditText tPort, final EditText tEditText, final TextView tText, final Button tButton, final ToggleButton tToggleButton){ip = tIp;port = tPort;editText = tEditText;text = tText;send = tButton;connect = tToggleButton;}public static void connect(final Context tActivity) {AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {@Overrideprotected Void doInBackground(Void... arg0) {try { socket = new Socket(ip.getText().toString(), Integer.decode(port.getText().toString()));writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // send.setEnabled(true);publishProgress("@success");} catch (UnknownHostException e1) {Toast.makeText(tActivity, "無法建立鏈接", Toast.LENGTH_SHORT).show();} catch (IOException e1) {Toast.makeText(tActivity, "無法建立鏈接", Toast.LENGTH_SHORT).show();}try {String line;while ((line = reader.readLine())!= null) {publishProgress(line);}} catch (IOException e) {e.printStackTrace();}return null;}@Overrideprotected void onProgressUpdate(String... values) {if (values[0].equals("@success")) {Toast.makeText(tActivity, "鏈接成功!", Toast.LENGTH_SHORT).show();send.setEnabled(true);}text.append("別人說:"+values[0]+"\n");super.onProgressUpdate(values);}};read.execute(); }public static void unconnect() {try {writer.close();reader.close();socket.close();send.setEnabled(false);connect.setChecked(false);} catch (IOException e) {e.printStackTrace();} }public static void send() {try {text.append("我說:"+editText.getText().toString()+"\n");writer.write(editText.getText().toString()+"\n");writer.flush();editText.setText("");} catch (IOException e) {e.printStackTrace();}} }

?

?

這個文件類,完成網絡的連接,斷開,發送等功能。

這里重點說明new socket這個函數的使用,也就是標題的崩潰問題原因。進過谷歌發現,要使用new socket這個函數,不能在主線程ui中使用,否則就會報錯崩潰,必須使用分線程來調用new socket函數進行網絡操作,上面用的是AsyncTask異步線程,當然其他線程也是可以的。

另外還有一個原因會導致崩潰,就是網絡權限,配置文件中一定要有這句<uses-permission android:name="android.permission.INTERNET"/>。

服務端我用的是Linux系統下的,源碼如下:

?

/* File Name: server.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<errno.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #define DEFAULT_PORT 2030 #define MAXLINE 4096 int main(int argc, char** argv) { int socket_fd, connect_fd; struct sockaddr_in servaddr; char buff[4096]; int n; //初始化Socket if( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){ printf("create socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } //初始化 memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY);//IP地址設置成INADDR_ANY,讓系統自動獲取本機的IP地址。 servaddr.sin_port = htons(DEFAULT_PORT);//設置的端口為DEFAULT_PORT //將本地地址綁定到所創建的套接字上 if( bind(socket_fd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){ printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } //開始監聽是否有客戶端連接 if( listen(socket_fd, 10) == -1){ printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno); exit(0); } printf("======waiting for client's request======\n"); while(1){ //阻塞直到有客戶端連接,不然多浪費CPU資源。 if( (connect_fd = accept(socket_fd, (struct sockaddr*)NULL, NULL)) == -1){ printf("accept socket error: %s(errno: %d)",strerror(errno),errno); continue; } //接受客戶端傳過來的數據 n = recv(connect_fd, buff, MAXLINE, 0); //向客戶端發送回應數據 if(!fork()){ /*紫禁城*/ if(send(connect_fd, "Hello,you are connected!\n", 26,0) == -1) perror("send error"); close(connect_fd); exit(0); } buff[n] = '\0'; printf("recv msg from client: %s\n", buff); close(connect_fd); } close(socket_fd); }


Makefile文件為:

?

?

?

?

關于Linux的socket,可以參考這里http://blog.csdn.net/hguisu/article/details/7445768。

?

?

總結

以上是生活随笔為你收集整理的Android socket 学习记录 之 执行new socket(ip, port)程序崩溃的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲精品v| 日韩欧美高清在线视频 | www国产视频 | 毛片福利视频 | 美女羞羞动态图 | 日日操夜夜骑 | 日韩av高清在线播放 | 性欧美17一18内谢 | 色眯眯影院 | 毛片免费播放 | 午夜在线观看视频18 | 亚色91| 香蕉视频在线看 | 特级毛片爽www免费版 | 女同动漫免费观看高清完整版在线观看 | 91区 | 中文字幕一区二区三区不卡 | 激情文学亚洲色图 | 性欧美大战久久久久久久久 | 黄色网在线看 | 国偷自产av一区二区三区 | 成人免费版欧美州 | 一区影视| 国产精品一二三四 | 国自产拍偷拍精品啪啪一区二区 | 日批视频在线看 | 国产乱淫a∨片免费视频 | 免费看污黄网站在线观看 | 毛片一级免费 | 521a人成v香蕉网站 | 夜夜天天拍拍 | 农村少妇 | 欧美成人亚洲 | 久久国产精品精品国产 | 成人av电影免费观看 | 成人短视频在线观看 | 美女免费看片 | 免费萌白酱国产一区二区三区 | 国产在线你懂得 | 成人欧美一区二区三区黑人一 | 国产经典久久 | 好吊妞一区二区三区 | 久久精品麻豆 | 亚洲+小说+欧美+激情+另类 | 李宗瑞91在线正在播放 | 艹男人的日日夜夜 | 婷婷超碰 | 北条麻妃青青久久 | 色av一区二区 | 精品成人一区二区 | 男人天堂1024 | 黄色片在线 | 亚洲精品一区二区三区新线路 | 永久精品| 亚洲成人久久久 | 奶妈的诱惑 | 美女av毛片 | 丝袜人妖 | 亚洲 欧美 日韩系列 | 日本wwwxxxx | 国产专区在线 | 黄色免费大片 | 欧美中文字幕在线观看 | 日韩中文欧美 | 国产一级片一区二区 | av黄在线 | 精品久久人人妻人人做人人 | 免费成人在线看 | 国内免费精品视频 | 免费禁漫天堂a3d | 青青国产精品视频 | 99精品欧美| 亚洲国产一区二区三区a毛片 | 爱福利视频广场 | 欧美一级二级在线观看 | 顶级嫩模啪啪呻吟不断好爽 | 亚洲男人天堂av | 亚洲av永久纯肉无码精品动漫 | 黑鬼巨鞭白妞冒白浆 | 99久久黄色| 91免费版在线 | 久久久激情网 | 99精品国产99久久久久久97 | 国产区一区二区 | 亚欧洲精品在线视频 | 黄色片免费播放 | 黄色aaa大片| 97涩涩网| 国产日韩精品在线观看 | 久久亚洲精品无码va白人极品 | 国产亚洲成av人片在线观看桃 | 玖玖色在线 | 久久久一二三四 | 日韩欧美国产一区二区三区在线观看 | 国产精品福利网站 | 久久新视频 | 男人天堂2014 | 国产精品乱码一区二区视频 | 超碰久草|