androidsocket連接
Ⅰ android studio連接io.socket:sokect.io-client伺服器的條件
條件是socket協議。
WebSocket是跟隨HTML5一同提出的,所以在兼容性上存在問題,這時一個非常好用的庫就登場了——Socket.io。
socket.io封裝了websocket,同時包含了其它的連接方式,你在任何瀏覽器里都可以使用socket.io來建立非同步的連接。socket.io包含了服務端和客戶端的庫,如果在瀏覽器中使用了socket.io的js,服務端也必須同樣適用。
socket.io是基於Websocket的Client-Server實時通信庫。
socket.io底層是基於engine.io這個庫。engine.io為socket.io提供跨瀏覽器/跨設備的雙向通信的底層庫。engine.io使用了Websocket和XHR方式封裝了一套socket協議。在低版本的瀏覽器中,不支持Websocket,為了兼容使用長輪詢(polling)替代。
Ⅱ 請問下,android能不能直接通過手機IP進行socket通信,不是局域.
可以的,只要通信的IP是通的就行了。
有兩種方案:
1、在PC機上建立伺服器,手機與手機之間的通信通過伺服器進行中轉
2、一部手機作為伺服器,另一部手機作為客戶端接入該手機
一般是第一種方案
1、pc端:
serverSocket=new ServerSocket(5648); //在5648埠進行偵聽
Socket sk = serverSocket.accept();//如果有接入,則創建對應的socket;
2、手機端:
socket=new Socket("tobacco5648.xicp.net",5648);//連接socket
3、消息輸入輸出:
pw=new PrintWriter(socket.getOutputStream()); //消息輸出
pw.println("發送消息");
pw.flush();
br=new BufferedReader(new InputStreamReader(socket.getInputStream())); //消息接收
while((str=br.readLine())!=null){
//接收消息
}
Ⅲ 自己寫了一個Android的APP,想用socket連接伺服器
最近我在在寫一個APP,用到了socket,在自己電腦上搭建的伺服器,具體過程: 用eclipse寫java代碼,創建一個serversocket,用來監聽客戶端的請求; 客戶端在發送數據前,首先創建一個Socket,然後直接請求伺服器即可。自己寫了一個Android的APP,想用socket連接伺服器
Ⅳ 求教android socket連接不成功如何彈出對話框提示不成功,代碼要如何寫
dialog.show要代碼私信
Dialog dialog;
dialog=new AlertDialog.Builder(activity).setTitle("請輸入設備號和密碼")
.setIcon(android.R.drawable.ic_menu_send)
.setView(layout)
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
}).create();
dialog.setCancelable(false);
dialog.setCanceledOnTouchOutside(false);
dialog.show();
Ⅳ 求教android socket連接不成功如何彈出對話框提示不成成,代碼要如何寫
1 用一個EditText作為用戶名輸入口,用一個按鍵確定。
2 注冊一個廣播接收器,專門接收由後來的聊天界面發過來的消息廣播(包括發信人,收信人,消息體)。
3 創建一個客戶端連接服務端的方法(要在線程中啟動該方法),連接成功並獲取輸入輸出流以後,再在裡面啟動一個輸入流管理線程(接受並處理由服務端發送過來的消息)。並通過intent啟動下一個好友列表界面(同時把自身用戶名發給下一界面)。
4 對於輸入流管理線程,要先判斷接收到的是好友名單還是聊天消息發送兩種廣播,(服務端發送兩種信息時可以加個標簽以便線程區分)。然後分發出兩種廣播,一種廣播後面的好友列表界面接受的在線好友名單,另一種廣播出聊天界面接收的聊天信息。
Ⅵ android socket有幾種方法
/***第一種:客戶端Socket通過構造方法連接伺服器***/
//客戶端Socket可以通過指定IP地址或域名兩種方式來連接伺服器端,實際最終都是通過IP地址來連接伺服器
//新建一個Socket,指定其IP地址及埠號
Socket socket = new Socket("192.168.0.7",80);
/***Socket 客戶端 一些常用設置***/
//客戶端socket在接收數據時,有兩種超時:1.連接伺服器超時,即連接超時;2.連接伺服器成功後,接收伺服器數據超時,即接收超時
//*設置socket 讀取數據流的超時時間
socket.setSoTimeout(5000);
//發送數據包,默認為false,即客戶端發送數據採用Nagle演算法;
//但是對於實時交互性高的程序,建議其改為true,即關閉Nagle演算法,客戶端每發送一次數據,無論數據包大小都會將這些數據發送出去
socket.setTcpNoDelay(true);
//設置客戶端socket關閉時,close()方法起作用時延遲1分鍾關閉,如果1分鍾內盡量將未發送的數據包發送出去
socket.setSoLinger(true, 60);
//設置輸出流的發送緩沖區大小,默認是8KB,即8096位元組
socket.setSendBufferSize(8096);
//設置輸入流的接收緩沖區大小,默認是8KB,即8096位元組
socket.setReceiveBufferSize(8096);
//作用:每隔一段時間檢查伺服器是否處於活動狀態,如果伺服器端長時間沒響應,自動關閉客戶端socket
//防止伺服器端無效時,客戶端長時間處於連接狀態
socket.setKeepAlive(true);
/*** Socket客戶端向伺服器端發送數據 ****/
//客戶端向伺服器端發送數據,獲取客戶端向伺服器端輸出流
OutputStream os = socket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(osw);
//代表可以立即向伺服器端發送單位元組數據
socket.setOOBInline(true);
//數據不經過輸出緩沖區,立即發送
socket.sendUrgentData(65);//"A"
//向伺服器端寫數據,寫入一個緩沖區
//註:此處字元串最後必須包含「\r\n\r\n」,告訴伺服器HTTP頭已經結束,可以處理數據,否則會造成下面的讀取數據出現阻塞
//在write()方法中可以定義規則,與後台匹配來識別相應的功能,例如登錄Login()方法,可以寫為write("Login|test,123 \r\n\r\n"),供後台識別;
bw.write("Login|test,123 \r\n\r\n");
//發送緩沖區中數據,必須有
bw.flush();
/*** Socket客戶端讀取伺服器端響應數據 ****/
//socket.isConnected代表是否連接成功過
if((socket.isConnected() == true) && (socket.isClosed() == false)){//判斷Socket是否處於連接狀態
//客戶端接收伺服器端的響應,讀取伺服器端向客戶端的輸入流
InputStream is = socket.getInputStream();
//緩沖區
byte[] buffer = new byte[is.available()];
//讀取緩沖區
is.read(buffer);
//轉換為字元串
String responseInfo = new String(buffer);
//日誌中輸出
Log.i("TEST", responseInfo);
} //關閉網路
socket.close();
/***第二種:通過connect方法連接伺服器***/
Socket socket_other = new Socket();
//使用默認的連接超時
socket_other.connect(new InetSocketAddress("192.168.0.7",80));
//連接超時2s
socket_other.connect(new InetSocketAddress("192.168.0.7",80),2000);
//關閉socket
socket_other.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Ⅶ android socket一直在鏈接 伺服器不響應
connect方法裡面:new Socket那會拋異常的。導致你上部分catch到異常。writer沒有被初始化。 接下來估計你直接使用了writer。導致了空指針異常。 所以關鍵是你的:new Socket這里。這個地方很用可能是服務端沒有打開,而導致的連接異常
Ⅷ android在線程中socket連接例子
package com.cpa.uri;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class ClientDemo {
public static void main(String[] args) throws IOException, Exception {
ClientDemo client=new ClientDemo();
client.open();
}
private void open() throws Exception, IOException{
Socket s=new Socket("localhost",8000);
InputStream in=s.getInputStream();
OutputStream out=s.getOutputStream();
new Reader(out).start();
new Write(in).start();
}
class Reader extends Thread{
OutputStream out;
public Reader(OutputStream out) {
this.out=out;
setDaemon(true);
}
@Override
public void run() {
try {
Scanner s=new Scanner(System.in);
while(true){
String str=s.nextLine();//讀取控制台
out.write(str.getBytes());//發送到伺服器
out.write('\n');
out.flush();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
super.run();
}
}
class Write extends Thread{
InputStream in;
public Write(InputStream in) {
this.in=in;
}
@Override
public void run() {
int b;
try {
while((b=in.read())!=-1){
System.out.println(b);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
**************************
package com.cpa.uri;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerDemo {
public static void main(String[] args) throws Exception {
ServerDemo server=new ServerDemo();
server.start();
}
private void start() throws Exception{
ServerSocket ss=new ServerSocket(8000);
while (true) {
System.out.println("等待客戶端連接!");
Socket s=ss.accept();
System.out.println("客戶端連接成功:"+s.getInetAddress());
//為這個客戶端創建一個服務線程
new Service(s).start();
}
}
class Service extends Thread{
Socket s;
public Service(Socket s){
this.s=s;
}
@Override
public void run() {
try {
InputStream in=s.getInputStream();
OutputStream out=s.getOutputStream();
//伺服器向客戶寫消息
out.write("說口令".getBytes());
out.flush();
Scanner s=new Scanner(in);
while(true){
String str=s.nextLine();
if (str.equals("A friend in need is a friend indeed")) {
out.write("回答正確".getBytes());
out.flush();
}else if (str.equals("ni是不是笨蛋")) {
out.write("是".getBytes());
out.flush();
break;
}else{
out.write("What do you say!".getBytes());
out.flush();
}
}
s.close();
} catch (Exception e) {
}
super.run();
}
}
}
************************
客戶端和伺服器端java代碼,自己改動下就可以變成android代碼了.
Ⅸ 如何干凈的實現Android/Java Socket 長連接通信
我們有時候有這種需求,即我們的android客戶端要始終保持與服務端的連接,當服務端有任務或消息發送到android客戶端的時候就發送,沒有任務或消息的時候不發送但要保持這個連接,一旦有任務則開發發送,而我們的android客戶端則要保持一個時刻接收任務或消息的狀態。。。這個時候我們通過socket來實現這種需求【當然你也可以採用http輪詢的方式來不斷的從客戶端個請求服務端,這樣做有一定的弊端】
實現原理:
1:android客戶端通過service在後台通過servreScoket不斷的accept,一旦有相應的socket到達,則啟動一個線程去處理
2::在線程中處理完返回給我們android客戶端的消息或任務之後,要將這種結果表現在ui上,這個步驟方法就比較多了,例如你可以發一個廣播來通知ui,或者你可以通過一個static的handler來處理
Ⅹ android如何與手機進行通信(Socket連接)
其實跟電腦差不多了,android里調用socket的方法,拿到socket後就可以發送數據並接收數據。
我最近正在做android方面的通信,真的想把完整的代碼都給你,可是沒辦法,公司機密。。
給你我的socket連接類吧。。。
package sean.socket;
///////////把MyType的一些方法替換成Writer的方法
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import sean.Sysout;
import sean.business.BusinessCenter;
import sean.business.LoginManager;
import sean.format.MyType;
import sean.io.Reader;
import sean.transfer.BytesBuffer;
import sean.transfer.DataCenter;
public class SocketThread implements Runnable {
String Server = "";
int Port = 0;
static Socket cs = null;
// Thread ioThread=null;
static boolean bool_SocketThread = false;
static OutputStream output = null;
public SocketThread(String server, int port) {
Server = server;
Port = port;
bool_SocketThread = true;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (bool_SocketThread) {
try {
// if (cs == null) {
DataCenter.setBool_Login(false);// 設置登錄失敗
Sysout.println("正在嘗試連接ClientSocket...", Sysout.TempOutDebug);
cs = new Socket(InetAddress.getByName(Server), Port);
if (cs != null) {
Sysout.println("ClientSocket連接成功!__" + cs,
Sysout.TempOutDebug);
cs.setKeepAlive(true);//讓socket保持活動狀態
InputStream input = cs.getInputStream();
output = cs.getOutputStream();
BusinessCenter.sendLoginData();
BytesBuffer bBuffer = new BytesBuffer();
byte[] Buffer = new byte[1024];
int ReadBytes = input.read(Buffer);
while (ReadBytes != -1) {
Sysout.println("已讀取" + ReadBytes + "個位元組到緩沖區",
Sysout.TempOutDebug);
byte[] b = new byte[ReadBytes];
b = MyType.BytesInsertToBytes(Buffer, b, 0);
Reader r = new Reader(b);
Sysout.println(r.toString() + "____ReadBytes=="
+ ReadBytes, Sysout.TempOutDebug);
bBuffer.InsertToBuffer(Buffer, ReadBytes);
ReadBytes = input.read(Buffer);
}
} else {
Sysout.printException("ClientSocket連接失敗!請確認網路正常且伺服器已開啟。");
}
// }
// 執行到這里說明inputstream.read()已中斷,說明socket已斷開連接
// cs=null;
LoginManager.setLoginValue(-1);// 業務中心登錄注銷,即登錄管理器注銷登錄
DataCenter.setBool_Login(false);// 數據中心登錄注銷
Sysout.printException(cs + "已斷開。");
Thread.sleep(2 * 1000);// 睡眠2秒後繼續循環
// try {
// // 判斷ClientSocket是否已斷開
// cs.sendUrgentData(0);
// } catch (IOException e) {
// // TODO Auto-generated catch block
// Sysout.printException("ClientSocket已斷開,重新連接。"+e);
// cs.close();
// cs = null;
// }
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread.java====解析伺服器名稱發生異常!" + e);
// e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread發生IO異常,異常消息:" + e);
try {
if (cs != null) {
Sysout.println("准備關閉" + cs, Sysout.TempOutDebug);
cs.shutdownOutput();
cs.shutdownInput();
cs.close();
cs = null;
output = null;
LoginManager.setLoginValue(-1);// 業務中心登錄注銷,即登錄管理器注銷登錄
DataCenter.setBool_Login(false);// 數據中心登錄注銷
Sysout.println(cs + "已關閉。", Sysout.TempOutDebug);
}
try {
Thread.sleep(5000);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread.java====線程睡眠異常!!"
+ e2);
// e2.printStackTrace();
}
String ExceptionInfos=e.toString();
if(ExceptionInfos.endsWith("Connection refused")){
stopSocketThread();
}
} catch (IOException e1) {
// TODO Auto-generated catch block
Sysout.printException(cs + "關閉發生異常::" + e1);
// e1.printStackTrace();
try {
Thread.sleep(5000);
} catch (InterruptedException e2) {
// TODO Auto-generated catch block
Sysout.printException("SocketThread.java====線程睡眠異常!!"
+ e2);
// e2.printStackTrace();
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}// while(bool_SocketThread)
Sysout.println("SocketThread已停止。", Sysout.TempOutDebug);
}
public static Socket getSocket() {
return cs;
}
// public void setBool(boolean bool0) {
// bool_SocketThread = bool0;
// }
public static OutputStream getOutputStream() {
return output;
}
public static void stopSocketThread() {
try {
// 停止SocketThread線程,必須先把循環的標志bool_SocketThread置為false,否則可能繼續循環,重新建立socket連接
bool_SocketThread = false;
// 關閉socket
if (cs != null) {
cs.shutdownOutput();
cs.shutdownInput();
cs.close();
cs = null;
output = null;
Sysout.println("ClientSocket已被強制關閉。");
// LoginManager.setLoginValue(-1);// 業務中心登錄注銷,即登錄管理器注銷登錄
// DataCenter.setBool_Login(false);// 數據中心登錄注銷
// byte[] lock=LoginActivity.getLock();
// synchronized(lock){
// lock.notify();
// }
}
} catch (IOException e) {
// TODO Auto-generated catch block
Sysout.printException("強制關閉" + cs + "發生異常::" + e);
// e.printStackTrace();
}
}
}
必須先在android里啟動一個服務,由服務去啟動這個socket線程,因為如果是UI去啟動的話,頁面會卡住。。。