この記事では、主にAndroid TCPソケット通信クライアント(クライアント)およびサーバー(サーバー)デモ(ソースコード付き)の実装について説明します。BufferedReaderのreadLine()メソッドに注意してください[((line = br.readLine())!= null)]ブロッキングの問題、およびドッキングハードウェアのプロジェクトデータの16進数の&& byte && intでの変換処理。
タイハン
最近、TCPソケット通信を使用する必要があり、大きな落とし穴に遭遇したプロジェクトがあったので、このデモを作成しました。
ソケット入力ストリームを読み取る場合、多くのコードがこのように記述され、通常は問題ありませんが、readLine()メソッドは、改行とキャリッジリターンを読み取れない場合にブロックします。
String line = null;
while((line = br.readLine())!= null){
}
readLine()はブロッキング関数ですが、改行またはキャリッジリターン( ' \ n '、' \ r 'は16進数に対応します0D0A)が返され、一部のモジュールはこれら2つのターミネータなしでデータを返すため、ブロッキングが発生し、プログラムを続行できません。この場合、モジュール側がターミネータを変更して追加することをいとわないのであれば、問題はありません。モジュールの変更が不便な場合、この方法は使用できず、書き込み方法を変更する必要があります。
デバッグツール
リアルタイムのデバッグには、TCPデバッグアシスタントやTCPテストツールなどのPC側のツールを使用できます。ユーザーが多く、操作もばかげています。IPとポートを入力してから、確立または接続します。 。
デモのデモンストレーションと実装
ナンセンスな話をやめて、今日のトピックに直接進んでください。AndroidでTCP / IPプロトコルを使用して、Socketを使用してサーバーと通信する方法を見てみましょう。
1.許可
<uses-permission android:name="android.permission.INTERNET"/>
第二に、サーバーの実装は、簡単に言えば、3つのステップが必要です
1. ServerSocketを作成し、ポートを監視して、クライアントSocketが接続するのを待ちます。2。Socketから
クライアントからメッセージを取得します
。3。Socketを介してクライアントにメッセージを送信します。
コアコードは次のとおりです
class ServerSocketThread extends Thread {
@Override
public void run() {
try {
// 创建ServerSocket
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("--开启服务器,监听端口 9999--");
// 监听端口,等待客户端连接
while (true) {
System.out.println("--等待客户端连接--");
Socket socket = serverSocket.accept(); //等待客户端连接
System.out.println("得到客户端连接:" + socket);
startReader(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 从参数的Socket里获取消息
*/
private static void startReader(final Socket mSocket) {
new Thread(){
@Override
public void run() {
try {
// 获取读取流
BufferedReader in = new BufferedReader(new InputStreamReader(mSocket.getInputStream(),"utf-8"))
String line="";
while ((line = in.readLine()) != null) {// 读取数据
System.out.println("*等待客户端输入*");
System.out.println("获取到客户端的信息:" + line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
//通过socket来给客户端发送消息
private void serverSendMessage(String mServerSendMessage) {
new Thread() {
@Override
public void run() {
PrintWriter out;
try {
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream())), true);
out.println(mServerSendMessage);
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
サーバー側のプロセスと同様の3つのクライアント側の実装
1.サーバーとのソケット接続を確立します
2.入力ストリームと出力ストリームを取得します
3.メッセージを受信/送信します
//与服务器建立连接
Socket mClientSocket = new Socket(mClientIp, mClientPort);
//从socket获取输入输出流
BufferedReader mClientIn = new BufferedReader(new InputStreamReader(mClientSocket.getInputStream()));
PrintWriter mClientOut = new PrintWriter(new BufferedWriter(new OutputStreamWriter(mClientSocket.getOutputStream())), true);
//监听服务端下发的消息
String clientReceiverMessage;
if ((clientReceiverMessage = mClientIn.readLine()) != null) {
if (mOnConnectListener != null) {
mOnConnectListener.onMessage(clientReceiverMessage);
}
}
//给服务端发消息
mClientOut.println(mClientSendMessage);
コードパッケージリスナーインターフェイス
実際の開発プロセスでは、通常、ソケットをカプセル化してから、外部でリスナーインターフェイスを設定し、他のモジュールでビジネスロジックを処理します。また、複数のソケット接続と通信を処理する必要があるものもあります。
サーバー側のコード実装例
public class TcpServer {
private static final String TAG = "TcpServer";
private static TcpServer mTcpServer = new TcpServer();
private OnListener mOnListener;
private ServerSocketThread mServerSocketThread;
public static TcpServer getInstance() {
return mTcpServer;
}
public void setOnListener(OnListener onListener) {
mOnListener = onListener;
}
public interface OnListener {
void onStart();
void onNewClient(String serverIp, String clientIp, int count);
void onError(Throwable e, String message);
void onMessage(String ip, String message);
void onAutoReplyMessage(String ip, String message);
void onClientDisConnect(String ip);
void onConnectTimeOut(String ip);
}
public void setPort(int port) {
mServerPort = port;
}
………………………………
………………………………
………………………………
}
16進数の送受信処理
ドッキングハードウェアプロジェクトの通信プロトコルは16進数を使用する可能性があるため、データは文字列\ byte \ int 16進数に変換する必要がありますが、通信部分の本質は同じで、コードは次のとおりです。
//十六进制 发送
try {
//byte[] msg = {(byte) 0xaa,(byte) 0xbb,(byte) 0x0d,(byte) 0x0a};
byte[] msg = IntByteStringHexUtil.hexStrToByteArray("AABB0D0A");
OutputStream socketWriter = socket.getOutputStream();
socketWriter.write(msg);
} catch (IOException e) {
e.printStackTrace();
}
//十六进制 接收
InputStream socketReader = socket.getInputStream();
byte buf[] = new byte[1024];
int len = socketReader.read(buf);
byte data[] = new byte[len];
System.arraycopy(buf, 0, data, 0, len);
logClient(len+","+IntByteStringHexUtil.byteArrayToHexStr(data));
デモソースのダウンロードアドレス
ソースコードもCSDNに配置されており、必要に応じてCSDNから学ぶことができます。