當前位置:首頁 » 安卓系統 » android開發socket

android開發socket

發布時間: 2022-07-24 21:52:23

⑴ 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開發中能直接用tcpsocket嗎

說法不準確:這兩種根本就不在網路同一層,http位於網路第五層對話層,socket位網路第四層tcp/udp層,http也是基於socket的。http的服務端就是IIS之類的。socket的伺服器的范圍就大了,你自已編好了。為什麼說是不準確呢:用socket通訊的有:http協議,ftp協議,smtp/pop3郵件協議,。。。。。。。。明白了不在同一層的含義了吧。

⑶ android 開發的socket程序的網路問題

1、用wlan的時候,你的手機與pc相同於同一個區域網,所以肯定能通信的。
2、手機用gprs後,由於是兩個不同的網路,而你的伺服器IP地址如果是接上路由(包括無線)的
上的,那麼你的IP不是對外的IP,只是對路由的IP,這只是一個不行的原因
3、你可以網路ip地址查詢,就可以看到你的真正的IP,即對外的IP,即便你用的是對外的IP,這里還是不得,原因是你這個IP的路由下可能還有其他機子,這種情況從外面連的通信就不知道要發往哪台伺服器
4、要解決這個問題,你可以嘗試下花生殼綁定你的主機,具體做法你可以網上搜索下。

歡迎有問題繼續提問,滿意請採納,謝謝!

⑷ Android Socket通信開發,求詳細過程,附加註釋,謝謝

服務端往Socket的輸出流裡面寫東西,客戶端就可以通過Socket的輸入流讀取對應的內容。Socket與Socket之間是雙向連通的,所以客戶端也可以往對應的Socket輸出流裡面寫東西,然後服務端對應的Socket的輸入流就可以讀出對應的內容。
Socket類型為流套接字(streamsocket)和數據報套接字(datagramsocket)。
Socket基本實現原理
TCP與UDP
1基於TCP協議的Socket
伺服器端首先聲明一個ServerSocket對象並且指定埠號,然後調用Serversocket的accept()方法接收客戶端的數據。accept()方法在沒有數據進行接收的處於堵塞狀態。(Socketsocket=serversocket.accept()),一旦接收到數據,通過inputstream讀取接收的數據。
客戶端創建一個Socket對象,指定伺服器端的ip地址和埠號(Socketsocket=newSocket("172.168.10.108",8080);),通過inputstream讀取數據,獲取伺服器發出的數據(OutputStreamoutputstream=socket.getOutputStream()),最後將要發送的數據寫入到outputstream即可進行TCP協議的socket數據傳輸。

⑸ 我在Android開發上,想要連接socket。報錯NetworkOnMainThread這么改

耗時的子程序不許放在主線程中,你得用線程運行它。
錯誤就是你的 網路操作在主線程中;

package com.Android.tcpchat;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
//import java.text.SimpleDateFormat;
//import java.util.Date;
import java.util.Vector;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {

//--------Socket服務端----------------------
TextView textView1;
ServerSocket serverSocket;
Handler sHandler;
Vector<Socket> vector; // 管理客戶
//--------Socket客戶端----------------------
TextView textView2;
EditText editText1;
Button button1;
Button button2;
Socket clientSocket;
Handler cHandler;
//--------Socket服務端----------------------
Handler timer_handler;
Runnable timer_runnable;
void initTimer() // 初始定時器
{
timer_handler=new Handler();
timer_runnable=new Runnable()
{
public void run()
{ //

timer_handler.postDelayed(this,1000); // this指runnable自已,再次啟動
}
};
}
void startTimer() // 啟動定時器
{
timer_handler.post(timer_runnable); // 立即執行runnable對象
}
void closeTimer() // 關閉定時器
{
timer_handler.removeCallbacks(timer_runnable);
}
//--------------------------------------------

void dispClients()
{ //顯示所有客戶
int n=vector.size();
String ss="\n"+n+" clients:\n";
for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
ss+=""+ip+","+port+"\n";
}
textView1.setText(ss);
}
void writeSocket(Socket sk,String s)
{ // 向客戶端Socket發字元串
DataOutputStream outf;
try
{
outf=new DataOutputStream(sk.getOutputStream());
if (!sk.isClosed())
outf.writeUTF(s);
}
catch(Exception e)
{

}
}
void writeSock(final Socket sk,final String s)
{ // 子線程中向客戶端Socket發字元串
new Thread(new Runnable()
{
@Override
public void run()
{
writeSocket(sk,s);
}
}).start();
}
void sendAll(final String s)
{ // 向所有管理中的客戶Socket發串

for (int i=0;i<vector.size();i++)
{
Socket sk=vector.get(i);
writeSock(sk,s);
}
}

void readSocket(Socket sk)
{ // 服務端讀Socket
DataInputStream inf;
try
{
inf=new DataInputStream(sk.getInputStream());
while(sk.isConnected() && !sk.isClosed())
{
String s=inf.readUTF();
if (s.length()>0)
{ // 讀到字元串後,通知主程序處理
String ip=sk.getInetAddress().toString();
String port=""+sk.getPort();
s=ip+","+port+":"+s+"\n";
Message msg=sHandler.obtainMessage(1,s);
sHandler.sendMessage(msg);
}
}
}
catch(Exception e)
{
}
}
void readSock(final Socket sk)
{ // 子線程中讀
new Thread(new Runnable()
{
@Override
public void run()
{
readSocket(sk);
}
}).start();
}

void listen(ServerSocket ssk) // 接受多個客戶端連接請求
{
while (!ssk.isClosed())
try
{
Socket sk=ssk.accept();
vector.add(sk); // 有客戶連接
readSock(sk);
// 通知刷新客戶列表
Message msg=sHandler.obtainMessage(0,"");
sHandler.sendMessage(msg);
}
catch(Exception e)
{
}
}
void listen() // 線程接受多個客戶端連接請求
{
new Thread(new Runnable()
{
@Override
public void run()
{
listen(serverSocket);
}
}).start();
}

//------------Socket客戶端----------------------
Socket newSocket(String ip,int port)
{
Socket sk=null;
try
{
sk=new Socket(ip,port);
}
catch(Exception e)
{

}
return(sk);
}
void clientRead(Socket sk)
{ // 客戶端讀Socket
DataInputStream inf;
try
{
inf=new DataInputStream(sk.getInputStream());
while(sk.isConnected() && !sk.isClosed())
{
String s=inf.readUTF();
if (s.length()>0)
{
Message msg=cHandler.obtainMessage(2,s);
cHandler.sendMessage(msg);
}
}
}
catch(Exception e)
{

}
}
void clientRead(final String ip,final int port)
{ // 子線程中客戶端讀Socket
new Thread(new Runnable()
{
@Override
public void run()
{
Socket sk=newSocket(ip,port);
clientSocket=sk;
if (sk!=null)
clientRead(sk);
}
}).start();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//---------------Socket服務端---------------------------------
textView1=(TextView)findViewById(R.id.textView1);
textView1.setText("");
//-----服務端的消息處理器sHandler
sHandler=new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case 0:
dispClients(); // list clients
break;
case 1:
String s=msg.obj.toString();
sendAll(s);
break;
}
}
};
vector=new Vector<Socket>();
try
{
serverSocket=new ServerSocket(9003);
listen();
}
catch(Exception e)
{
}
//---------Socket客戶端----------------------------------
cHandler=new Handler()
{ // 客戶端消息處理器
@Override
public void handleMessage(Message msg)
{
String s=msg.obj.toString();
textView2.append(s);
}
};
clientRead("127.0.0.1",9003);
clientRead("10.0.2.15",9003);

textView2=(TextView)findViewById(R.id.textView2);
textView2.setText("");
editText1=(EditText)findViewById(R.id.editText1);
button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
String s=editText1.getText().toString();
writeSock(clientSocket,s);
}
catch(Exception e)
{
}
} //public
});

button2=(Button)findViewById(R.id.button2);
button2.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
try
{
String s="中華人民共和國";
writeSock(clientSocket,s);
}
catch(Exception e)
{
}
} //public
});

}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{ // 按返回鍵的退出處理
if (keyCode == KeyEvent.KEYCODE_BACK )
{
try
{ // 防止出現埠已綁定的錯誤
serverSocket.close();
finish();
System.exit(0);
}
catch(Exception e)
{
}
}
return(false);
}

}

熱點內容
4位密碼組合有多少種至少有一個0 發布:2025-05-11 03:44:03 瀏覽:337
八卦手指演算法 發布:2025-05-11 03:23:32 瀏覽:280
編譯成exe是什麼意思 發布:2025-05-11 03:23:28 瀏覽:469
javaweb技術內幕 發布:2025-05-11 03:20:14 瀏覽:802
多台焊機變壓器怎麼配置 發布:2025-05-11 03:18:07 瀏覽:309
nmake編譯 發布:2025-05-11 03:04:32 瀏覽:621
房產證加密碼 發布:2025-05-11 02:49:17 瀏覽:340
伺服器少個陣列卡盤符怎麼找出來 發布:2025-05-11 02:34:07 瀏覽:635
鬥地主源碼開發 發布:2025-05-11 02:24:07 瀏覽:366
雲伺服器怎麼設置攻擊 發布:2025-05-11 02:22:09 瀏覽:826