日韩性视频-久久久蜜桃-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)程序崩溃的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 亚洲视频 欧美视频 | 亚洲另类在线观看 | 丰满熟妇人妻av无码区 | 91精品人妻互换一区二区 | 色婷久久 | 欧美aa一级 | 三级国产在线观看 | 日韩五码电影 | 深夜影院深a | 五月激情小说网 | 久久伊人免费 | 久久精品这里只有精品 | 天天艹 | 日韩伦理大全 | 无限国产资源 | 久久91亚洲人成电影网站 | 在线免费日本 | 日韩精品啪啪 | 女性向av免费网站 | 亚洲成年人网站在线观看 | 综合精品国产 | 国产一级网站 | 最近的中文字幕在线看视频 | 日本网站免费 | 中国爆后菊女人的视频 | 中文字幕精品视频在线 | 一级a毛片| wwwxxoo| 亚洲女同二女同志 | 国产乱码精品一区二区三区忘忧草 | 久久久精品久久久久久 | 91成人在线观看喷潮动漫 | 在线日韩免费 | 奇米精品一区二区三区四区 | 国产精品久久久久久久专区 | 亚洲成人av一区二区三区 | 潘金莲一级淫片aaaaa武则天 | 成人午夜在线 | 中文字幕少妇在线三级hd | 日韩黄色在线观看 | 午夜精品福利视频 | jizzjizzjizz亚洲女 | 欧美在线一二三四区 | 青青草日本 | 超碰导航 | 男人的天堂2019 | 亚洲h视频在线观看 | 欧美日韩一区在线观看 | 天堂影视av | 99精品视频免费观看 | 亚洲国产成人综合 | 火影黄动漫免费网站 | avwww. | 亚洲成人免费 | 日本黄色免费看 | 国产精品一线天粉嫩av | 神秘马戏团在线观看免费高清中文 | 久久99免费视频 | 国产黄色www| 制服丝袜一区在线 | 黄色录像三级 | 理论片午午伦夜理片影院99 | 日日狠狠久久 | 久久国产精品波多野结衣av | 国产精品久久久久久久久久 | 51ⅴ精品国产91久久久久久 | 精品无码人妻少妇久久久久久 | 天天想夜夜操 | 西西4444www大胆无视频 | 国产精品视频入口 | 91在线在线 | 中文字幕在线第一页 | 久一视频在线 | 黑巨茎大战欧美白妞 | 在线黄网站 | 91精彩视频在线观看 | 精品一区二区三区免费看 | 日本丰满少妇 | 色狠狠av老熟女 | 精品少妇一区二区三区免费观看 | 国产乱子轮xxx农村 岛国久久久 | 中文字幕一区二区久久人妻网站 | 成人免费无码大片a毛片 | 天天色影综合网 | 欧美高潮视频 | 美女靠逼app | 天天综合欧美 | 日韩在线观看视频一区 | 久久最新 | 国产伦精品一区二区三区视频免费 | 黄网站免费看 | 美日韩在线 | 亚洲AV无码国产日韩久久 | 欧美日韩三级在线观看 | 国产欧美日韩一区 | 我的公把我弄高潮了视频 | 午夜免费看片 | 超爽视频| 激情久久av一区av二区av三区 |